From 8f092c1dc19ea75df4f9f0895ec22923dafad95b Mon Sep 17 00:00:00 2001 From: ludamad Date: Mon, 16 Oct 2023 19:44:42 +0000 Subject: [PATCH 1/6] feat: merge msgpack master --- .../msgpack_impl/struct_map_impl.hpp | 1 + .../serialize/msgpack_impl/variant_impl.hpp | 16 - barretenberg/cpp/src/msgpack-c/.clang-format | 2 - .../cpp/src/msgpack-c/.github/depends/zlib.sh | 6 +- .../msgpack-c/.github/workflows/coverage.yml | 1 + .../src/msgpack-c/.github/workflows/gha.yml | 1 + barretenberg/cpp/src/msgpack-c/.gitignore | 5 + barretenberg/cpp/src/msgpack-c/CHANGELOG.md | 6 + barretenberg/cpp/src/msgpack-c/CMakeLists.txt | 25 +- barretenberg/cpp/src/msgpack-c/Files.cmake | 2 + barretenberg/cpp/src/msgpack-c/README.md | 2 +- barretenberg/cpp/src/msgpack-c/appveyor.yml | 16 +- .../cpp/src/msgpack-c/ci/build_cmake.sh | 1 + .../src/msgpack-c/erb/v1/cpp03_zone.hpp.erb | 255 +- .../msgpack-c/example/boost/CMakeLists.txt | 3 +- .../src/msgpack-c/example/x3/CMakeLists.txt | 3 +- .../cpp/src/msgpack-c/fuzz/CMakeLists.txt | 3 +- .../include/msgpack/adaptor/cpp17/variant.hpp | 16 + .../src/msgpack-c/include/msgpack/assert.hpp | 2 +- .../src/msgpack-c/include/msgpack/type.hpp | 18 +- .../v1/adaptor/boost/msgpack_variant.hpp | 712 ++--- .../msgpack/v1/adaptor/cpp11/chrono.hpp | 482 +-- .../msgpack/v1/adaptor/cpp17/variant.hpp | 119 + .../include/msgpack/v1/detail/cpp03_zone.hpp | 1345 ++++---- .../include/msgpack/v1/detail/cpp11_zone.hpp | 560 ++-- .../include/msgpack/v1/object_fwd.hpp | 378 ++- .../src/msgpack-c/include/msgpack/v1/pack.hpp | 2714 ++++++++--------- .../include/msgpack/v2/object_fwd.hpp | 143 +- .../include/msgpack/v3/object_fwd.hpp | 62 +- .../include/msgpack/version_master.hpp | 4 +- barretenberg/cpp/src/msgpack-c/preprocess.rb | 17 + .../cpp/src/msgpack-c/test/CMakeLists.txt | 3 +- .../cpp/src/msgpack-c/test/boost_variant.cpp | 202 +- .../cpp/src/msgpack-c/test/msgpack_cpp11.cpp | 787 ++--- .../cpp/src/msgpack-c/test/msgpack_cpp17.cpp | 148 +- 35 files changed, 4166 insertions(+), 3894 deletions(-) delete mode 100644 barretenberg/cpp/src/barretenberg/serialize/msgpack_impl/variant_impl.hpp delete mode 100644 barretenberg/cpp/src/msgpack-c/.clang-format create mode 100644 barretenberg/cpp/src/msgpack-c/include/msgpack/adaptor/cpp17/variant.hpp create mode 100644 barretenberg/cpp/src/msgpack-c/include/msgpack/v1/adaptor/cpp17/variant.hpp create mode 100644 barretenberg/cpp/src/msgpack-c/preprocess.rb diff --git a/barretenberg/cpp/src/barretenberg/serialize/msgpack_impl/struct_map_impl.hpp b/barretenberg/cpp/src/barretenberg/serialize/msgpack_impl/struct_map_impl.hpp index cd2d7c5c348..1c4ac87b03c 100644 --- a/barretenberg/cpp/src/barretenberg/serialize/msgpack_impl/struct_map_impl.hpp +++ b/barretenberg/cpp/src/barretenberg/serialize/msgpack_impl/struct_map_impl.hpp @@ -6,6 +6,7 @@ #include #include #define MSGPACK_NO_BOOST +#define MSGPACK_USE_STD_VARIANT_ADAPTOR #include "concepts.hpp" #include "drop_keys.hpp" #include diff --git a/barretenberg/cpp/src/barretenberg/serialize/msgpack_impl/variant_impl.hpp b/barretenberg/cpp/src/barretenberg/serialize/msgpack_impl/variant_impl.hpp deleted file mode 100644 index 8b5d466b537..00000000000 --- a/barretenberg/cpp/src/barretenberg/serialize/msgpack_impl/variant_impl.hpp +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once -// Note: Meant to only be included in compilation units that need msgpack -#define MSGPACK_NO_BOOST -#include -#include - -namespace msgpack::adaptor { -// writes std::variant to msgpack format (TODO should we read std::variant?) -template struct pack> { - auto& operator()(auto& o, std::variant const& variant) const - { - std::visit([&o](const auto& arg) { o.pack(arg); }, variant); - return o; - } -}; -} // namespace msgpack::adaptor diff --git a/barretenberg/cpp/src/msgpack-c/.clang-format b/barretenberg/cpp/src/msgpack-c/.clang-format deleted file mode 100644 index a43d914ec38..00000000000 --- a/barretenberg/cpp/src/msgpack-c/.clang-format +++ /dev/null @@ -1,2 +0,0 @@ -DisableFormat: true -SortIncludes: false \ No newline at end of file diff --git a/barretenberg/cpp/src/msgpack-c/.github/depends/zlib.sh b/barretenberg/cpp/src/msgpack-c/.github/depends/zlib.sh index fce05159c70..3c2c8b25989 100755 --- a/barretenberg/cpp/src/msgpack-c/.github/depends/zlib.sh +++ b/barretenberg/cpp/src/msgpack-c/.github/depends/zlib.sh @@ -27,9 +27,9 @@ while getopts "b:t:p:" c; do done mkdir $prefix || exit 1 -wget https://zlib.net/zlib-1.2.13.tar.gz || exit 1 -tar -xf zlib-1.2.13.tar.gz || exit 1 -cd zlib-1.2.13 +wget https://zlib.net/zlib-1.3.tar.gz || exit 1 +tar -xf zlib-1.3.tar.gz || exit 1 +cd zlib-1.3 build() { diff --git a/barretenberg/cpp/src/msgpack-c/.github/workflows/coverage.yml b/barretenberg/cpp/src/msgpack-c/.github/workflows/coverage.yml index 8c3bf1eda1f..e286d279d72 100644 --- a/barretenberg/cpp/src/msgpack-c/.github/workflows/coverage.yml +++ b/barretenberg/cpp/src/msgpack-c/.github/workflows/coverage.yml @@ -56,6 +56,7 @@ jobs: -D MSGPACK_BUILD_TESTS=ON \ -D CMAKE_BUILD_TYPE=Debug \ -D MSGPACK_GEN_COVERAGE=ON \ + -D MSGPACK_USE_STD_VARIANT_ADAPTOR=ON \ -D CMAKE_PREFIX_PATH="$HOME/zlib-prefix/64;$HOME/boost-prefix/64" \ -B build \ -S . || exit 1 diff --git a/barretenberg/cpp/src/msgpack-c/.github/workflows/gha.yml b/barretenberg/cpp/src/msgpack-c/.github/workflows/gha.yml index 1fbb5ebc593..29fd31bf8e9 100644 --- a/barretenberg/cpp/src/msgpack-c/.github/workflows/gha.yml +++ b/barretenberg/cpp/src/msgpack-c/.github/workflows/gha.yml @@ -145,6 +145,7 @@ jobs: 3) export CXX="g++-10" export MSGPACK_CXX_VERSION="MSGPACK_CXX17=ON" + export MSGPACK_USE_STD_VARIANT_ADAPTOR="MSGPACK_USE_STD_VARIANT_ADAPTOR=ON" ;; 4) export CXX="clang++-10" diff --git a/barretenberg/cpp/src/msgpack-c/.gitignore b/barretenberg/cpp/src/msgpack-c/.gitignore index 40f5e0af3be..7b96d6dfc33 100644 --- a/barretenberg/cpp/src/msgpack-c/.gitignore +++ b/barretenberg/cpp/src/msgpack-c/.gitignore @@ -49,3 +49,8 @@ Makefile /test/streaming_c /test/version /test/zone + +build +*-build +.cache +compile_commands.json diff --git a/barretenberg/cpp/src/msgpack-c/CHANGELOG.md b/barretenberg/cpp/src/msgpack-c/CHANGELOG.md index f29bffe8ad9..73199b017cc 100644 --- a/barretenberg/cpp/src/msgpack-c/CHANGELOG.md +++ b/barretenberg/cpp/src/msgpack-c/CHANGELOG.md @@ -1,3 +1,9 @@ +# 2023-07-08 version 6.1.0 + * Remove dependency on boost in chrono.hpp (#1076) + * Add support for std::variant behavior (#1075) + * Fix msgpack::type::variant behavior to respect MessagePack format (#1071) + * Add rebind allocators (#1065) + # 2023-03-02 version 6.0.0 ## << breaking changes >> * Change CMake package name of C++ library to msgpack-cxx (#1054) diff --git a/barretenberg/cpp/src/msgpack-c/CMakeLists.txt b/barretenberg/cpp/src/msgpack-c/CMakeLists.txt index d44df4e21cf..8dc6d610abe 100644 --- a/barretenberg/cpp/src/msgpack-c/CMakeLists.txt +++ b/barretenberg/cpp/src/msgpack-c/CMakeLists.txt @@ -23,16 +23,17 @@ OPTION (MSGPACK_CXX14 "Using c++14 compiler" OFF) OPTION (MSGPACK_CXX17 "Using c++17 compiler" OFF) OPTION (MSGPACK_CXX20 "Using c++20 compiler" OFF) -OPTION (MSGPACK_32BIT "32bit compile" OFF) -OPTION (MSGPACK_USE_BOOST "Use Boost libraried" ON) -OPTION (MSGPACK_USE_X3_PARSE "Use Boost X3 parse" OFF) -OPTION (MSGPACK_BUILD_TESTS "Build tests" OFF) -OPTION (MSGPACK_BUILD_DOCS "Build Doxygen documentation" ON) -OPTION (MSGPACK_FUZZ_REGRESSION "Enable regression testing" OFF) -OPTION (MSGPACK_BUILD_EXAMPLES "Build msgpack examples" OFF) -OPTION (MSGPACK_GEN_COVERAGE "Generate coverage report" OFF) -OPTION (MSGPACK_USE_STATIC_BOOST "Statically link with boost libraries" OFF) -OPTION (MSGPACK_CHAR_SIGN "Char sign to use (signed or unsigned)") +OPTION (MSGPACK_32BIT "32bit compile" OFF) +OPTION (MSGPACK_USE_BOOST "Use Boost libraried" ON) +OPTION (MSGPACK_USE_X3_PARSE "Use Boost X3 parse" OFF) +OPTION (MSGPACK_BUILD_TESTS "Build tests" OFF) +OPTION (MSGPACK_BUILD_DOCS "Build Doxygen documentation" ON) +OPTION (MSGPACK_FUZZ_REGRESSION "Enable regression testing" OFF) +OPTION (MSGPACK_BUILD_EXAMPLES "Build msgpack examples" OFF) +OPTION (MSGPACK_GEN_COVERAGE "Generate coverage report" OFF) +OPTION (MSGPACK_USE_STATIC_BOOST "Statically link with boost libraries" OFF) +OPTION (MSGPACK_CHAR_SIGN "Char sign to use (signed or unsigned)") +OPTION (MSGPACK_USE_STD_VARIANT_ADAPTOR "Enable the adaptor for std::variant" OFF) SET (CMAKE_CXX_STANDARD_REQUIRED ON) @@ -92,6 +93,10 @@ ELSE () TARGET_COMPILE_DEFINITIONS(msgpack-cxx INTERFACE MSGPACK_DEFAULT_API_VERSION=3) ENDIF () +IF (MSGPACK_USE_STD_VARIANT_ADAPTOR) + TARGET_COMPILE_DEFINITIONS(msgpack-cxx INTERFACE MSGPACK_USE_STD_VARIANT_ADAPTOR) +ENDIF () + IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") IF (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.1) INCLUDE (CheckCXXSourceCompiles) diff --git a/barretenberg/cpp/src/msgpack-c/Files.cmake b/barretenberg/cpp/src/msgpack-c/Files.cmake index 5cdf80afd86..721a31fbf50 100644 --- a/barretenberg/cpp/src/msgpack-c/Files.cmake +++ b/barretenberg/cpp/src/msgpack-c/Files.cmake @@ -33,6 +33,7 @@ SET (msgpack-cxx_HEADERS include/msgpack/adaptor/cpp17/carray_byte.hpp include/msgpack/adaptor/cpp17/optional.hpp include/msgpack/adaptor/cpp17/string_view.hpp + include/msgpack/adaptor/cpp17/variant.hpp include/msgpack/adaptor/cpp17/vector_byte.hpp include/msgpack/adaptor/cpp20/span.hpp include/msgpack/adaptor/define.hpp @@ -542,6 +543,7 @@ SET (msgpack-cxx_HEADERS include/msgpack/v1/adaptor/cpp17/carray_byte.hpp include/msgpack/v1/adaptor/cpp17/optional.hpp include/msgpack/v1/adaptor/cpp17/string_view.hpp + include/msgpack/v1/adaptor/cpp17/variant.hpp include/msgpack/v1/adaptor/cpp17/vector_byte.hpp include/msgpack/v1/adaptor/cpp20/span.hpp include/msgpack/v1/adaptor/define.hpp diff --git a/barretenberg/cpp/src/msgpack-c/README.md b/barretenberg/cpp/src/msgpack-c/README.md index 9f6a459b631..cf578c5409d 100644 --- a/barretenberg/cpp/src/msgpack-c/README.md +++ b/barretenberg/cpp/src/msgpack-c/README.md @@ -1,7 +1,7 @@ `msgpack` for C++ =================== -Version 6.0.0 [![Build Status](https://github.com/msgpack/msgpack-c/workflows/CI/badge.svg?branch=cpp_master)](https://github.com/msgpack/msgpack-c/actions) [![Build status](https://ci.appveyor.com/api/projects/status/8kstcgt79qj123mw/branch/cpp_master?svg=true)](https://ci.appveyor.com/project/redboltz/msgpack-c/branch/cpp_master) +Version 6.1.0 [![Build Status](https://github.com/msgpack/msgpack-c/workflows/CI/badge.svg?branch=cpp_master)](https://github.com/msgpack/msgpack-c/actions) [![Build status](https://ci.appveyor.com/api/projects/status/8kstcgt79qj123mw/branch/cpp_master?svg=true)](https://ci.appveyor.com/project/redboltz/msgpack-c/branch/cpp_master) [![codecov](https://codecov.io/gh/msgpack/msgpack-c/branch/cpp_master/graph/badge.svg)](https://codecov.io/gh/msgpack/msgpack-c/branch/cpp_master) It's like JSON but smaller and faster. diff --git a/barretenberg/cpp/src/msgpack-c/appveyor.yml b/barretenberg/cpp/src/msgpack-c/appveyor.yml index 4218f3a3d91..6f5034b8c0e 100644 --- a/barretenberg/cpp/src/msgpack-c/appveyor.yml +++ b/barretenberg/cpp/src/msgpack-c/appveyor.yml @@ -1,4 +1,4 @@ -version: 6.0.0.{build} +version: 6.1.0.{build} branches: only: @@ -23,10 +23,10 @@ environment: boost_subdir: lib32-msvc-14.0 build_script: - ps: | - appveyor DownloadFile http://zlib.net/zlib-1.2.13.tar.gz -FileName zlib-1.2.13.tar.gz - 7z x zlib-1.2.13.tar.gz 2> $null - 7z x zlib-1.2.13.tar 2> $null - cd zlib-1.2.13 + appveyor DownloadFile http://zlib.net/zlib-1.3.tar.gz -FileName zlib-1.3.tar.gz + 7z x zlib-1.3.tar.gz 2> $null + 7z x zlib-1.3.tar 2> $null + cd zlib-1.3 md build md prefix @@ -34,7 +34,7 @@ build_script: cmake ` -G $env:msvc ` - -D CMAKE_INSTALL_PREFIX="$env:APPVEYOR_BUILD_FOLDER\zlib-1.2.13\prefix" ` + -D CMAKE_INSTALL_PREFIX="$env:APPVEYOR_BUILD_FOLDER\zlib-1.3\prefix" ` .. if ($LastExitCode -ne 0) { exit $LastExitCode } @@ -52,7 +52,7 @@ build_script: -D MSGPACK_BUILD_EXAMPLES=ON ` -D MSGPACK_BUILD_TESTS=ON ` -D CMAKE_EXE_LINKER_FLAGS=/LIBPATH:"$env:boost_prefix\$env:boost_subdir" ` - -D CMAKE_PREFIX_PATH="$env:boost_prefix;$env:APPVEYOR_BUILD_FOLDER\zlib-1.2.13\prefix" ` + -D CMAKE_PREFIX_PATH="$env:boost_prefix;$env:APPVEYOR_BUILD_FOLDER\zlib-1.3\prefix" ` -D CMAKE_INSTALL_PREFIX="$env:APPVEYOR_BUILD_FOLDER\prefix" ` -D CMAKE_CXX_FLAGS="/D_VARIADIC_MAX=10 /EHsc /DBOOST_ALL_DYN_LINK" ` .. @@ -62,5 +62,5 @@ build_script: if ($LastExitCode -ne 0) { exit $LastExitCode } test_script: -- set PATH=%PATH%;%APPVEYOR_BUILD_FOLDER%\zlib-1.2.13\build\Release;%APPVEYOR_BUILD_FOLDER%\build\release;%boost_prefix%\%boost_subdir% +- set PATH=%PATH%;%APPVEYOR_BUILD_FOLDER%\zlib-1.3\build\Release;%APPVEYOR_BUILD_FOLDER%\build\release;%boost_prefix%\%boost_subdir% - ctest -VV -C Release diff --git a/barretenberg/cpp/src/msgpack-c/ci/build_cmake.sh b/barretenberg/cpp/src/msgpack-c/ci/build_cmake.sh index a89c44641f1..b6ad78c50a2 100755 --- a/barretenberg/cpp/src/msgpack-c/ci/build_cmake.sh +++ b/barretenberg/cpp/src/msgpack-c/ci/build_cmake.sh @@ -21,6 +21,7 @@ cmake \ -D MSGPACK_CHAR_SIGN=${CHAR_SIGN} \ -D MSGPACK_DEFAULT_API_VERSION=${API_VERSION} \ -D MSGPACK_USE_X3_PARSE=${X3_PARSE} \ + -D MSGPACK_USE_STD_VARIANT_ADAPTOR=${STD_VARIANT_ADAPTOR} \ -D CMAKE_CXX_FLAGS="${CXXFLAGS} ${ARCH_FLAG}" \ -D CMAKE_INSTALL_PREFIX=$prefix_dir \ -B $build_dir \ diff --git a/barretenberg/cpp/src/msgpack-c/erb/v1/cpp03_zone.hpp.erb b/barretenberg/cpp/src/msgpack-c/erb/v1/cpp03_zone.hpp.erb index 1081f72457f..86bc8328631 100644 --- a/barretenberg/cpp/src/msgpack-c/erb/v1/cpp03_zone.hpp.erb +++ b/barretenberg/cpp/src/msgpack-c/erb/v1/cpp03_zone.hpp.erb @@ -29,121 +29,101 @@ MSGPACK_API_VERSION_NAMESPACE(v1) { class zone { struct finalizer { - finalizer(void (*func)(void*), void* data):m_func(func), m_data(data) {} + finalizer(void (*func)(void*), void* data, finalizer* next): m_func(func), m_data(data), m_next(next) {} void operator()() { m_func(m_data); } void (*m_func)(void*); void* m_data; + finalizer* m_next; }; + struct finalizer_array { - finalizer_array():m_tail(MSGPACK_NULLPTR), m_end(MSGPACK_NULLPTR), m_array(MSGPACK_NULLPTR) {} - void call() { - finalizer* fin = m_tail; - for(; fin != m_array; --fin) (*(fin-1))(); - } + finalizer_array(): m_head(MSGPACK_NULLPTR) {} + ~finalizer_array() { - call(); - ::free(m_array); - } - void clear() { - call(); - m_tail = m_array; + clear(); } - void push(void (*func)(void* data), void* data) - { - finalizer* fin = m_tail; - if(fin == m_end) { - push_expand(func, data); - return; + void clear() { + finalizer* fin = m_head; + finalizer* tmp = MSGPACK_NULLPTR; + while(fin) { + (*fin)(); + tmp = fin; + fin = fin->m_next; + delete tmp; } + m_head = MSGPACK_NULLPTR; + } - fin->m_func = func; - fin->m_data = data; - - ++m_tail; + void push(void (*func)(void* data), void* data) { + m_head = new finalizer(func, data, m_head); } - void push_expand(void (*func)(void*), void* data) { - const size_t nused = static_cast(m_end - m_array); - size_t nnext; - if(nused == 0) { - nnext = (sizeof(finalizer) < 72/2) ? - 72 / sizeof(finalizer) : 8; - } else { - nnext = nused * 2; - } - finalizer* tmp = - static_cast(::realloc(m_array, sizeof(finalizer) * nnext)); - if(!tmp) { - throw std::bad_alloc(); - } - m_array = tmp; - m_end = tmp + nnext; - m_tail = tmp + nused; - new (m_tail) finalizer(func, data); - ++m_tail; + void pop() { + finalizer* n = m_head->m_next; + delete m_head; + m_head = n; } - finalizer* m_tail; - finalizer* m_end; - finalizer* m_array; + + finalizer* m_head; + private: + finalizer_array(const finalizer_array&); + finalizer_array& operator=(const finalizer_array&); }; + struct chunk { chunk* m_next; }; - struct chunk_list { - chunk_list(size_t chunk_size) - { - chunk* c = static_cast(::malloc(sizeof(chunk) + chunk_size)); - if(!c) { - throw std::bad_alloc(); - } - m_head = c; - m_free = chunk_size; - m_ptr = reinterpret_cast(c) + sizeof(chunk); - c->m_next = MSGPACK_NULLPTR; - } - ~chunk_list() - { + struct chunk_list { + chunk_list(size_t chunk_size, char* ptr): m_free(chunk_size), m_ptr(ptr), m_head(MSGPACK_NULLPTR) {} + ~chunk_list() { chunk* c = m_head; while(c) { chunk* n = c->m_next; ::free(c); c = n; } + m_head = MSGPACK_NULLPTR; } - void clear(size_t chunk_size) - { + + void clear(size_t chunk_size, char* ptr) { chunk* c = m_head; - while(true) { + while(c) { chunk* n = c->m_next; - if(n) { - ::free(c); - c = n; - } else { - m_head = c; - break; - } + ::free(c); + c = n; } - m_head->m_next = MSGPACK_NULLPTR; + m_head = MSGPACK_NULLPTR; m_free = chunk_size; - m_ptr = reinterpret_cast(m_head) + sizeof(chunk); + m_ptr = ptr; } + size_t m_free; char* m_ptr; chunk* m_head; + + private: + chunk_list(const chunk_list&); + chunk_list& operator=(const chunk_list&); }; + size_t m_chunk_size; - chunk_list m_chunk_list; + chunk_list* m_chunk_list; finalizer_array m_finalizer_array; public: zone(size_t chunk_size = MSGPACK_ZONE_CHUNK_SIZE); + ~zone(); -public: void* allocate_align(size_t size, size_t align = MSGPACK_ZONE_ALIGN); + void* allocate_no_align(size_t size); + bool allocated() { + return m_chunk_list != MSGPACK_NULLPTR; + } + void push_finalizer(void (*func)(void*), void* data); template @@ -152,24 +132,23 @@ public: void clear(); void swap(zone& o); - static void* operator new(std::size_t size) - { + + static void* operator new(std::size_t size) { void* p = ::malloc(size); if (!p) throw std::bad_alloc(); return p; } - static void operator delete(void *p) /* throw() */ - { + + static void operator delete(void *p) /* throw() */ { ::free(p); } - static void* operator new(std::size_t size, void* place) /* throw() */ - { - return ::operator new(size, place); - } - static void operator delete(void* p, void* place) /* throw() */ - { - ::operator delete(p, place); + + static void* operator new(std::size_t /*size*/, void* mem) /* throw() */ { + return mem; } + + static void operator delete(void * /*p*/, void* /*mem*/) /* throw() */ {} + /// @cond <%0.upto(GENERATION_LIMIT) {|i|%> template , typename A<%=j%><%}%>> @@ -188,18 +167,26 @@ private: static char* get_aligned(char* ptr, size_t align); + chunk_list& get_chank_lst(); + char* allocate_expand(size_t size); private: zone(const zone&); zone& operator=(const zone&); }; -inline zone::zone(size_t chunk_size):m_chunk_size(chunk_size), m_chunk_list(m_chunk_size) -{ +inline zone::zone(size_t chunk_size):m_chunk_size(chunk_size), m_chunk_list(MSGPACK_NULLPTR) {} + +inline zone::~zone() { + m_finalizer_array.~finalizer_array(); + if(m_chunk_list) { + m_chunk_list->~chunk_list(); + ::free(m_chunk_list); + m_chunk_list = MSGPACK_NULLPTR; + } } -inline char* zone::get_aligned(char* ptr, size_t align) -{ +inline char* zone::get_aligned(char* ptr, size_t align) { MSGPACK_ASSERT(align != 0 && (align & (align - 1)) == 0); // align must be 2^n (n >= 0) return reinterpret_cast( @@ -207,37 +194,45 @@ inline char* zone::get_aligned(char* ptr, size_t align) ); } -inline void* zone::allocate_align(size_t size, size_t align) -{ - char* aligned = get_aligned(m_chunk_list.m_ptr, align); - size_t adjusted_size = size + static_cast(aligned - m_chunk_list.m_ptr); - if (m_chunk_list.m_free < adjusted_size) { +inline zone::chunk_list& zone::get_chank_lst() { + if (!m_chunk_list) { + void* ptr = ::malloc(sizeof(chunk_list) + m_chunk_size); + if (!ptr) + throw std::bad_alloc(); + m_chunk_list = new (ptr) chunk_list(m_chunk_size, reinterpret_cast(ptr) + sizeof(chunk_list)); + } + return *m_chunk_list; +} + +inline void* zone::allocate_align(size_t size, size_t align) { + chunk_list& chank_lst = get_chank_lst(); + char* aligned = get_aligned(chank_lst.m_ptr, align); + size_t adjusted_size = size + static_cast(aligned - chank_lst.m_ptr); + if (chank_lst.m_free < adjusted_size) { size_t enough_size = size + align - 1; char* ptr = allocate_expand(enough_size); aligned = get_aligned(ptr, align); - adjusted_size = size + static_cast(aligned - m_chunk_list.m_ptr); + adjusted_size = size + static_cast(aligned - chank_lst.m_ptr); } - m_chunk_list.m_free -= adjusted_size; - m_chunk_list.m_ptr += adjusted_size; + chank_lst.m_free -= adjusted_size; + chank_lst.m_ptr += adjusted_size; return aligned; } -inline void* zone::allocate_no_align(size_t size) -{ - char* ptr = m_chunk_list.m_ptr; - if(m_chunk_list.m_free < size) { +inline void* zone::allocate_no_align(size_t size) { + chunk_list& chank_lst = get_chank_lst(); + char* ptr = chank_lst.m_ptr; + if(chank_lst.m_free < size) { ptr = allocate_expand(size); } - m_chunk_list.m_free -= size; - m_chunk_list.m_ptr += size; + chank_lst.m_free -= size; + chank_lst.m_ptr += size; return ptr; } -inline char* zone::allocate_expand(size_t size) -{ - chunk_list* const cl = &m_chunk_list; - +inline char* zone::allocate_expand(size_t size) { + chunk_list& cl = get_chank_lst(); size_t sz = m_chunk_size; while(sz < size) { @@ -254,60 +249,54 @@ inline char* zone::allocate_expand(size_t size) char* ptr = reinterpret_cast(c) + sizeof(chunk); - c->m_next = cl->m_head; - cl->m_head = c; - cl->m_free = sz; - cl->m_ptr = ptr; + c->m_next = cl.m_head; + cl.m_head = c; + cl.m_free = sz; + cl.m_ptr = ptr; return ptr; } -inline void zone::push_finalizer(void (*func)(void*), void* data) -{ +inline void zone::push_finalizer(void (*func)(void*), void* data) { m_finalizer_array.push(func, data); } template -inline void zone::push_finalizer(msgpack::unique_ptr obj) -{ +inline void zone::push_finalizer(msgpack::unique_ptr obj) { m_finalizer_array.push(&zone::object_delete, obj.release()); } -inline void zone::clear() -{ +inline void zone::clear() { m_finalizer_array.clear(); - m_chunk_list.clear(m_chunk_size); + if (m_chunk_list) { + m_chunk_list->clear(m_chunk_size, reinterpret_cast(m_chunk_list) + sizeof(chunk_list)); + } } -inline void zone::swap(zone& o) -{ +inline void zone::swap(zone& o) { using std::swap; swap(m_chunk_size, o.m_chunk_size); swap(m_chunk_list, o.m_chunk_list); - swap(m_finalizer_array, o.m_finalizer_array); + swap(m_finalizer_array.m_head, o.m_finalizer_array.m_head); } template -void zone::object_destruct(void* obj) -{ - static_cast(obj)->~T(); +void zone::object_delete(void* obj) { + delete static_cast(obj); } template -void zone::object_delete(void* obj) -{ - delete static_cast(obj); +void zone::object_destruct(void* obj) { + static_cast(obj)->~T(); } -inline void zone::undo_allocate(size_t size) -{ - m_chunk_list.m_ptr -= size; - m_chunk_list.m_free += size; +inline void zone::undo_allocate(size_t size) { + chunk_list& cl = get_chank_lst(); + cl.m_ptr -= size; + cl.m_free += size; } -inline std::size_t aligned_size( - std::size_t size, - std::size_t align) { +inline std::size_t aligned_size(std::size_t size, std::size_t align) { return (size + align - 1) / align * align; } @@ -326,7 +315,7 @@ T* zone::allocate(<%=(1..i).map{|j|"A#{j} a#{j}"}.join(', ')%>) try { return new (x) T(<%=(1..i).map{|j|"a#{j}"}.join(', ')%>); } catch (...) { - --m_finalizer_array.m_tail; + m_finalizer_array.pop(); undo_allocate(sizeof(T)); RETHROW; } diff --git a/barretenberg/cpp/src/msgpack-c/example/boost/CMakeLists.txt b/barretenberg/cpp/src/msgpack-c/example/boost/CMakeLists.txt index ad9c979ce47..6464513b326 100644 --- a/barretenberg/cpp/src/msgpack-c/example/boost/CMakeLists.txt +++ b/barretenberg/cpp/src/msgpack-c/example/boost/CMakeLists.txt @@ -1,4 +1,4 @@ -FIND_PACKAGE (Boost REQUIRED COMPONENTS system) +FIND_PACKAGE (Boost REQUIRED) FIND_PACKAGE (Threads REQUIRED) FIND_PACKAGE (ZLIB REQUIRED) @@ -22,7 +22,6 @@ FOREACH (source_file ${exec_PROGRAMS}) ) TARGET_LINK_LIBRARIES (${source_file_we} PRIVATE msgpack-cxx - Boost::system Threads::Threads ) IF (ZLIB_FOUND) diff --git a/barretenberg/cpp/src/msgpack-c/example/x3/CMakeLists.txt b/barretenberg/cpp/src/msgpack-c/example/x3/CMakeLists.txt index 5fc6c1afa40..963d6da4f4b 100644 --- a/barretenberg/cpp/src/msgpack-c/example/x3/CMakeLists.txt +++ b/barretenberg/cpp/src/msgpack-c/example/x3/CMakeLists.txt @@ -1,5 +1,5 @@ IF (MSGPACK_USE_X3_PARSE AND MSGPACK_DEFAULT_API_VERSION VERSION_GREATER 1) - FIND_PACKAGE (Boost REQUIRED COMPONENTS context system) + FIND_PACKAGE (Boost REQUIRED COMPONENTS context) FIND_PACKAGE (Threads REQUIRED) LIST (APPEND exec_PROGRAMS @@ -42,7 +42,6 @@ IF (MSGPACK_USE_X3_PARSE AND MSGPACK_DEFAULT_API_VERSION VERSION_GREATER 1) TARGET_LINK_LIBRARIES (${source_file_we} PRIVATE msgpack-cxx Boost::context - Boost::system Threads::Threads ) IF ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") diff --git a/barretenberg/cpp/src/msgpack-c/fuzz/CMakeLists.txt b/barretenberg/cpp/src/msgpack-c/fuzz/CMakeLists.txt index 819130ed2fd..9779687417d 100644 --- a/barretenberg/cpp/src/msgpack-c/fuzz/CMakeLists.txt +++ b/barretenberg/cpp/src/msgpack-c/fuzz/CMakeLists.txt @@ -1,5 +1,5 @@ FIND_PACKAGE (Threads REQUIRED) -FIND_PACKAGE (Boost REQUIRED COMPONENTS system filesystem unit_test_framework) +FIND_PACKAGE (Boost REQUIRED COMPONENTS filesystem unit_test_framework) LIST (APPEND check_PROGRAMS regression_runner.cpp @@ -19,7 +19,6 @@ FOREACH (source_file ${check_PROGRAMS}) msgpack-cxx Threads::Threads Boost::filesystem - Boost::system Boost::unit_test_framework ) diff --git a/barretenberg/cpp/src/msgpack-c/include/msgpack/adaptor/cpp17/variant.hpp b/barretenberg/cpp/src/msgpack-c/include/msgpack/adaptor/cpp17/variant.hpp new file mode 100644 index 00000000000..bd73ff9ae5e --- /dev/null +++ b/barretenberg/cpp/src/msgpack-c/include/msgpack/adaptor/cpp17/variant.hpp @@ -0,0 +1,16 @@ +// +// MessagePack for C++ static resolution routine +// +// Copyright (C) 2023 Uy Ha +// +// 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 MSGPACK_TYPE_CPP17_VARIANT_HPP +#define MSGPACK_TYPE_CPP17_VARIANT_HPP + +#include "msgpack/v1/adaptor/cpp17/variant.hpp" + +#endif // MSGPACK_TYPE_CPP17_VARIANT_HPP diff --git a/barretenberg/cpp/src/msgpack-c/include/msgpack/assert.hpp b/barretenberg/cpp/src/msgpack-c/include/msgpack/assert.hpp index 180e345c7a9..77feae6ec98 100644 --- a/barretenberg/cpp/src/msgpack-c/include/msgpack/assert.hpp +++ b/barretenberg/cpp/src/msgpack-c/include/msgpack/assert.hpp @@ -27,7 +27,7 @@ struct AbortStream { void operator<< [[noreturn]] (const auto& error) { - (void)error; // TODO how to print this? + info(error.what()); std::abort(); } }; diff --git a/barretenberg/cpp/src/msgpack-c/include/msgpack/type.hpp b/barretenberg/cpp/src/msgpack-c/include/msgpack/type.hpp index e48bdade9a5..0e9aa221bd2 100644 --- a/barretenberg/cpp/src/msgpack-c/include/msgpack/type.hpp +++ b/barretenberg/cpp/src/msgpack-c/include/msgpack/type.hpp @@ -1,45 +1,43 @@ -#include "cpp_config.hpp" #include "adaptor/array_ref.hpp" #include "adaptor/bool.hpp" #include "adaptor/carray.hpp" #include "adaptor/char_ptr.hpp" +#include "adaptor/complex.hpp" +#include "adaptor/define.hpp" #include "adaptor/deque.hpp" #include "adaptor/ext.hpp" #include "adaptor/fixint.hpp" #include "adaptor/float.hpp" #include "adaptor/int.hpp" -#include "adaptor/complex.hpp" #include "adaptor/list.hpp" #include "adaptor/map.hpp" +#include "adaptor/msgpack_tuple.hpp" #include "adaptor/nil.hpp" #include "adaptor/pair.hpp" #include "adaptor/raw.hpp" -#include "adaptor/v4raw.hpp" #include "adaptor/set.hpp" #include "adaptor/size_equal_only.hpp" #include "adaptor/string.hpp" +#include "adaptor/v4raw.hpp" #include "adaptor/vector.hpp" #include "adaptor/vector_bool.hpp" #include "adaptor/vector_char.hpp" #include "adaptor/vector_unsigned_char.hpp" #include "adaptor/wstring.hpp" -#include "adaptor/msgpack_tuple.hpp" -#include "adaptor/define.hpp" +#include "cpp_config.hpp" #if defined(MSGPACK_USE_CPP03) #include "adaptor/tr1/unordered_map.hpp" #include "adaptor/tr1/unordered_set.hpp" -#else // defined(MSGPACK_USE_CPP03) +#else // defined(MSGPACK_USE_CPP03) #include "adaptor/cpp11/array.hpp" #include "adaptor/cpp11/array_char.hpp" #include "adaptor/cpp11/array_unsigned_char.hpp" -#if !defined(MSGPACK_NO_BOOST) #include "adaptor/cpp11/chrono.hpp" -#endif // !defined(MSGPACK_NO_BOOST) #include "adaptor/cpp11/forward_list.hpp" #include "adaptor/cpp11/reference_wrapper.hpp" @@ -63,6 +61,10 @@ #include "adaptor/cpp17/carray_byte.hpp" #include "adaptor/cpp17/vector_byte.hpp" +#if MSGPACK_HAS_INCLUDE() +#include "adaptor/cpp17/variant.hpp" +#endif // MSGPACK_HAS_INCLUDE() + #if MSGPACK_HAS_INCLUDE() #include "adaptor/cpp20/span.hpp" #endif // MSGPACK_HAS_INCLUDE() diff --git a/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/adaptor/boost/msgpack_variant.hpp b/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/adaptor/boost/msgpack_variant.hpp index a87a4e44513..531ea3c1d2c 100644 --- a/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/adaptor/boost/msgpack_variant.hpp +++ b/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/adaptor/boost/msgpack_variant.hpp @@ -12,20 +12,19 @@ #include "msgpack/v1/adaptor/boost/msgpack_variant_decl.hpp" -#include "msgpack/adaptor/check_container_size.hpp" #include "msgpack/adaptor/boost/string_ref.hpp" +#include "msgpack/adaptor/check_container_size.hpp" -#include "msgpack/adaptor/nil.hpp" #include "msgpack/adaptor/bool.hpp" -#include "msgpack/adaptor/int.hpp" +#include "msgpack/adaptor/ext.hpp" #include "msgpack/adaptor/float.hpp" -#include "msgpack/adaptor/string.hpp" -#include "msgpack/adaptor/vector_char.hpp" +#include "msgpack/adaptor/int.hpp" +#include "msgpack/adaptor/map.hpp" +#include "msgpack/adaptor/nil.hpp" #include "msgpack/adaptor/raw.hpp" -#include "msgpack/adaptor/ext.hpp" +#include "msgpack/adaptor/string.hpp" #include "msgpack/adaptor/vector.hpp" -#include "msgpack/adaptor/map.hpp" - +#include "msgpack/adaptor/vector_char.hpp" #if defined(__GNUC__) #pragma GCC diagnostic push @@ -43,406 +42,359 @@ namespace msgpack { /// @cond -MSGPACK_API_VERSION_NAMESPACE(v1) { -/// @endcond - -namespace type { - - -template -struct basic_variant : - boost::variant< - nil_t, // NIL - bool, // BOOL - int64_t, // NEGATIVE_INTEGER - uint64_t, // POSITIVE_INTEGER - double, // FLOAT32, FLOAT64 - std::string, // STR +MSGPACK_API_VERSION_NAMESPACE(v1) +{ + /// @endcond + + namespace type { + + template + struct basic_variant + : boost::variant< + nil_t, // NIL + bool, // BOOL + int64_t, // NEGATIVE_INTEGER + uint64_t, // POSITIVE_INTEGER + double, // FLOAT32, FLOAT64 + std::string, // STR #if (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53 - boost::string_ref, // STR -#endif // (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53 - std::vector, // BIN - msgpack::type::raw_ref, // BIN - msgpack::type::ext, // EXT - msgpack::type::ext_ref, // EXT - boost::recursive_wrapper > >, // ARRAY - boost::recursive_wrapper, basic_variant > >, // MAP - boost::recursive_wrapper, basic_variant > >// MAP - >, - private boost::totally_ordered > { - typedef boost::variant< - nil_t, // NIL - bool, // BOOL - int64_t, // NEGATIVE_INTEGER - uint64_t, // POSITIVE_INTEGER - double, // FLOAT32, FLOAT64 - std::string, // STR + boost::string_ref, // STR +#endif // (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53 + std::vector, // BIN + msgpack::type::raw_ref, // BIN + msgpack::type::ext, // EXT + msgpack::type::ext_ref, // EXT + boost::recursive_wrapper>>, // ARRAY + boost::recursive_wrapper, basic_variant>>, // MAP + boost::recursive_wrapper, basic_variant>> // MAP + >, + private boost::totally_ordered> { + typedef boost::variant< + nil_t, // NIL + bool, // BOOL + int64_t, // NEGATIVE_INTEGER + uint64_t, // POSITIVE_INTEGER + double, // FLOAT32, FLOAT64 + std::string, // STR #if (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53 - boost::string_ref, // STR -#endif // (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53 - std::vector, // BIN - msgpack::type::raw_ref, // BIN - msgpack::type::ext, // EXT - msgpack::type::ext_ref, // EXT - boost::recursive_wrapper > >, // ARRAY - boost::recursive_wrapper, basic_variant > >, // MAP - boost::recursive_wrapper, basic_variant > >// MAP - > base; - basic_variant() {} - template - basic_variant(T const& t):base(t) {} + boost::string_ref, // STR +#endif // (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53 + std::vector, // BIN + msgpack::type::raw_ref, // BIN + msgpack::type::ext, // EXT + msgpack::type::ext_ref, // EXT + boost::recursive_wrapper>>, // ARRAY + boost::recursive_wrapper, basic_variant>>, // MAP + boost::recursive_wrapper, basic_variant>> // MAP + > + base; + basic_variant() {} + template + basic_variant(T const& t) + : base(t) + {} #if defined(_MSC_VER) && _MSC_VER < 1700 - // The following redundant functions are required to avoid MSVC - // See https://svn.boost.org/trac/boost/ticket/592 - basic_variant(basic_variant const& other):base(static_cast(other)) {} - basic_variant& operator=(basic_variant const& other) { - *static_cast(this) = static_cast(other); - return *this; - } + // The following redundant functions are required to avoid MSVC + // See https://svn.boost.org/trac/boost/ticket/592 + basic_variant(basic_variant const& other) + : base(static_cast(other)) + {} + basic_variant& operator=(basic_variant const& other) + { + *static_cast(this) = static_cast(other); + return *this; + } #endif // defined(_MSC_VER) && _MSC_VER < 1700 - basic_variant(char const* p):base(std::string(p)) {} - basic_variant(char v) { - int_init(v); - } - basic_variant(signed char v) { - int_init(v); - } - basic_variant(unsigned char v):base(uint64_t(v)) {} - basic_variant(signed int v) { - int_init(v); - } - basic_variant(unsigned int v):base(uint64_t(v)) {} - basic_variant(signed long v) { - int_init(v); - } - basic_variant(unsigned long v):base(uint64_t(v)) {} - basic_variant(signed long long v) { - int_init(v); - } - basic_variant(unsigned long long v):base(uint64_t(v)) {} - - bool is_nil() const { - return boost::get(this) != MSGPACK_NULLPTR; - } - bool is_bool() const { - return boost::get(this) != MSGPACK_NULLPTR; - } - bool is_int64_t() const { - return boost::get(this) != MSGPACK_NULLPTR; - } - bool is_uint64_t() const { - return boost::get(this) != MSGPACK_NULLPTR; - } - bool is_double() const { - return boost::get(this) != MSGPACK_NULLPTR; - } - bool is_string() const { - return boost::get(this) != MSGPACK_NULLPTR; - } + basic_variant(char const* p) + : base(std::string(p)) + {} + basic_variant(char v) { int_init(v); } + basic_variant(signed char v) { int_init(v); } + basic_variant(unsigned char v) + : base(uint64_t(v)) + {} + basic_variant(signed int v) { int_init(v); } + basic_variant(unsigned int v) + : base(uint64_t(v)) + {} + basic_variant(signed long v) { int_init(v); } + basic_variant(unsigned long v) + : base(uint64_t(v)) + {} + basic_variant(signed long long v) { int_init(v); } + basic_variant(unsigned long long v) + : base(uint64_t(v)) + {} + basic_variant(float v) { double_init(v); } + basic_variant(double v) { double_init(v); } + + bool is_nil() const { return boost::get(this) != MSGPACK_NULLPTR; } + bool is_bool() const { return boost::get(this) != MSGPACK_NULLPTR; } + bool is_int64_t() const { return boost::get(this) != MSGPACK_NULLPTR; } + bool is_uint64_t() const { return boost::get(this) != MSGPACK_NULLPTR; } + bool is_double() const { return boost::get(this) != MSGPACK_NULLPTR; } + bool is_string() const { return boost::get(this) != MSGPACK_NULLPTR; } #if (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53 - bool is_boost_string_ref() const { - return boost::get(this) != MSGPACK_NULLPTR; - } + bool is_boost_string_ref() const { return boost::get(this) != MSGPACK_NULLPTR; } #endif // (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53 - bool is_vector_char() const { - return boost::get >(this) != MSGPACK_NULLPTR; - } - bool is_vector_char() { - return boost::get >(this) != MSGPACK_NULLPTR; - } - bool is_raw_ref() const { - return boost::get(this) != MSGPACK_NULLPTR; - } - bool is_ext() const { - return boost::get(this) != MSGPACK_NULLPTR; - } - bool is_ext_ref() const { - return boost::get(this) != MSGPACK_NULLPTR; - } - bool is_vector() const { - return boost::get > >(this) != MSGPACK_NULLPTR; - } - bool is_map() const { - return boost::get, basic_variant > >(this) != MSGPACK_NULLPTR; - } - bool is_multimap() const { - return boost::get, basic_variant > >(this) != MSGPACK_NULLPTR; - } + bool is_vector_char() const { return boost::get>(this) != MSGPACK_NULLPTR; } + bool is_vector_char() { return boost::get>(this) != MSGPACK_NULLPTR; } + bool is_raw_ref() const { return boost::get(this) != MSGPACK_NULLPTR; } + bool is_ext() const { return boost::get(this) != MSGPACK_NULLPTR; } + bool is_ext_ref() const { return boost::get(this) != MSGPACK_NULLPTR; } + bool is_vector() const + { + return boost::get>>(this) != MSGPACK_NULLPTR; + } + bool is_map() const + { + return boost::get, basic_variant>>(this) != + MSGPACK_NULLPTR; + } + bool is_multimap() const + { + return boost::get, basic_variant>>(this) != + MSGPACK_NULLPTR; + } - bool as_bool() const { - return boost::get(*this); - } - int64_t as_int64_t() const { - return boost::get(*this); - } - int64_t& as_int64_t() { - return boost::get(*this); - } - uint64_t as_uint64_t() const { - return boost::get(*this); - } - uint64_t& as_uint64_t() { - return boost::get(*this); - } - double as_double() const { - return boost::get(*this); - } - double& as_double() { - return boost::get(*this); - } - std::string const& as_string() const { - return boost::get(*this); - } - std::string& as_string() { - return boost::get(*this); - } + bool as_bool() const { return boost::get(*this); } + int64_t as_int64_t() const { return boost::get(*this); } + uint64_t as_uint64_t() const { return boost::get(*this); } + double as_double() const + { + if (is_double()) { + return boost::get(*this); + } + if (is_int64_t()) { + return static_cast(boost::get(*this)); + } + if (is_uint64_t()) { + return static_cast(boost::get(*this)); + } + throw msgpack::type_error(); + } + std::string const& as_string() const { return boost::get(*this); } #if (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53 - boost::string_ref const& as_boost_string_ref() const { - return boost::get(*this); - } - boost::string_ref& as_boost_string_ref() { - return boost::get(*this); - } + boost::string_ref const& as_boost_string_ref() const { return boost::get(*this); } #endif // (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53 - std::vector const& as_vector_char() const { - return boost::get >(*this); - } - std::vector& as_vector_char() { - return boost::get >(*this); - } - raw_ref const& as_raw_ref() const { - return boost::get(*this); - } - ext const& as_ext() const { - return boost::get(*this); - } - ext& as_ext() { - return boost::get(*this); - } - ext_ref const& as_ext_ref() const { - return boost::get(*this); - } - std::vector > const& as_vector() const { - return boost::get > >(*this); - } - std::vector >& as_vector() { - return boost::get > >(*this); - } - std::map, basic_variant > const& as_map() const { - return boost::get, basic_variant > >(*this); - } - std::map, basic_variant >& as_map() { - return boost::get, basic_variant > >(*this); - } - std::multimap, basic_variant > const& as_multimap() const { - return boost::get, basic_variant > >(*this); - } - std::multimap, basic_variant >& as_multimap() { - return boost::get, basic_variant > >(*this); - } -private: - template - void int_init(T v) { - if (v < 0) { - static_cast(*this) = int64_t(v); + std::vector const& as_vector_char() const { return boost::get>(*this); } + raw_ref const& as_raw_ref() const { return boost::get(*this); } + ext const& as_ext() const { return boost::get(*this); } + ext_ref const& as_ext_ref() const { return boost::get(*this); } + std::vector> const& as_vector() const + { + return boost::get>>(*this); } - else { - static_cast(*this) = uint64_t(v); + std::map, basic_variant> const& as_map() const + { + return boost::get, basic_variant>>(*this); } - } -}; - -template -inline bool operator<(basic_variant const& lhs, basic_variant const& rhs) { - return - static_cast::base const&>(lhs) < - static_cast::base const&>(rhs); -} - -template -inline bool operator==(basic_variant const& lhs, basic_variant const& rhs) { - return - static_cast::base const&>(lhs) == - static_cast::base const&>(rhs); -} - -typedef basic_variant, ext> variant; -typedef basic_variant< -#if (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53 - boost::string_ref, -#else // (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53 - std::string, -#endif // (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53 - raw_ref, ext_ref> variant_ref; - -} // namespace type - -namespace adaptor { - -#if !defined (MSGPACK_USE_CPP03) - -template -struct as > { - type::basic_variant operator()(msgpack::object const& o) const { - switch(o.type) { - case type::NIL: - return o.as(); - case type::BOOLEAN: - return o.as(); - case type::POSITIVE_INTEGER: - return o.as(); - case type::NEGATIVE_INTEGER: - return o.as(); - case type::FLOAT32: - case type::FLOAT64: - return o.as(); - case type::STR: - return o.as(); - case type::BIN: - return o.as(); - case type::EXT: - return o.as(); - case type::ARRAY: - return o.as > >(); - case type::MAP: - return o.as, type::basic_variant > >(); - default: - break; + std::multimap, basic_variant> const& as_multimap() const + { + return boost::get, basic_variant>>(*this); } - return type::basic_variant(); - } -}; - -#endif // !defined (MSGPACK_USE_CPP03) - -template -struct convert > { - msgpack::object const& operator()( - msgpack::object const& o, - type::basic_variant& v) const { - switch(o.type) { - case type::NIL: - v = o.as(); - break; - case type::BOOLEAN: - v = o.as(); - break; - case type::POSITIVE_INTEGER: - v = o.as(); - break; - case type::NEGATIVE_INTEGER: - v = o.as(); - break; - case type::FLOAT32: - case type::FLOAT64: - v = o.as(); - break; - case type::STR: - v = o.as(); - break; - case type::BIN: - v = o.as(); - break; - case type::EXT: - v = o.as(); - break; - case type::ARRAY: - v = o.as > >(); - break; - case type::MAP: - v = o.as, type::basic_variant > >(); - break; - default: - break; + private: + template void int_init(T v) + { + if (v < 0) { + static_cast(*this) = int64_t(v); + } else { + static_cast(*this) = uint64_t(v); + } } - return o; - } -}; - -namespace detail { + void double_init(double v) + { + if (v == v) { // check for nan + if (v >= 0 && v <= double(std::numeric_limits::max()) && v == double(uint64_t(v))) { + static_cast(*this) = uint64_t(v); + return; + } else if (v < 0 && v >= double(std::numeric_limits::min()) && v == double(int64_t(v))) { + static_cast(*this) = int64_t(v); + return; + } + } + static_cast(*this) = v; + } + }; -template -struct pack_imp : boost::static_visitor { - template - void operator()(T const& value) const { - pack()(o_, value); + template + inline bool operator<(basic_variant const& lhs, basic_variant const& rhs) + { + return static_cast::base const&>(lhs) < + static_cast::base const&>(rhs); } - pack_imp(packer& o):o_(o) {} - packer& o_; -}; - -} // namespace detail - -template -struct pack > { - template - msgpack::packer& operator()(msgpack::packer& o, const type::basic_variant& v) const { - boost::apply_visitor(detail::pack_imp(o), v); - return o; - } -}; - -namespace detail { -struct object_imp : boost::static_visitor { - void operator()(msgpack::type::nil_t const& v) const { - object()(o_, v); - } - void operator()(bool const& v) const { - object()(o_, v); + template + inline bool operator==(basic_variant const& lhs, basic_variant const& rhs) + { + return static_cast::base const&>(lhs) == + static_cast::base const&>(rhs); } - void operator()(uint64_t const& v) const { - object()(o_, v); - } - void operator()(int64_t const& v) const { - object()(o_, v); - } - void operator()(double const& v) const { - object()(o_, v); - } - template - void operator()(T const&) const { - THROW msgpack::type_error(); - } - object_imp(msgpack::object& o):o_(o) {} - msgpack::object& o_; -}; -} // namespace detail + typedef basic_variant, ext> variant; + typedef basic_variant< +#if (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53 + boost::string_ref, +#else // (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53 + std::string, +#endif // (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53 + raw_ref, + ext_ref> + variant_ref; + + } // namespace type + + namespace adaptor { + +#if !defined(MSGPACK_USE_CPP03) + + template struct as> { + type::basic_variant operator()(msgpack::object const& o) const + { + switch (o.type) { + case type::NIL: + return o.as(); + case type::BOOLEAN: + return o.as(); + case type::POSITIVE_INTEGER: + return o.as(); + case type::NEGATIVE_INTEGER: + return o.as(); + case type::FLOAT32: + case type::FLOAT64: + return o.as(); + case type::STR: + return o.as(); + case type::BIN: + return o.as(); + case type::EXT: + return o.as(); + case type::ARRAY: + return o.as>>(); + case type::MAP: + return o.as, type::basic_variant>>(); + default: + break; + } + return type::basic_variant(); + } + }; -template -struct object > { - void operator()(msgpack::object& o, const type::basic_variant& v) const { - boost::apply_visitor(detail::object_imp(o), v); - } -}; +#endif // !defined (MSGPACK_USE_CPP03) + + template struct convert> { + msgpack::object const& operator()(msgpack::object const& o, type::basic_variant& v) const + { + switch (o.type) { + case type::NIL: + v = o.as(); + break; + case type::BOOLEAN: + v = o.as(); + break; + case type::POSITIVE_INTEGER: + v = o.as(); + break; + case type::NEGATIVE_INTEGER: + v = o.as(); + break; + case type::FLOAT32: + case type::FLOAT64: + v = o.as(); + break; + case type::STR: + v = o.as(); + break; + case type::BIN: + v = o.as(); + break; + case type::EXT: + v = o.as(); + break; + case type::ARRAY: + v = o.as>>(); + break; + case type::MAP: + v = o.as, type::basic_variant>>(); + break; + default: + break; + } + return o; + } + }; + + namespace detail { + + template struct pack_imp : boost::static_visitor { + template void operator()(T const& value) const { pack()(o_, value); } + pack_imp(packer& o) + : o_(o) + {} + packer& o_; + }; + + } // namespace detail + + template struct pack> { + template + msgpack::packer& operator()(msgpack::packer& o, + const type::basic_variant& v) const + { + boost::apply_visitor(detail::pack_imp(o), v); + return o; + } + }; + + namespace detail { + + struct object_imp : boost::static_visitor { + void operator()(msgpack::type::nil_t const& v) const { object()(o_, v); } + void operator()(bool const& v) const { object()(o_, v); } + void operator()(uint64_t const& v) const { object()(o_, v); } + void operator()(int64_t const& v) const { object()(o_, v); } + void operator()(double const& v) const { object()(o_, v); } + template void operator()(T const&) const { THROW msgpack::type_error(); } + object_imp(msgpack::object& o) + : o_(o) + {} + msgpack::object& o_; + }; + + } // namespace detail + + template struct object> { + void operator()(msgpack::object& o, const type::basic_variant& v) const + { + boost::apply_visitor(detail::object_imp(o), v); + } + }; -namespace detail { + namespace detail { -struct object_with_zone_imp : boost::static_visitor { - template - void operator()(T const& v) const { - object_with_zone()(o_, v); - } - object_with_zone_imp(msgpack::object::with_zone& o):o_(o) {} - msgpack::object::with_zone& o_; -}; + struct object_with_zone_imp : boost::static_visitor { + template void operator()(T const& v) const { object_with_zone()(o_, v); } + object_with_zone_imp(msgpack::object::with_zone& o) + : o_(o) + {} + msgpack::object::with_zone& o_; + }; -} // namespace detail + } // namespace detail -template -struct object_with_zone > { - void operator()(msgpack::object::with_zone& o, const type::basic_variant& v) const { - boost::apply_visitor(detail::object_with_zone_imp(o), v); - } -}; + template struct object_with_zone> { + void operator()(msgpack::object::with_zone& o, const type::basic_variant& v) const + { + boost::apply_visitor(detail::object_with_zone_imp(o), v); + } + }; -} // namespace adaptor + } // namespace adaptor -/// @cond + /// @cond } // MSGPACK_API_VERSION_NAMESPACE(v1) /// @endcond diff --git a/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/adaptor/cpp11/chrono.hpp b/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/adaptor/cpp11/chrono.hpp index 9607022daca..d94524ad8c5 100644 --- a/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/adaptor/cpp11/chrono.hpp +++ b/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/adaptor/cpp11/chrono.hpp @@ -11,245 +11,321 @@ #ifndef MSGPACK_V1_TYPE_CPP11_CHRONO_HPP #define MSGPACK_V1_TYPE_CPP11_CHRONO_HPP -#if !defined(MSGPACK_NO_BOOST) - -#include "msgpack/versioning.hpp" #include "msgpack/adaptor/adaptor_base.hpp" -#include "msgpack/object.hpp" #include "msgpack/adaptor/check_container_size.hpp" +#include "msgpack/object.hpp" +#include "msgpack/versioning.hpp" #include - -#include +#include namespace msgpack { /// @cond -MSGPACK_API_VERSION_NAMESPACE(v1) { -/// @endcond +MSGPACK_API_VERSION_NAMESPACE(v1) +{ + /// @endcond -namespace adaptor { - -template -struct as> { - typename std::chrono::time_point operator()(msgpack::object const& o) const { - if(o.type != msgpack::type::EXT) { THROW msgpack::type_error(); } - if(o.via.ext.type() != -1) { THROW msgpack::type_error(); } - std::chrono::time_point tp; - switch(o.via.ext.size) { - case 4: { - uint32_t sec; - _msgpack_load32(uint32_t, o.via.ext.data(), &sec); - tp += std::chrono::seconds(sec); - } break; - case 8: { - uint64_t value; - _msgpack_load64(uint64_t, o.via.ext.data(), &value); - uint32_t nanosec = boost::numeric_cast(value >> 34); - uint64_t sec = value & 0x00000003ffffffffLL; - tp += std::chrono::duration_cast( - std::chrono::nanoseconds(nanosec)); - tp += std::chrono::seconds(sec); - } break; - case 12: { - uint32_t nanosec; - _msgpack_load32(uint32_t, o.via.ext.data(), &nanosec); - int64_t sec; - _msgpack_load64(int64_t, o.via.ext.data() + 4, &sec); - - if (sec > 0) { - tp += std::chrono::seconds(sec); - tp += std::chrono::duration_cast( - std::chrono::nanoseconds(nanosec)); + namespace adaptor { + + namespace detail { + template ::value, + bool source_is_signed = std::is_signed::value, + typename = + typename std::enable_if::value && std::is_integral::value>::type> + struct would_underflow { + // The default case includes the cases that Source being unsigned, and since Source + // is unsigned, no underflow can happen + would_underflow(Source) + : value{ false } + {} + bool value; + }; + + template struct would_underflow { + // When Source is signed and Target is unsigned, we only need to compare with 0 to + // detect underflow, this works correctly and also avoids warnings from the compiler + would_underflow(Source source) + : value{ source < 0 } + {} + bool value; + }; + template struct would_underflow { + // When Source and Target are signed, the promotion rules apply sensibly so we do + // not need to do anything + would_underflow(Source source) + : value{ source < std::numeric_limits::min() } + {} + bool value; + }; + + template ::value, + bool source_is_signed = std::is_signed::value, + typename = + typename std::enable_if::value && std::is_integral::value>::type> + struct would_overflow { + // The default case is Source and Target having the same signedness, the promotion + // rule also apply sensibly here so nothing special needs to be done + would_overflow(Source source) + : value{ source > std::numeric_limits::max() } + {} + bool value; + }; + template struct would_overflow { + // When Target is unsigned and Source is signed, we cannot rely on the promotion + // rule. + would_overflow(Source source) + : value{ sizeof(Target) >= sizeof(Source) + // Given Source is signed, Target being unsigned and having at least the + // same size makes impossible to overflow + ? false + // Source being larger than Target makes it safe to cast the maximum value + // of Target to Source + : source > static_cast(std::numeric_limits::max()) } + {} + bool value; + }; + template struct would_overflow { + // When Target is signed and Source is unsigned, we cannot rely on the promotion + // rule. + would_overflow(Source source) + : value{ sizeof(Target) > sizeof(Source) + // Target being larger than Source makes it impossible to overflow + ? false + // Source being unsigned and having at least the size of Target makes it + // safe to cast the maximum value of Target to Source + : source > static_cast(std::numeric_limits::max()) } + {} + bool value; + }; + + template < + typename Target, + typename Source, + typename = typename std::enable_if::value && std::is_integral::value>::type> + Target integral_cast(Source source) + { + if (would_underflow(source).value) { + throw std::underflow_error{ "casting from Source to Target causes an underflow error" }; + } + if (would_overflow(source).value) { + throw std::overflow_error{ "casting from Source to Target causes an overflow error" }; + } + + return static_cast(source); + } + } // namespace detail + + template struct as> { + typename std::chrono::time_point operator()(msgpack::object const& o) const + { + if (o.type != msgpack::type::EXT) { + THROW msgpack::type_error(); } - else { - if (nanosec == 0) { - tp += std::chrono::seconds(sec); - } - else { - ++sec; + if (o.via.ext.type() != -1) { + THROW msgpack::type_error(); + } + std::chrono::time_point tp; + switch (o.via.ext.size) { + case 4: { + uint32_t sec; + _msgpack_load32(uint32_t, o.via.ext.data(), &sec); + tp += std::chrono::seconds(sec); + } break; + case 8: { + uint64_t value; + _msgpack_load64(uint64_t, o.via.ext.data(), &value); + uint32_t nanosec = detail::integral_cast(value >> 34); + uint64_t sec = value & 0x00000003ffffffffLL; + tp += std::chrono::duration_cast(std::chrono::nanoseconds(nanosec)); + tp += std::chrono::seconds(sec); + } break; + case 12: { + uint32_t nanosec; + _msgpack_load32(uint32_t, o.via.ext.data(), &nanosec); + int64_t sec; + _msgpack_load64(int64_t, o.via.ext.data() + 4, &sec); + + if (sec > 0) { tp += std::chrono::seconds(sec); - int64_t ns = boost::numeric_cast(nanosec) - 1000000000L; - tp += std::chrono::duration_cast( - std::chrono::nanoseconds(ns)); + tp += std::chrono::duration_cast(std::chrono::nanoseconds(nanosec)); + } else { + if (nanosec == 0) { + tp += std::chrono::seconds(sec); + } else { + ++sec; + tp += std::chrono::seconds(sec); + int64_t ns = detail::integral_cast(nanosec) - 1000000000L; + tp += std::chrono::duration_cast(std::chrono::nanoseconds(ns)); + } } + } break; + default: + THROW msgpack::type_error(); } - } break; - default: - THROW msgpack::type_error(); + return tp; } - return tp; - } -}; - -template -struct convert> { - msgpack::object const& operator()(msgpack::object const& o, std::chrono::time_point& v) const { - if(o.type != msgpack::type::EXT) { THROW msgpack::type_error(); } - if(o.via.ext.type() != -1) { THROW msgpack::type_error(); } - std::chrono::time_point tp; - switch(o.via.ext.size) { - case 4: { - uint32_t sec; - _msgpack_load32(uint32_t, o.via.ext.data(), &sec); - tp += std::chrono::seconds(sec); - v = tp; - } break; - case 8: { - uint64_t value; - _msgpack_load64(uint64_t, o.via.ext.data(), &value); - uint32_t nanosec = boost::numeric_cast(value >> 34); - uint64_t sec = value & 0x00000003ffffffffLL; - tp += std::chrono::duration_cast( - std::chrono::nanoseconds(nanosec)); - tp += std::chrono::seconds(sec); - v = tp; - } break; - case 12: { - uint32_t nanosec; - _msgpack_load32(uint32_t, o.via.ext.data(), &nanosec); - int64_t sec; - _msgpack_load64(int64_t, o.via.ext.data() + 4, &sec); - - if (sec > 0) { - tp += std::chrono::seconds(sec); - tp += std::chrono::duration_cast( - std::chrono::nanoseconds(nanosec)); + }; + + template struct convert> { + msgpack::object const& operator()(msgpack::object const& o, std::chrono::time_point& v) const + { + if (o.type != msgpack::type::EXT) { + THROW msgpack::type_error(); } - else { - if (nanosec == 0) { - tp += std::chrono::seconds(sec); - } - else { - ++sec; + if (o.via.ext.type() != -1) { + THROW msgpack::type_error(); + } + std::chrono::time_point tp; + switch (o.via.ext.size) { + case 4: { + uint32_t sec; + _msgpack_load32(uint32_t, o.via.ext.data(), &sec); + tp += std::chrono::seconds(sec); + v = tp; + } break; + case 8: { + uint64_t value; + _msgpack_load64(uint64_t, o.via.ext.data(), &value); + uint32_t nanosec = detail::integral_cast(value >> 34); + uint64_t sec = value & 0x00000003ffffffffLL; + tp += std::chrono::duration_cast(std::chrono::nanoseconds(nanosec)); + tp += std::chrono::seconds(sec); + v = tp; + } break; + case 12: { + uint32_t nanosec; + _msgpack_load32(uint32_t, o.via.ext.data(), &nanosec); + int64_t sec; + _msgpack_load64(int64_t, o.via.ext.data() + 4, &sec); + + if (sec > 0) { tp += std::chrono::seconds(sec); - int64_t ns = boost::numeric_cast(nanosec) - 1000000000L; - tp += std::chrono::duration_cast( - std::chrono::nanoseconds(ns)); + tp += std::chrono::duration_cast(std::chrono::nanoseconds(nanosec)); + } else { + if (nanosec == 0) { + tp += std::chrono::seconds(sec); + } else { + ++sec; + tp += std::chrono::seconds(sec); + int64_t ns = detail::integral_cast(nanosec) - 1000000000L; + tp += std::chrono::duration_cast(std::chrono::nanoseconds(ns)); + } } - } - v = tp; - } break; - default: - THROW msgpack::type_error(); - } - return o; - } -}; - -template -struct pack> { - template - msgpack::packer& operator()(msgpack::packer& o, std::chrono::time_point const& v) const { - int64_t count = boost::numeric_cast(v.time_since_epoch().count()); - int64_t nano_num = - Duration::period::ratio::num * - (1000000000L / Duration::period::ratio::den); - - int64_t nanosec = count % (1000000000L / nano_num) * nano_num; - int64_t sec = 0; - if (nanosec < 0) { - nanosec = 1000000000L + nanosec; - --sec; + v = tp; + } break; + default: + THROW msgpack::type_error(); + } + return o; } - sec += count - * Duration::period::ratio::num - / Duration::period::ratio::den; - - if ((sec >> 34) == 0) { - uint64_t data64 = (boost::numeric_cast(nanosec) << 34) | boost::numeric_cast(sec); - if ((data64 & 0xffffffff00000000L) == 0) { - // timestamp 32 - o.pack_ext(4, -1); - uint32_t data32 = boost::numeric_cast(data64); - char buf[4]; - _msgpack_store32(buf, data32); - o.pack_ext_body(buf, 4); + }; + + template struct pack> { + template + msgpack::packer& operator()(msgpack::packer& o, + std::chrono::time_point const& v) const + { + int64_t count = detail::integral_cast(v.time_since_epoch().count()); + int64_t nano_num = Duration::period::ratio::num * (1000000000L / Duration::period::ratio::den); + + int64_t nanosec = count % (1000000000L / nano_num) * nano_num; + int64_t sec = 0; + if (nanosec < 0) { + nanosec = 1000000000L + nanosec; + --sec; } - else { - // timestamp 64 - o.pack_ext(8, -1); - char buf[8]; - _msgpack_store64(buf, data64); - o.pack_ext_body(buf, 8); + sec += count * Duration::period::ratio::num / Duration::period::ratio::den; + + if ((sec >> 34) == 0) { + uint64_t data64 = + (detail::integral_cast(nanosec) << 34) | detail::integral_cast(sec); + if ((data64 & 0xffffffff00000000L) == 0) { + // timestamp 32 + o.pack_ext(4, -1); + uint32_t data32 = detail::integral_cast(data64); + char buf[4]; + _msgpack_store32(buf, data32); + o.pack_ext_body(buf, 4); + } else { + // timestamp 64 + o.pack_ext(8, -1); + char buf[8]; + _msgpack_store64(buf, data64); + o.pack_ext_body(buf, 8); + } + } else { + // timestamp 96 + o.pack_ext(12, -1); + char buf[12]; + + _msgpack_store32(&buf[0], detail::integral_cast(nanosec)); + _msgpack_store64(&buf[4], sec); + o.pack_ext_body(buf, 12); } + return o; } - else { - // timestamp 96 - o.pack_ext(12, -1); - char buf[12]; + }; + template struct object_with_zone> { + void operator()(msgpack::object::with_zone& o, const std::chrono::time_point& v) const + { + int64_t count = detail::integral_cast(v.time_since_epoch().count()); - _msgpack_store32(&buf[0], boost::numeric_cast(nanosec)); - _msgpack_store64(&buf[4], sec); - o.pack_ext_body(buf, 12); - } - return o; - } -}; - -template -struct object_with_zone> { - void operator()(msgpack::object::with_zone& o, const std::chrono::time_point& v) const { - int64_t count = boost::numeric_cast(v.time_since_epoch().count()); - - int64_t nano_num = - Duration::period::ratio::num * - (1000000000L / Duration::period::ratio::den); - - int64_t nanosec = count % (1000000000L / nano_num) * nano_num; - int64_t sec = 0; - if (nanosec < 0) { - nanosec = 1000000000L + nanosec; - --sec; - } - sec += count - * Duration::period::ratio::num - / Duration::period::ratio::den; - if ((sec >> 34) == 0) { - uint64_t data64 = (boost::numeric_cast(nanosec) << 34) | boost::numeric_cast(sec); - if ((data64 & 0xffffffff00000000L) == 0) { - // timestamp 32 - o.type = msgpack::type::EXT; - o.via.ext.size = 4; - char* p = static_cast(o.zone.allocate_no_align(o.via.ext.size + 1)); - p[0] = static_cast(-1); - uint32_t data32 = boost::numeric_cast(data64); - _msgpack_store32(&p[1], data32); - o.via.ext.ptr = p; + int64_t nano_num = Duration::period::ratio::num * (1000000000L / Duration::period::ratio::den); + + int64_t nanosec = count % (1000000000L / nano_num) * nano_num; + int64_t sec = 0; + if (nanosec < 0) { + nanosec = 1000000000L + nanosec; + --sec; } - else { - // timestamp 64 + sec += count * Duration::period::ratio::num / Duration::period::ratio::den; + if ((sec >> 34) == 0) { + uint64_t data64 = + (detail::integral_cast(nanosec) << 34) | detail::integral_cast(sec); + if ((data64 & 0xffffffff00000000L) == 0) { + // timestamp 32 + o.type = msgpack::type::EXT; + o.via.ext.size = 4; + char* p = static_cast(o.zone.allocate_no_align(o.via.ext.size + 1)); + p[0] = static_cast(-1); + uint32_t data32 = detail::integral_cast(data64); + _msgpack_store32(&p[1], data32); + o.via.ext.ptr = p; + } else { + // timestamp 64 + o.type = msgpack::type::EXT; + o.via.ext.size = 8; + char* p = static_cast(o.zone.allocate_no_align(o.via.ext.size + 1)); + p[0] = static_cast(-1); + _msgpack_store64(&p[1], data64); + o.via.ext.ptr = p; + } + } else { + // timestamp 96 o.type = msgpack::type::EXT; - o.via.ext.size = 8; + o.via.ext.size = 12; char* p = static_cast(o.zone.allocate_no_align(o.via.ext.size + 1)); p[0] = static_cast(-1); - _msgpack_store64(&p[1], data64); + _msgpack_store32(&p[1], detail::integral_cast(nanosec)); + _msgpack_store64(&p[1 + 4], sec); o.via.ext.ptr = p; } } - else { - // timestamp 96 - o.type = msgpack::type::EXT; - o.via.ext.size = 12; - char* p = static_cast(o.zone.allocate_no_align(o.via.ext.size + 1)); - p[0] = static_cast(-1); - _msgpack_store32(&p[1], boost::numeric_cast(nanosec)); - _msgpack_store64(&p[1 + 4], sec); - o.via.ext.ptr = p; - } - } -}; + }; -} // namespace adaptor + } // namespace adaptor -/// @cond + /// @cond } // MSGPACK_API_VERSION_NAMESPACE(v1) /// @endcond } // namespace msgpack -#endif // !defined(MSGPACK_NO_BOOST) - #endif // MSGPACK_V1_TYPE_CPP11_CHRONO_HPP diff --git a/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/adaptor/cpp17/variant.hpp b/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/adaptor/cpp17/variant.hpp new file mode 100644 index 00000000000..be98e7233eb --- /dev/null +++ b/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/adaptor/cpp17/variant.hpp @@ -0,0 +1,119 @@ +// +// MessagePack for C++ static resolution routine +// +// Copyright (C) 2023 Uy Ha +// +// 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 MSGPACK_V1_TYPE_VARIANT_HPP +#define MSGPACK_V1_TYPE_VARIANT_HPP + +#if defined(MSGPACK_USE_STD_VARIANT_ADAPTOR) + +#include "msgpack/cpp_version.hpp" + +#if MSGPACK_CPP_VERSION >= 201703 + +#include "msgpack/adaptor/adaptor_base.hpp" +#include "msgpack/object.hpp" +#include "msgpack/versioning.hpp" + +#include + +namespace msgpack { +MSGPACK_API_VERSION_NAMESPACE(v1) +{ + namespace adaptor { + namespace detail { + template + Variant construct_variant(std::size_t index, + msgpack::object& object, + std::index_sequence) + { + if constexpr (sizeof...(Ts) == 0) { + return object.as(); + } else { + if (index == current_index) { + return object.as(); + } + return construct_variant(index, object, std::index_sequence()); + } + } + + struct object_variant_overload { + object_variant_overload(msgpack::object& obj, msgpack::zone& zone) + : obj{ obj } + , zone{ zone } + {} + + template void operator()(T const& value) { obj = msgpack::object(value, zone); } + + msgpack::object& obj; + msgpack::zone& zone; + }; + } // namespace detail + + template + struct as, typename std::enable_if<(msgpack::has_as::value && ...)>::type> { + std::variant operator()(msgpack::object const& o) const + { + if (o.type != msgpack::type::ARRAY || o.via.array.size != 2 || + o.via.array.ptr[0].type != msgpack::type::POSITIVE_INTEGER || + o.via.array.ptr[0].via.u64 >= sizeof...(Ts)) { + throw msgpack::type_error{}; + } + + return detail::construct_variant, Ts...>( + o.via.array.ptr[0].as(), o.via.array.ptr[1], std::make_index_sequence()); + } + }; + + template struct convert> { + msgpack::object const& operator()(msgpack::object const& o, std::variant& v) const + { + if (o.type != msgpack::type::ARRAY || o.via.array.size != 2 || + o.via.array.ptr[0].type != msgpack::type::POSITIVE_INTEGER || + o.via.array.ptr[0].via.u64 >= sizeof...(Ts)) { + throw msgpack::type_error{}; + } + + v = detail::construct_variant, Ts...>( + o.via.array.ptr[0].as(), o.via.array.ptr[1], std::make_index_sequence()); + return o; + } + }; + + template struct pack> { + template + msgpack::packer& operator()(msgpack::packer& o, std::variant const& v) const + { + o.pack_array(2); + o.pack_uint64(v.index()); + std::visit([&o](auto const& value) { o.pack(value); }, v); + return o; + } + }; + + template struct object_with_zone> { + void operator()(msgpack::object::with_zone& o, std::variant const& v) const + { + msgpack::object* p = static_cast( + o.zone.allocate_align(sizeof(msgpack::object) * 2, MSGPACK_ZONE_ALIGNOF(msgpack::object))); + + o.type = msgpack::type::ARRAY; + o.via.array.size = 2; + o.via.array.ptr = p; + o.via.array.ptr[0] = msgpack::object(v.index(), o.zone); + std::visit(detail::object_variant_overload(o.via.array.ptr[1], o.zone), v); + } + }; + } // namespace adaptor +} +} // namespace msgpack + +#endif // MSGPACK_CPP_VERSION >= 201703 +#endif // defined(MSGPACK_USE_STD_VARIANT_ADAPTOR) +#endif // MSGPACK_V1_TYPE_VARIANT_HPP diff --git a/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/detail/cpp03_zone.hpp b/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/detail/cpp03_zone.hpp index 75ad3af3f86..0a7246d5ac7 100644 --- a/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/detail/cpp03_zone.hpp +++ b/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/detail/cpp03_zone.hpp @@ -10,664 +10,877 @@ #ifndef MSGPACK_V1_CPP03_ZONE_HPP #define MSGPACK_V1_CPP03_ZONE_HPP -#include "msgpack/versioning.hpp" +#include "msgpack/assert.hpp" #include "msgpack/cpp_config.hpp" +#include "msgpack/versioning.hpp" #include "msgpack/zone_decl.hpp" -#include "msgpack/assert.hpp" -#include #include #include +#include #include - namespace msgpack { /// @cond -MSGPACK_API_VERSION_NAMESPACE(v1) { -/// @endcond - -class zone { - struct finalizer { - finalizer(void (*func)(void*), void* data):m_func(func), m_data(data) {} - void operator()() { m_func(m_data); } - void (*m_func)(void*); - void* m_data; - }; - struct finalizer_array { - finalizer_array():m_tail(MSGPACK_NULLPTR), m_end(MSGPACK_NULLPTR), m_array(MSGPACK_NULLPTR) {} - void call() { - finalizer* fin = m_tail; - for(; fin != m_array; --fin) (*(fin-1))(); - } - ~finalizer_array() { - call(); - ::free(m_array); - } - void clear() { - call(); - m_tail = m_array; - } - void push(void (*func)(void* data), void* data) - { - finalizer* fin = m_tail; +MSGPACK_API_VERSION_NAMESPACE(v1) +{ + /// @endcond - if(fin == m_end) { - push_expand(func, data); - return; + class zone { + struct finalizer { + finalizer(void (*func)(void*), void* data, finalizer* next) + : m_func(func) + , m_data(data) + , m_next(next) + {} + void operator()() { m_func(m_data); } + void (*m_func)(void*); + void* m_data; + finalizer* m_next; + }; + + struct finalizer_array { + finalizer_array() + : m_head(MSGPACK_NULLPTR) + {} + + ~finalizer_array() { clear(); } + + void clear() + { + finalizer* fin = m_head; + finalizer* tmp = MSGPACK_NULLPTR; + while (fin) { + (*fin)(); + tmp = fin; + fin = fin->m_next; + delete tmp; + } + m_head = MSGPACK_NULLPTR; } - fin->m_func = func; - fin->m_data = data; + void push(void (*func)(void* data), void* data) { m_head = new finalizer(func, data, m_head); } - ++m_tail; - } - void push_expand(void (*func)(void*), void* data) { - const size_t nused = static_cast(m_end - m_array); - size_t nnext; - if(nused == 0) { - nnext = (sizeof(finalizer) < 72/2) ? - 72 / sizeof(finalizer) : 8; - } else { - nnext = nused * 2; + void pop() + { + finalizer* n = m_head->m_next; + delete m_head; + m_head = n; } - finalizer* tmp = - static_cast(::realloc(m_array, sizeof(finalizer) * nnext)); - if(!tmp) { - THROW std::bad_alloc(); - } - m_array = tmp; - m_end = tmp + nnext; - m_tail = tmp + nused; - new (m_tail) finalizer(func, data); - ++m_tail; - } - finalizer* m_tail; - finalizer* m_end; - finalizer* m_array; - }; - struct chunk { - chunk* m_next; - }; - struct chunk_list { - chunk_list(size_t chunk_size) - { - chunk* c = static_cast(::malloc(sizeof(chunk) + chunk_size)); - if(!c) { - THROW std::bad_alloc(); + finalizer* m_head; + + private: + finalizer_array(const finalizer_array&); + finalizer_array& operator=(const finalizer_array&); + }; + + struct chunk { + chunk* m_next; + }; + + struct chunk_list { + chunk_list(size_t chunk_size, char* ptr) + : m_free(chunk_size) + , m_ptr(ptr) + , m_head(MSGPACK_NULLPTR) + {} + ~chunk_list() + { + chunk* c = m_head; + while (c) { + chunk* n = c->m_next; + ::free(c); + c = n; + } + m_head = MSGPACK_NULLPTR; } - m_head = c; - m_free = chunk_size; - m_ptr = reinterpret_cast(c) + sizeof(chunk); - c->m_next = MSGPACK_NULLPTR; - } - ~chunk_list() - { - chunk* c = m_head; - while(c) { - chunk* n = c->m_next; - ::free(c); - c = n; - } - } - void clear(size_t chunk_size) - { - chunk* c = m_head; - while(true) { - chunk* n = c->m_next; - if(n) { + void clear(size_t chunk_size, char* ptr) + { + chunk* c = m_head; + while (c) { + chunk* n = c->m_next; ::free(c); c = n; - } else { - m_head = c; - break; } + m_head = MSGPACK_NULLPTR; + m_free = chunk_size; + m_ptr = ptr; } - m_head->m_next = MSGPACK_NULLPTR; - m_free = chunk_size; - m_ptr = reinterpret_cast(m_head) + sizeof(chunk); - } - size_t m_free; - char* m_ptr; - chunk* m_head; - }; - size_t m_chunk_size; - chunk_list m_chunk_list; - finalizer_array m_finalizer_array; -public: - zone(size_t chunk_size = MSGPACK_ZONE_CHUNK_SIZE); + size_t m_free; + char* m_ptr; + chunk* m_head; -public: - void* allocate_align(size_t size, size_t align = MSGPACK_ZONE_ALIGN); - void* allocate_no_align(size_t size); + private: + chunk_list(const chunk_list&); + chunk_list& operator=(const chunk_list&); + }; - void push_finalizer(void (*func)(void*), void* data); + size_t m_chunk_size; + chunk_list* m_chunk_list; + finalizer_array m_finalizer_array; - template - void push_finalizer(msgpack::unique_ptr obj); + public: + zone(size_t chunk_size = MSGPACK_ZONE_CHUNK_SIZE); + ~zone(); - void clear(); + void* allocate_align(size_t size, size_t align = MSGPACK_ZONE_ALIGN); - void swap(zone& o); - static void* operator new(std::size_t size) - { - void* p = ::malloc(size); - if (!p) THROW std::bad_alloc(); - return p; - } - static void operator delete(void *p) /* throw() */ - { - ::free(p); - } - static void* operator new(std::size_t size, void* place) /* throw() */ - { - return ::operator new(size, place); - } - static void operator delete(void* p, void* place) /* throw() */ - { - ::operator delete(p, place); - } - /// @cond - - template - T* allocate(); - - template - T* allocate(A1 a1); - - template - T* allocate(A1 a1, A2 a2); - - template - T* allocate(A1 a1, A2 a2, A3 a3); - - template - T* allocate(A1 a1, A2 a2, A3 a3, A4 a4); - - template - T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5); - - template - T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6); - - template - T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7); - - template - T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8); - - template - T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9); - - template - T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10); - - template - T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11); - - template - T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12); - - template - T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12, A13 a13); - - template - T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12, A13 a13, A14 a14); - - template - T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12, A13 a13, A14 a14, A15 a15); - - /// @endcond + void* allocate_no_align(size_t size); -private: - void undo_allocate(size_t size); + bool allocated() { return m_chunk_list != MSGPACK_NULLPTR; } - template - static void object_destruct(void* obj); + void push_finalizer(void (*func)(void*), void* data); - template - static void object_delete(void* obj); + template void push_finalizer(msgpack::unique_ptr obj); - static char* get_aligned(char* ptr, size_t align); + void clear(); - char* allocate_expand(size_t size); -private: - zone(const zone&); - zone& operator=(const zone&); -}; + void swap(zone& o); -inline zone::zone(size_t chunk_size):m_chunk_size(chunk_size), m_chunk_list(m_chunk_size) -{ -} - -inline char* zone::get_aligned(char* ptr, size_t align) -{ - MSGPACK_ASSERT(align != 0 && (align & (align - 1)) == 0); // align must be 2^n (n >= 0) - return - reinterpret_cast( - reinterpret_cast(ptr + (align - 1)) & ~static_cast(align - 1) - ); -} - -inline void* zone::allocate_align(size_t size, size_t align) -{ - char* aligned = get_aligned(m_chunk_list.m_ptr, align); - size_t adjusted_size = size + static_cast(aligned - m_chunk_list.m_ptr); - if (m_chunk_list.m_free < adjusted_size) { - size_t enough_size = size + align - 1; - char* ptr = allocate_expand(enough_size); - aligned = get_aligned(ptr, align); - adjusted_size = size + static_cast(aligned - m_chunk_list.m_ptr); - } - m_chunk_list.m_free -= adjusted_size; - m_chunk_list.m_ptr += adjusted_size; - return aligned; -} - -inline void* zone::allocate_no_align(size_t size) -{ - char* ptr = m_chunk_list.m_ptr; - if(m_chunk_list.m_free < size) { - ptr = allocate_expand(size); - } - m_chunk_list.m_free -= size; - m_chunk_list.m_ptr += size; - - return ptr; -} + static void* operator new(std::size_t size) + { + void* p = ::malloc(size); + if (!p) + throw std::bad_alloc(); + return p; + } -inline char* zone::allocate_expand(size_t size) -{ - chunk_list* const cl = &m_chunk_list; + static void operator delete(void* p) /* throw() */ { ::free(p); } + + static void* operator new(std::size_t /*size*/, void* mem) /* throw() */ { return mem; } + + static void operator delete(void* /*p*/, void* /*mem*/) /* throw() */ {} + + /// @cond + + template T* allocate(); + + template T* allocate(A1 a1); + + template T* allocate(A1 a1, A2 a2); + + template T* allocate(A1 a1, A2 a2, A3 a3); + + template + T* allocate(A1 a1, A2 a2, A3 a3, A4 a4); + + template + T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5); + + template + T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6); + + template + T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7); + + template + T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8); + + template + T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9); + + template + T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10); + + template + T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11); + + template + T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12); + + template + T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12, A13 a13); + + template + T* allocate( + A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12, A13 a13, A14 a14); + + template + T* allocate(A1 a1, + A2 a2, + A3 a3, + A4 a4, + A5 a5, + A6 a6, + A7 a7, + A8 a8, + A9 a9, + A10 a10, + A11 a11, + A12 a12, + A13 a13, + A14 a14, + A15 a15); + + /// @endcond + + private: + void undo_allocate(size_t size); + + template static void object_destruct(void* obj); + + template static void object_delete(void* obj); + + static char* get_aligned(char* ptr, size_t align); + + chunk_list& get_chank_lst(); + + char* allocate_expand(size_t size); + + private: + zone(const zone&); + zone& operator=(const zone&); + }; - size_t sz = m_chunk_size; + inline zone::zone(size_t chunk_size) + : m_chunk_size(chunk_size) + , m_chunk_list(MSGPACK_NULLPTR) + {} - while(sz < size) { - size_t tmp_sz = sz * 2; - if (tmp_sz <= sz) { - sz = size; - break; + inline zone::~zone() + { + m_finalizer_array.~finalizer_array(); + if (m_chunk_list) { + m_chunk_list->~chunk_list(); + ::free(m_chunk_list); + m_chunk_list = MSGPACK_NULLPTR; } - sz = tmp_sz; } - chunk* c = static_cast(::malloc(sizeof(chunk) + sz)); - if (!c) THROW std::bad_alloc(); - - char* ptr = reinterpret_cast(c) + sizeof(chunk); - - c->m_next = cl->m_head; - cl->m_head = c; - cl->m_free = sz; - cl->m_ptr = ptr; - - return ptr; -} + inline char* zone::get_aligned(char* ptr, size_t align) + { + MSGPACK_ASSERT(align != 0 && (align & (align - 1)) == 0); // align must be 2^n (n >= 0) + return reinterpret_cast(reinterpret_cast(ptr + (align - 1)) & + ~static_cast(align - 1)); + } -inline void zone::push_finalizer(void (*func)(void*), void* data) -{ - m_finalizer_array.push(func, data); -} + inline zone::chunk_list& zone::get_chank_lst() + { + if (!m_chunk_list) { + void* ptr = ::malloc(sizeof(chunk_list) + m_chunk_size); + if (!ptr) + throw std::bad_alloc(); + m_chunk_list = new (ptr) chunk_list(m_chunk_size, reinterpret_cast(ptr) + sizeof(chunk_list)); + } + return *m_chunk_list; + } -template -inline void zone::push_finalizer(msgpack::unique_ptr obj) -{ - m_finalizer_array.push(&zone::object_delete, obj.release()); -} + inline void* zone::allocate_align(size_t size, size_t align) + { + chunk_list& chank_lst = get_chank_lst(); + char* aligned = get_aligned(chank_lst.m_ptr, align); + size_t adjusted_size = size + static_cast(aligned - chank_lst.m_ptr); + if (chank_lst.m_free < adjusted_size) { + size_t enough_size = size + align - 1; + char* ptr = allocate_expand(enough_size); + aligned = get_aligned(ptr, align); + adjusted_size = size + static_cast(aligned - chank_lst.m_ptr); + } + chank_lst.m_free -= adjusted_size; + chank_lst.m_ptr += adjusted_size; + return aligned; + } -inline void zone::clear() -{ - m_finalizer_array.clear(); - m_chunk_list.clear(m_chunk_size); -} + inline void* zone::allocate_no_align(size_t size) + { + chunk_list& chank_lst = get_chank_lst(); + char* ptr = chank_lst.m_ptr; + if (chank_lst.m_free < size) { + ptr = allocate_expand(size); + } + chank_lst.m_free -= size; + chank_lst.m_ptr += size; -inline void zone::swap(zone& o) -{ - using std::swap; - swap(m_chunk_size, o.m_chunk_size); - swap(m_chunk_list, o.m_chunk_list); - swap(m_finalizer_array, o.m_finalizer_array); -} - -template -void zone::object_destruct(void* obj) -{ - static_cast(obj)->~T(); -} + return ptr; + } -template -void zone::object_delete(void* obj) -{ - delete static_cast(obj); -} + inline char* zone::allocate_expand(size_t size) + { + chunk_list& cl = get_chank_lst(); + size_t sz = m_chunk_size; + + while (sz < size) { + size_t tmp_sz = sz * 2; + if (tmp_sz <= sz) { + sz = size; + break; + } + sz = tmp_sz; + } -inline void zone::undo_allocate(size_t size) -{ - m_chunk_list.m_ptr -= size; - m_chunk_list.m_free += size; -} + chunk* c = static_cast(::malloc(sizeof(chunk) + sz)); + if (!c) + throw std::bad_alloc(); -inline std::size_t aligned_size( - std::size_t size, - std::size_t align) { - return (size + align - 1) / align * align; -} + char* ptr = reinterpret_cast(c) + sizeof(chunk); -/// @cond + c->m_next = cl.m_head; + cl.m_head = c; + cl.m_free = sz; + cl.m_ptr = ptr; -template -T* zone::allocate() -{ - void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); - try { - m_finalizer_array.push(&zone::object_destruct, x); - } catch (...) { - undo_allocate(sizeof(T)); - RETHROW; - } - try { - return new (x) T(); - } catch (...) { - --m_finalizer_array.m_tail; - undo_allocate(sizeof(T)); - RETHROW; + return ptr; } -} -template -T* zone::allocate(A1 a1) -{ - void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); - try { - m_finalizer_array.push(&zone::object_destruct, x); - } catch (...) { - undo_allocate(sizeof(T)); - RETHROW; - } - try { - return new (x) T(a1); - } catch (...) { - --m_finalizer_array.m_tail; - undo_allocate(sizeof(T)); - RETHROW; + inline void zone::push_finalizer(void (*func)(void*), void* data) + { + m_finalizer_array.push(func, data); } -} -template -T* zone::allocate(A1 a1, A2 a2) -{ - void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); - try { - m_finalizer_array.push(&zone::object_destruct, x); - } catch (...) { - undo_allocate(sizeof(T)); - RETHROW; - } - try { - return new (x) T(a1, a2); - } catch (...) { - --m_finalizer_array.m_tail; - undo_allocate(sizeof(T)); - RETHROW; + template inline void zone::push_finalizer(msgpack::unique_ptr obj) + { + m_finalizer_array.push(&zone::object_delete, obj.release()); } -} -template -T* zone::allocate(A1 a1, A2 a2, A3 a3) -{ - void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); - try { - m_finalizer_array.push(&zone::object_destruct, x); - } catch (...) { - undo_allocate(sizeof(T)); - RETHROW; - } - try { - return new (x) T(a1, a2, a3); - } catch (...) { - --m_finalizer_array.m_tail; - undo_allocate(sizeof(T)); - RETHROW; + inline void zone::clear() + { + m_finalizer_array.clear(); + if (m_chunk_list) { + m_chunk_list->clear(m_chunk_size, reinterpret_cast(m_chunk_list) + sizeof(chunk_list)); + } } -} -template -T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4) -{ - void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); - try { - m_finalizer_array.push(&zone::object_destruct, x); - } catch (...) { - undo_allocate(sizeof(T)); - RETHROW; - } - try { - return new (x) T(a1, a2, a3, a4); - } catch (...) { - --m_finalizer_array.m_tail; - undo_allocate(sizeof(T)); - RETHROW; + inline void zone::swap(zone & o) + { + using std::swap; + swap(m_chunk_size, o.m_chunk_size); + swap(m_chunk_list, o.m_chunk_list); + swap(m_finalizer_array.m_head, o.m_finalizer_array.m_head); } -} -template -T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) -{ - void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); - try { - m_finalizer_array.push(&zone::object_destruct, x); - } catch (...) { - undo_allocate(sizeof(T)); - RETHROW; - } - try { - return new (x) T(a1, a2, a3, a4, a5); - } catch (...) { - --m_finalizer_array.m_tail; - undo_allocate(sizeof(T)); - RETHROW; + template void zone::object_delete(void* obj) + { + delete static_cast(obj); } -} -template -T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) -{ - void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); - try { - m_finalizer_array.push(&zone::object_destruct, x); - } catch (...) { - undo_allocate(sizeof(T)); - RETHROW; - } - try { - return new (x) T(a1, a2, a3, a4, a5, a6); - } catch (...) { - --m_finalizer_array.m_tail; - undo_allocate(sizeof(T)); - RETHROW; + template void zone::object_destruct(void* obj) + { + static_cast(obj)->~T(); } -} -template -T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) -{ - void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); - try { - m_finalizer_array.push(&zone::object_destruct, x); - } catch (...) { - undo_allocate(sizeof(T)); - RETHROW; + inline void zone::undo_allocate(size_t size) + { + chunk_list& cl = get_chank_lst(); + cl.m_ptr -= size; + cl.m_free += size; } - try { - return new (x) T(a1, a2, a3, a4, a5, a6, a7); - } catch (...) { - --m_finalizer_array.m_tail; - undo_allocate(sizeof(T)); - RETHROW; + + inline std::size_t aligned_size(std::size_t size, std::size_t align) + { + return (size + align - 1) / align * align; } -} -template -T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) -{ - void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); - try { - m_finalizer_array.push(&zone::object_destruct, x); - } catch (...) { - undo_allocate(sizeof(T)); - RETHROW; + /// @cond + + template T* zone::allocate() + { + void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); + try { + m_finalizer_array.push(&zone::object_destruct, x); + } catch (...) { + undo_allocate(sizeof(T)); + throw; + } + try { + return new (x) T(); + } catch (...) { + m_finalizer_array.pop(); + undo_allocate(sizeof(T)); + throw; + } } - try { - return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8); - } catch (...) { - --m_finalizer_array.m_tail; - undo_allocate(sizeof(T)); - RETHROW; + + template T* zone::allocate(A1 a1) + { + void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); + try { + m_finalizer_array.push(&zone::object_destruct, x); + } catch (...) { + undo_allocate(sizeof(T)); + throw; + } + try { + return new (x) T(a1); + } catch (...) { + m_finalizer_array.pop(); + undo_allocate(sizeof(T)); + throw; + } } -} -template -T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9) -{ - void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); - try { - m_finalizer_array.push(&zone::object_destruct, x); - } catch (...) { - undo_allocate(sizeof(T)); - RETHROW; + template T* zone::allocate(A1 a1, A2 a2) + { + void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); + try { + m_finalizer_array.push(&zone::object_destruct, x); + } catch (...) { + undo_allocate(sizeof(T)); + throw; + } + try { + return new (x) T(a1, a2); + } catch (...) { + m_finalizer_array.pop(); + undo_allocate(sizeof(T)); + throw; + } } - try { - return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9); - } catch (...) { - --m_finalizer_array.m_tail; - undo_allocate(sizeof(T)); - RETHROW; + + template T* zone::allocate(A1 a1, A2 a2, A3 a3) + { + void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); + try { + m_finalizer_array.push(&zone::object_destruct, x); + } catch (...) { + undo_allocate(sizeof(T)); + throw; + } + try { + return new (x) T(a1, a2, a3); + } catch (...) { + m_finalizer_array.pop(); + undo_allocate(sizeof(T)); + throw; + } } -} -template -T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10) -{ - void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); - try { - m_finalizer_array.push(&zone::object_destruct, x); - } catch (...) { - undo_allocate(sizeof(T)); - RETHROW; + template + T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4) + { + void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); + try { + m_finalizer_array.push(&zone::object_destruct, x); + } catch (...) { + undo_allocate(sizeof(T)); + throw; + } + try { + return new (x) T(a1, a2, a3, a4); + } catch (...) { + m_finalizer_array.pop(); + undo_allocate(sizeof(T)); + throw; + } } - try { - return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); - } catch (...) { - --m_finalizer_array.m_tail; - undo_allocate(sizeof(T)); - RETHROW; + + template + T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) + { + void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); + try { + m_finalizer_array.push(&zone::object_destruct, x); + } catch (...) { + undo_allocate(sizeof(T)); + throw; + } + try { + return new (x) T(a1, a2, a3, a4, a5); + } catch (...) { + m_finalizer_array.pop(); + undo_allocate(sizeof(T)); + throw; + } } -} -template -T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11) -{ - void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); - try { - m_finalizer_array.push(&zone::object_destruct, x); - } catch (...) { - undo_allocate(sizeof(T)); - RETHROW; + template + T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) + { + void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); + try { + m_finalizer_array.push(&zone::object_destruct, x); + } catch (...) { + undo_allocate(sizeof(T)); + throw; + } + try { + return new (x) T(a1, a2, a3, a4, a5, a6); + } catch (...) { + m_finalizer_array.pop(); + undo_allocate(sizeof(T)); + throw; + } } - try { - return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11); - } catch (...) { - --m_finalizer_array.m_tail; - undo_allocate(sizeof(T)); - RETHROW; + + template + T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) + { + void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); + try { + m_finalizer_array.push(&zone::object_destruct, x); + } catch (...) { + undo_allocate(sizeof(T)); + throw; + } + try { + return new (x) T(a1, a2, a3, a4, a5, a6, a7); + } catch (...) { + m_finalizer_array.pop(); + undo_allocate(sizeof(T)); + throw; + } } -} -template -T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12) -{ - void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); - try { - m_finalizer_array.push(&zone::object_destruct, x); - } catch (...) { - undo_allocate(sizeof(T)); - RETHROW; + template + T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) + { + void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); + try { + m_finalizer_array.push(&zone::object_destruct, x); + } catch (...) { + undo_allocate(sizeof(T)); + throw; + } + try { + return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8); + } catch (...) { + m_finalizer_array.pop(); + undo_allocate(sizeof(T)); + throw; + } } - try { - return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12); - } catch (...) { - --m_finalizer_array.m_tail; - undo_allocate(sizeof(T)); - RETHROW; + + template + T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9) + { + void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); + try { + m_finalizer_array.push(&zone::object_destruct, x); + } catch (...) { + undo_allocate(sizeof(T)); + throw; + } + try { + return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9); + } catch (...) { + m_finalizer_array.pop(); + undo_allocate(sizeof(T)); + throw; + } } -} -template -T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12, A13 a13) -{ - void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); - try { - m_finalizer_array.push(&zone::object_destruct, x); - } catch (...) { - undo_allocate(sizeof(T)); - RETHROW; + template + T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10) + { + void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); + try { + m_finalizer_array.push(&zone::object_destruct, x); + } catch (...) { + undo_allocate(sizeof(T)); + throw; + } + try { + return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); + } catch (...) { + m_finalizer_array.pop(); + undo_allocate(sizeof(T)); + throw; + } } - try { - return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13); - } catch (...) { - --m_finalizer_array.m_tail; - undo_allocate(sizeof(T)); - RETHROW; + + template + T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11) + { + void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); + try { + m_finalizer_array.push(&zone::object_destruct, x); + } catch (...) { + undo_allocate(sizeof(T)); + throw; + } + try { + return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11); + } catch (...) { + m_finalizer_array.pop(); + undo_allocate(sizeof(T)); + throw; + } } -} -template -T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12, A13 a13, A14 a14) -{ - void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); - try { - m_finalizer_array.push(&zone::object_destruct, x); - } catch (...) { - undo_allocate(sizeof(T)); - RETHROW; + template + T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12) + { + void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); + try { + m_finalizer_array.push(&zone::object_destruct, x); + } catch (...) { + undo_allocate(sizeof(T)); + throw; + } + try { + return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12); + } catch (...) { + m_finalizer_array.pop(); + undo_allocate(sizeof(T)); + throw; + } } - try { - return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14); - } catch (...) { - --m_finalizer_array.m_tail; - undo_allocate(sizeof(T)); - RETHROW; + + template + T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12, A13 a13) + { + void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); + try { + m_finalizer_array.push(&zone::object_destruct, x); + } catch (...) { + undo_allocate(sizeof(T)); + throw; + } + try { + return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13); + } catch (...) { + m_finalizer_array.pop(); + undo_allocate(sizeof(T)); + throw; + } } -} -template -T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12, A13 a13, A14 a14, A15 a15) -{ - void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); - try { - m_finalizer_array.push(&zone::object_destruct, x); - } catch (...) { - undo_allocate(sizeof(T)); - RETHROW; + template + T* zone::allocate( + A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12, A13 a13, A14 a14) + { + void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); + try { + m_finalizer_array.push(&zone::object_destruct, x); + } catch (...) { + undo_allocate(sizeof(T)); + throw; + } + try { + return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14); + } catch (...) { + m_finalizer_array.pop(); + undo_allocate(sizeof(T)); + throw; + } } - try { - return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15); - } catch (...) { - --m_finalizer_array.m_tail; - undo_allocate(sizeof(T)); - RETHROW; + + template + T* zone::allocate(A1 a1, + A2 a2, + A3 a3, + A4 a4, + A5 a5, + A6 a6, + A7 a7, + A8 a8, + A9 a9, + A10 a10, + A11 a11, + A12 a12, + A13 a13, + A14 a14, + A15 a15) + { + void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); + try { + m_finalizer_array.push(&zone::object_destruct, x); + } catch (...) { + undo_allocate(sizeof(T)); + throw; + } + try { + return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15); + } catch (...) { + m_finalizer_array.pop(); + undo_allocate(sizeof(T)); + throw; + } } -} -/// @endcond + /// @endcond -/// @cond -} // MSGPACK_API_VERSION_NAMESPACE(v1) + /// @cond +} // MSGPACK_API_VERSION_NAMESPACE(v1) /// @endcond -} // namespace msgpack +} // namespace msgpack #endif // MSGPACK_V1_CPP03_ZONE_HPP diff --git a/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/detail/cpp11_zone.hpp b/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/detail/cpp11_zone.hpp index 0a0658e69da..e475798c34e 100644 --- a/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/detail/cpp11_zone.hpp +++ b/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/detail/cpp11_zone.hpp @@ -10,10 +10,10 @@ #ifndef MSGPACK_CPP11_ZONE_HPP #define MSGPACK_CPP11_ZONE_HPP -#include "msgpack/versioning.hpp" +#include "msgpack/assert.hpp" #include "msgpack/cpp_config.hpp" +#include "msgpack/versioning.hpp" #include "msgpack/zone_decl.hpp" -#include "msgpack/assert.hpp" #include #include @@ -23,347 +23,331 @@ namespace msgpack { /// @cond -MSGPACK_API_VERSION_NAMESPACE(v1) { -/// @endcond - -class zone { -private: - struct finalizer { - finalizer(void (*func)(void*), void* data):m_func(func), m_data(data) {} - void operator()() { m_func(m_data); } - void (*m_func)(void*); - void* m_data; - }; - struct finalizer_array { - finalizer_array():m_tail(MSGPACK_NULLPTR), m_end(MSGPACK_NULLPTR), m_array(MSGPACK_NULLPTR) {} - void call() { - finalizer* fin = m_tail; - for(; fin != m_array; --fin) (*(fin-1))(); - } - ~finalizer_array() { - call(); - ::free(m_array); - } - void clear() { - call(); - m_tail = m_array; - } - void push(void (*func)(void* data), void* data) - { - finalizer* fin = m_tail; - - if(fin == m_end) { - push_expand(func, data); - return; +MSGPACK_API_VERSION_NAMESPACE(v1) +{ + /// @endcond + + class zone { + private: + struct finalizer { + finalizer(void (*func)(void*), void* data, finalizer* next) + : m_func(func) + , m_data(data) + , m_next(next) + {} + void operator()() { m_func(m_data); } + void (*m_func)(void*); + void* m_data; + finalizer* m_next; + }; + + struct finalizer_array { + finalizer_array() + : m_head(MSGPACK_NULLPTR) + {} + + ~finalizer_array() { clear(); } + + void clear() + { + finalizer* fin = m_head; + finalizer* tmp = MSGPACK_NULLPTR; + while (fin) { + (*fin)(); + tmp = fin; + fin = fin->m_next; + delete tmp; + } + m_head = MSGPACK_NULLPTR; } - fin->m_func = func; - fin->m_data = data; + void push(void (*func)(void* data), void* data) { m_head = new finalizer(func, data, m_head); } - ++m_tail; - } - void push_expand(void (*func)(void*), void* data) { - const size_t nused = static_cast(m_end - m_array); - size_t nnext; - if(nused == 0) { - nnext = (sizeof(finalizer) < 72/2) ? - 72 / sizeof(finalizer) : 8; - } else { - nnext = nused * 2; - } - finalizer* tmp = - static_cast(::realloc(m_array, sizeof(finalizer) * nnext)); - if(!tmp) { - THROW std::bad_alloc(); + void pop() + { + auto n = m_head->m_next; + delete m_head; + m_head = n; } - m_array = tmp; - m_end = tmp + nnext; - m_tail = tmp + nused; - new (m_tail) finalizer(func, data); - - ++m_tail; - } - finalizer_array(finalizer_array&& other) noexcept - :m_tail(other.m_tail), m_end(other.m_end), m_array(other.m_array) - { - other.m_tail = MSGPACK_NULLPTR; - other.m_end = MSGPACK_NULLPTR; - other.m_array = MSGPACK_NULLPTR; - } - finalizer_array& operator=(finalizer_array&& other) noexcept - { - this->~finalizer_array(); - new (this) finalizer_array(std::move(other)); - return *this; - } - finalizer* m_tail; - finalizer* m_end; - finalizer* m_array; + finalizer_array(finalizer_array&& other) noexcept + : m_head(other.m_head) + { + other.m_head = MSGPACK_NULLPTR; + } - private: - finalizer_array(const finalizer_array&); - finalizer_array& operator=(const finalizer_array&); - }; - struct chunk { - chunk* m_next; - }; - struct chunk_list { - chunk_list(size_t chunk_size) - { - chunk* c = static_cast(::malloc(sizeof(chunk) + chunk_size)); - if(!c) { - THROW std::bad_alloc(); + finalizer_array& operator=(finalizer_array&& other) noexcept + { + m_head = other.m_head; + other.m_head = MSGPACK_NULLPTR; + return *this; } - m_head = c; - m_free = chunk_size; - m_ptr = reinterpret_cast(c) + sizeof(chunk); - c->m_next = MSGPACK_NULLPTR; - } - ~chunk_list() - { - chunk* c = m_head; - while(c) { - chunk* n = c->m_next; - ::free(c); - c = n; + private: + finalizer* m_head; + finalizer_array(const finalizer_array&); + finalizer_array& operator=(const finalizer_array&); + }; + + struct chunk { + chunk* m_next; + }; + + struct chunk_list { + chunk_list(size_t chunk_size, char* ptr) + : m_free(chunk_size) + , m_ptr(ptr) + , m_head(MSGPACK_NULLPTR) + {} + ~chunk_list() + { + chunk* c = m_head; + while (c) { + chunk* n = c->m_next; + ::free(c); + c = n; + } + m_head = MSGPACK_NULLPTR; } - } - void clear(size_t chunk_size) - { - chunk* c = m_head; - while(true) { - chunk* n = c->m_next; - if(n) { + + void clear(size_t chunk_size, char* ptr) + { + chunk* c = m_head; + while (c) { + chunk* n = c->m_next; ::free(c); c = n; - } else { - m_head = c; - break; } + m_head = MSGPACK_NULLPTR; + m_free = chunk_size; + m_ptr = ptr; } - m_head->m_next = MSGPACK_NULLPTR; - m_free = chunk_size; - m_ptr = reinterpret_cast(m_head) + sizeof(chunk); - } - chunk_list(chunk_list&& other) noexcept - :m_free(other.m_free), m_ptr(other.m_ptr), m_head(other.m_head) - { - other.m_head = MSGPACK_NULLPTR; - } - chunk_list& operator=(chunk_list&& other) noexcept - { - this->~chunk_list(); - new (this) chunk_list(std::move(other)); - return *this; - } - size_t m_free; - char* m_ptr; - chunk* m_head; - private: - chunk_list(const chunk_list&); - chunk_list& operator=(const chunk_list&); - }; - size_t m_chunk_size; - chunk_list m_chunk_list; - finalizer_array m_finalizer_array; + size_t m_free; + char* m_ptr; + chunk* m_head; -public: - zone(size_t chunk_size = MSGPACK_ZONE_CHUNK_SIZE); + private: + chunk_list(chunk_list&& other) noexcept = delete; + chunk_list& operator=(chunk_list&& other) noexcept = delete; + chunk_list(const chunk_list&); + chunk_list& operator=(const chunk_list&); + }; -public: - void* allocate_align(size_t size, size_t align = MSGPACK_ZONE_ALIGN); - void* allocate_no_align(size_t size); + size_t m_chunk_size; + chunk_list* m_chunk_list{}; + finalizer_array m_finalizer_array; - void push_finalizer(void (*func)(void*), void* data); + public: + zone(size_t chunk_size = MSGPACK_ZONE_CHUNK_SIZE); + ~zone(); - template - void push_finalizer(msgpack::unique_ptr obj); + void* allocate_align(size_t size, size_t align = MSGPACK_ZONE_ALIGN); - void clear(); + void* allocate_no_align(size_t size); - void swap(zone& o); + bool allocated() { return m_chunk_list != MSGPACK_NULLPTR; } - static void* operator new(std::size_t size) - { - void* p = ::malloc(size); - if (!p) THROW std::bad_alloc(); - return p; - } - static void operator delete(void *p) noexcept - { - ::free(p); - } - static void* operator new(std::size_t /*size*/, void* mem) noexcept - { - return mem; - } - static void operator delete(void * /*p*/, void* /*mem*/) noexcept - { - } + void push_finalizer(void (*func)(void*), void* data); - template - T* allocate(Args... args); + template void push_finalizer(msgpack::unique_ptr obj); - zone(zone&&) = default; - zone& operator=(zone&&) = default; - zone(const zone&) = delete; - zone& operator=(const zone&) = delete; + void clear(); -private: - void undo_allocate(size_t size); + void swap(zone& o); - template - static void object_destruct(void* obj); + static void* operator new(std::size_t size) + { + void* p = ::malloc(size); + if (!p) + throw std::bad_alloc(); + return p; + } - template - static void object_delete(void* obj); + static void operator delete(void* p) noexcept { ::free(p); } - static char* get_aligned(char* ptr, size_t align); + static void* operator new(std::size_t /*size*/, void* mem) noexcept { return mem; } - char* allocate_expand(size_t size); -}; + static void operator delete(void* /*p*/, void* /*mem*/) noexcept {} -inline zone::zone(size_t chunk_size):m_chunk_size(chunk_size), m_chunk_list(m_chunk_size) -{ -} + template T* allocate(Args... args); -inline char* zone::get_aligned(char* ptr, size_t align) -{ - MSGPACK_ASSERT(align != 0 && (align & (align - 1)) == 0); // align must be 2^n (n >= 0) - return - reinterpret_cast( - reinterpret_cast(ptr + (align - 1)) & ~static_cast(align - 1) - ); -} - -inline void* zone::allocate_align(size_t size, size_t align) -{ - char* aligned = get_aligned(m_chunk_list.m_ptr, align); - size_t adjusted_size = size + static_cast(aligned - m_chunk_list.m_ptr); - if (m_chunk_list.m_free < adjusted_size) { - size_t enough_size = size + align - 1; - char* ptr = allocate_expand(enough_size); - aligned = get_aligned(ptr, align); - adjusted_size = size + static_cast(aligned - m_chunk_list.m_ptr); - } - m_chunk_list.m_free -= adjusted_size; - m_chunk_list.m_ptr += adjusted_size; - return aligned; -} + zone(zone&&) = default; + zone& operator=(zone&&) = default; + zone(const zone&) = delete; + zone& operator=(const zone&) = delete; -inline void* zone::allocate_no_align(size_t size) -{ - char* ptr = m_chunk_list.m_ptr; - if(m_chunk_list.m_free < size) { - ptr = allocate_expand(size); - } - m_chunk_list.m_free -= size; - m_chunk_list.m_ptr += size; + private: + void undo_allocate(size_t size); - return ptr; -} + template static void object_destruct(void* obj); -inline char* zone::allocate_expand(size_t size) -{ - chunk_list* const cl = &m_chunk_list; + template static void object_delete(void* obj); - size_t sz = m_chunk_size; + static char* get_aligned(char* ptr, size_t align); - while(sz < size) { - size_t tmp_sz = sz * 2; - if (tmp_sz <= sz) { - sz = size; - break; + chunk_list& get_chank_lst(); + + char* allocate_expand(size_t size); + }; + + inline zone::zone(size_t chunk_size) + : m_chunk_size(chunk_size) + , m_chunk_list(MSGPACK_NULLPTR) + {} + + inline zone::~zone() + { + m_finalizer_array.~finalizer_array(); + if (m_chunk_list) { + m_chunk_list->~chunk_list(); + ::free(m_chunk_list); + m_chunk_list = MSGPACK_NULLPTR; } - sz = tmp_sz; } - chunk* c = static_cast(::malloc(sizeof(chunk) + sz)); - if (!c) THROW std::bad_alloc(); + inline char* zone::get_aligned(char* ptr, size_t align) + { + MSGPACK_ASSERT(align != 0 && (align & (align - 1)) == 0); // align must be 2^n (n >= 0) + return reinterpret_cast(reinterpret_cast(ptr + (align - 1)) & + ~static_cast(align - 1)); + } - char* ptr = reinterpret_cast(c) + sizeof(chunk); + inline zone::chunk_list& zone::get_chank_lst() + { + if (!m_chunk_list) { + auto ptr = ::malloc(sizeof(chunk_list) + m_chunk_size); + if (!ptr) + throw std::bad_alloc(); + m_chunk_list = new (ptr) chunk_list(m_chunk_size, reinterpret_cast(ptr) + sizeof(chunk_list)); + } + return *m_chunk_list; + } - c->m_next = cl->m_head; - cl->m_head = c; - cl->m_free = sz; - cl->m_ptr = ptr; + inline void* zone::allocate_align(size_t size, size_t align) + { + chunk_list& chank_lst = get_chank_lst(); + char* aligned = get_aligned(chank_lst.m_ptr, align); + size_t adjusted_size = size + static_cast(aligned - chank_lst.m_ptr); + if (chank_lst.m_free < adjusted_size) { + size_t enough_size = size + align - 1; + char* ptr = allocate_expand(enough_size); + aligned = get_aligned(ptr, align); + adjusted_size = size + static_cast(aligned - chank_lst.m_ptr); + } + chank_lst.m_free -= adjusted_size; + chank_lst.m_ptr += adjusted_size; + return aligned; + } - return ptr; -} + inline void* zone::allocate_no_align(size_t size) + { + chunk_list& chank_lst = get_chank_lst(); + char* ptr = chank_lst.m_ptr; + if (chank_lst.m_free < size) { + ptr = allocate_expand(size); + } + chank_lst.m_free -= size; + chank_lst.m_ptr += size; -inline void zone::push_finalizer(void (*func)(void*), void* data) -{ - m_finalizer_array.push(func, data); -} + return ptr; + } -template -inline void zone::push_finalizer(msgpack::unique_ptr obj) -{ - m_finalizer_array.push(&zone::object_delete, obj.release()); -} + inline char* zone::allocate_expand(size_t size) + { + chunk_list& cl = get_chank_lst(); + size_t sz = m_chunk_size; + + while (sz < size) { + size_t tmp_sz = sz * 2; + if (tmp_sz <= sz) { + sz = size; + break; + } + sz = tmp_sz; + } -inline void zone::clear() -{ - m_finalizer_array.clear(); - m_chunk_list.clear(m_chunk_size); -} + chunk* c = static_cast(::malloc(sizeof(chunk) + sz)); + if (!c) + throw std::bad_alloc(); -inline void zone::swap(zone& o) -{ - std::swap(*this, o); -} + char* ptr = reinterpret_cast(c) + sizeof(chunk); -template -void zone::object_delete(void* obj) -{ - delete static_cast(obj); -} + c->m_next = cl.m_head; + cl.m_head = c; + cl.m_free = sz; + cl.m_ptr = ptr; -template -void zone::object_destruct(void* obj) -{ - static_cast(obj)->~T(); -} + return ptr; + } -inline void zone::undo_allocate(size_t size) -{ - m_chunk_list.m_ptr -= size; - m_chunk_list.m_free += size; -} + inline void zone::push_finalizer(void (*func)(void*), void* data) + { + m_finalizer_array.push(func, data); + } + template inline void zone::push_finalizer(msgpack::unique_ptr obj) + { + m_finalizer_array.push(&zone::object_delete, obj.release()); + } -template -T* zone::allocate(Args... args) -{ - void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); - try { - m_finalizer_array.push(&zone::object_destruct, x); - } catch (...) { - undo_allocate(sizeof(T)); - RETHROW; + inline void zone::clear() + { + m_finalizer_array.clear(); + if (m_chunk_list) { + m_chunk_list->clear(m_chunk_size, reinterpret_cast(m_chunk_list) + sizeof(chunk_list)); + } } - try { - return new (x) T(args...); - } catch (...) { - --m_finalizer_array.m_tail; - undo_allocate(sizeof(T)); - RETHROW; + + inline void zone::swap(zone & o) + { + std::swap(*this, o); } -} -inline std::size_t aligned_size( - std::size_t size, - std::size_t align) { - return (size + align - 1) / align * align; -} + template void zone::object_delete(void* obj) + { + delete static_cast(obj); + } -/// @cond -} // MSGPACK_API_VERSION_NAMESPACE(v1) + template void zone::object_destruct(void* obj) + { + static_cast(obj)->~T(); + } + + inline void zone::undo_allocate(size_t size) + { + chunk_list& cl = get_chank_lst(); + cl.m_ptr -= size; + cl.m_free += size; + } + + inline std::size_t aligned_size(std::size_t size, std::size_t align) + { + return (size + align - 1) / align * align; + } + + template T* zone::allocate(Args... args) + { + void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); + try { + m_finalizer_array.push(&zone::object_destruct, x); + } catch (...) { + undo_allocate(sizeof(T)); + throw; + } + try { + return new (x) T(args...); + } catch (...) { + m_finalizer_array.pop(); + undo_allocate(sizeof(T)); + throw; + } + } + + /// @cond +} // MSGPACK_API_VERSION_NAMESPACE(v1) /// @endcond -} // namespace msgpack +} // namespace msgpack #endif // MSGPACK_CPP11_ZONE_HPP diff --git a/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/object_fwd.hpp b/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/object_fwd.hpp index 2562b41642b..83a9880c55a 100644 --- a/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/object_fwd.hpp +++ b/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/object_fwd.hpp @@ -16,232 +16,216 @@ namespace msgpack { /// @cond -MSGPACK_API_VERSION_NAMESPACE(v1) { -/// @endcond - -struct object_array { - uint32_t size; - msgpack::object* ptr; -}; +MSGPACK_API_VERSION_NAMESPACE(v1) +{ + /// @endcond -struct object_map { - uint32_t size; - msgpack::object_kv* ptr; -}; + struct object_array { + uint32_t size; + msgpack::object* ptr; + }; -struct object_str { - uint32_t size; - const char* ptr; -}; + struct object_map { + uint32_t size; + msgpack::object_kv* ptr; + }; -struct object_bin { - uint32_t size; - const char* ptr; -}; + struct object_str { + uint32_t size; + const char* ptr; + }; -struct object_ext { - int8_t type() const { return static_cast(ptr[0]); } - const char* data() const { return &ptr[1]; } - uint32_t size; - const char* ptr; -}; + struct object_bin { + uint32_t size; + const char* ptr; + }; + struct object_ext { + int8_t type() const { return static_cast(ptr[0]); } + const char* data() const { return &ptr[1]; } + uint32_t size; + const char* ptr; + }; #if !defined(MSGPACK_USE_CPP03) -template -struct has_as { -private: - template - static auto check(U*) -> - // Check v1 specialization - typename std::is_same< - decltype(adaptor::as()(std::declval())), - T - >::type; - template - static std::false_type check(...); -public: - using type = decltype(check(MSGPACK_NULLPTR)); - static constexpr bool value = type::value; -}; - -#endif // !defined(MSGPACK_USE_CPP03) - -/// Object class that corresponding to MessagePack format object -/** - * See https://github.com/msgpack/msgpack-c/wiki/v1_1_cpp_object - */ -struct object { - union union_type { - bool boolean; - uint64_t u64; - int64_t i64; -#if defined(MSGPACK_USE_LEGACY_NAME_AS_FLOAT) - MSGPACK_DEPRECATED("please use f64 instead") - double dec; // obsolete -#endif // MSGPACK_USE_LEGACY_NAME_AS_FLOAT - double f64; - msgpack::object_array array; - msgpack::object_map map; - msgpack::object_str str; - msgpack::object_bin bin; - msgpack::object_ext ext; + template struct has_as { + private: + template + static auto check_(U*) -> + // Check v1 specialization + typename std::is_same()(std::declval())), T>::type; + template static std::false_type check_(...); + + public: + using type = decltype(check_(MSGPACK_NULLPTR)); + static constexpr bool value = type::value; }; - msgpack::type::object_type type; - union_type via; +#endif // !defined(MSGPACK_USE_CPP03) - /// Cheking nil + /// Object class that corresponding to MessagePack format object /** - * @return If the object is nil, then return true, else return false. + * See https://github.com/msgpack/msgpack-c/wiki/v1_1_cpp_object */ - bool is_nil() const { return type == msgpack::type::NIL; } + struct object { + union union_type { + bool boolean; + uint64_t u64; + int64_t i64; +#if defined(MSGPACK_USE_LEGACY_NAME_AS_FLOAT) + MSGPACK_DEPRECATED("please use f64 instead") + double dec; // obsolete +#endif // MSGPACK_USE_LEGACY_NAME_AS_FLOAT + double f64; + msgpack::object_array array; + msgpack::object_map map; + msgpack::object_str str; + msgpack::object_bin bin; + msgpack::object_ext ext; + }; + + msgpack::type::object_type type; + union_type via; + + /// Cheking nil + /** + * @return If the object is nil, then return true, else return false. + */ + bool is_nil() const { return type == msgpack::type::NIL; } #if defined(MSGPACK_USE_CPP03) - /// Get value as T - /** - * If the object can't be converted to T, msgpack::type_error would be thrown. - * @tparam T The type you want to get. - * @return The converted object. - */ - template - T as() const; - -#else // defined(MSGPACK_USE_CPP03) - - /// Get value as T - /** - * If the object can't be converted to T, msgpack::type_error would be thrown. - * @tparam T The type you want to get. - * @return The converted object. - */ - template - typename std::enable_if::value, T>::type as() const; - - /// Get value as T - /** - * If the object can't be converted to T, msgpack::type_error would be thrown. - * @tparam T The type you want to get. - * @return The converted object. - */ - template - typename std::enable_if::value, T>::type as() const; + /// Get value as T + /** + * If the object can't be converted to T, msgpack::type_error would be thrown. + * @tparam T The type you want to get. + * @return The converted object. + */ + template T as() const; + +#else // defined(MSGPACK_USE_CPP03) + + /// Get value as T + /** + * If the object can't be converted to T, msgpack::type_error would be thrown. + * @tparam T The type you want to get. + * @return The converted object. + */ + template typename std::enable_if::value, T>::type as() const; + + /// Get value as T + /** + * If the object can't be converted to T, msgpack::type_error would be thrown. + * @tparam T The type you want to get. + * @return The converted object. + */ + template typename std::enable_if::value, T>::type as() const; #endif // defined(MSGPACK_USE_CPP03) - /// Convert the object - /** - * If the object can't be converted to T, msgpack::type_error would be thrown. - * @tparam T The type of v. - * @param v The value you want to get. `v` is output parameter. `v` is overwritten by converted value from the object. - * @return The reference of `v`. - */ - template - typename msgpack::enable_if< - !msgpack::is_array::value && !msgpack::is_pointer::value, - T& - >::type - convert(T& v) const; - - template - T (&convert(T(&v)[N]) const)[N]; + /// Convert the object + /** + * If the object can't be converted to T, msgpack::type_error would be thrown. + * @tparam T The type of v. + * @param v The value you want to get. `v` is output parameter. `v` is overwritten by converted value from the + * object. + * @return The reference of `v`. + */ + template + typename msgpack::enable_if::value && !msgpack::is_pointer::value, T&>::type convert( + T& v) const; + template T (&convert(T (&v)[N]) const)[N]; #if !defined(MSGPACK_DISABLE_LEGACY_CONVERT) - /// Convert the object (obsolete) - /** - * If the object can't be converted to T, msgpack::type_error would be thrown. - * @tparam T The type of v. - * @param v The pointer of the value you want to get. `v` is output parameter. `*v` is overwritten by converted value from the object. - * @return The pointer of `v`. - */ - template - MSGPACK_DEPRECATED("please use reference version instead") - typename msgpack::enable_if< - msgpack::is_pointer::value, - T - >::type - convert(T v) const; + /// Convert the object (obsolete) + /** + * If the object can't be converted to T, msgpack::type_error would be thrown. + * @tparam T The type of v. + * @param v The pointer of the value you want to get. `v` is output parameter. `*v` is overwritten by converted + * value from the object. + * @return The pointer of `v`. + */ + template + MSGPACK_DEPRECATED("please use reference version instead") + typename msgpack::enable_if::value, T>::type convert(T v) const; #endif // !defined(MSGPACK_DISABLE_LEGACY_CONVERT) - /// Convert the object if not nil - /** - * If the object is not nil and can't be converted to T, msgpack::type_error would be thrown. - * @tparam T The type of v. - * @param v The value you want to get. `v` is output parameter. `v` is overwritten by converted value from the object if the object is not nil. - * @return If the object is nil, then return false, else return true. - */ - template - bool convert_if_not_nil(T& v) const; - - /// Default constructor. The object is set to nil. - object(); - - /// Construct object from T - /** - * If `v` is the type that is corresponding to MessegePack format str, bin, ext, array, or map, - * you need to call `object(const T& v, msgpack::zone& z)` instead of this constructor. - * - * @tparam T The type of `v`. - * @param v The value you want to convert. - */ - template - explicit object(const T& v); - - /// Construct object from T - /** - * The object is constructed on the zone `z`. - * See https://github.com/msgpack/msgpack-c/wiki/v1_1_cpp_object - * - * @tparam T The type of `v`. - * @param v The value you want to convert. - * @param z The zone that is used by the object. - */ - template - object(const T& v, msgpack::zone& z); - - /// Construct object from T (obsolete) - /** - * The object is constructed on the zone `z`. - * Use `object(const T& v, msgpack::zone& z)` instead of this constructor. - * See https://github.com/msgpack/msgpack-c/wiki/v1_1_cpp_object - * - * @tparam T The type of `v`. - * @param v The value you want to convert. - * @param z The pointer to the zone that is used by the object. - */ - template - MSGPACK_DEPRECATED("please use zone reference version instead of the pointer version") - object(const T& v, msgpack::zone* z); - - template - object& operator=(const T& v); - - struct with_zone; - -protected: - struct implicit_type; - -public: - implicit_type convert() const; -}; + /// Convert the object if not nil + /** + * If the object is not nil and can't be converted to T, msgpack::type_error would be thrown. + * @tparam T The type of v. + * @param v The value you want to get. `v` is output parameter. `v` is overwritten by converted value from the + * object if the object is not nil. + * @return If the object is nil, then return false, else return true. + */ + template bool convert_if_not_nil(T& v) const; + + /// Default constructor. The object is set to nil. + object(); + + /// Construct object from T + /** + * If `v` is the type that is corresponding to MessegePack format str, bin, ext, array, or map, + * you need to call `object(const T& v, msgpack::zone& z)` instead of this constructor. + * + * @tparam T The type of `v`. + * @param v The value you want to convert. + */ + template explicit object(const T& v); + + /// Construct object from T + /** + * The object is constructed on the zone `z`. + * See https://github.com/msgpack/msgpack-c/wiki/v1_1_cpp_object + * + * @tparam T The type of `v`. + * @param v The value you want to convert. + * @param z The zone that is used by the object. + */ + template object(const T& v, msgpack::zone& z); + + /// Construct object from T (obsolete) + /** + * The object is constructed on the zone `z`. + * Use `object(const T& v, msgpack::zone& z)` instead of this constructor. + * See https://github.com/msgpack/msgpack-c/wiki/v1_1_cpp_object + * + * @tparam T The type of `v`. + * @param v The value you want to convert. + * @param z The pointer to the zone that is used by the object. + */ + template + MSGPACK_DEPRECATED("please use zone reference version instead of the pointer version") + object(const T& v, msgpack::zone* z); + + template object& operator=(const T& v); + + struct with_zone; + + protected: + struct implicit_type; + + public: + implicit_type convert() const; + }; -class type_error : public std::bad_cast { }; + class type_error : public std::bad_cast {}; -struct object::implicit_type { - implicit_type(object const& o) : obj(o) { } - ~implicit_type() { } + struct object::implicit_type { + implicit_type(object const& o) + : obj(o) + {} + ~implicit_type() {} - template - operator T(); + template operator T(); -private: - object const& obj; -}; + private: + object const& obj; + }; -/// @cond + /// @cond } // MSGPACK_API_VERSION_NAMESPACE(v1) /// @endcond diff --git a/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/pack.hpp b/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/pack.hpp index 7c1d0f6b6e8..4a3c5aa9e9f 100644 --- a/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/pack.hpp +++ b/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/pack.hpp @@ -12,1648 +12,1630 @@ #include "msgpack/v1/pack_decl.hpp" -#include -#include -#include #include +#include +#include #include +#include namespace msgpack { /// @cond -MSGPACK_API_VERSION_NAMESPACE(v1) { -/// @endcond - -/// The class template that supports continuous packing. -/** - * @tparam Stream Any type that have a member function `Stream write(const char*, size_t s)` - * - */ -template -class packer { -public: - /// Constructor - /** - * This constructor is left for compatibility. - * Use `packer(Stream& s)` instead of the constructor. - * - * @param s A pointer to packing destination stream object. - */ - packer(Stream* s); - /// Constructor - /** - * @param s Packing destination stream object. - */ - packer(Stream& s); - -public: - /// Packing function template - /** - * @tparam T The type of packing object. - * - * @param v a packing object. - * - * @return The reference of `*this`. - */ - template - packer& pack(const T& v); - - /// Packing uint8 - /** - * The byte size of the packed data depends on `d`. - * The packed type is positive fixnum or uint8. - * The minimum byte size expression is used. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_uint8(uint8_t d); - - /// Packing uint16 - /** - * The byte size of the packed data depends on `d`. - * The packed type is positive fixnum, uint8 or uint16. - * The minimum byte size expression is used. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_uint16(uint16_t d); - - /// Packing uint32 - /** - * The byte size of the packed data depends on `d`. - * The packed type is positive fixnum, uint8, uint16 or uint32. - * The minimum byte size expression is used. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_uint32(uint32_t d); - - /// Packing uint16 - /** - * The byte size of the packed data depends on `d`. - * The packed type is positive fixnum, uint8, uint16, uint32 or uint64. - * The minimum byte size expression is used. - * positive fixnum, uint8, uint16, or uint32 is used. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_uint64(uint64_t d); - - /// Packing int8 - /** - * The byte size of the packed data depends on `d`. - * If `d` is zero or positive, the packed type is positive fixnum, or uint8, - * else the packed type is negative fixnum, or int8 - * The minimum byte size expression is used. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_int8(int8_t d); - - /// Packing int16 - /** - * The byte size of the packed data depends on `d`. - * If `d` is zero or positive, the packed type is positive fixnum, uint8, or uint16, - * else the packed type is negative fixnum, int8, or int16. - * The minimum byte size expression is used. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_int16(int16_t d); - - /// Packing int32 - /** - * The byte size of the packed data depends on `d`. - * If `d` is zero or positive, the packed type is positive fixnum, uint8, uint16, or uint32, - * else the packed type is negative fixnum, int8, int16, or int32. - * The minimum byte size expression is used. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_int32(int32_t d); - - /// Packing int32 - /** - * The byte size of the packed data depends on `d`. - * If `d` is zero or positive, the packed type is positive fixnum, uint8, uint16, uint32, or uint64, - * else the packed type is negative fixnum, int8, int16, int32, or int64. - * The minimum byte size expression is used. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_int64(int64_t d); - - - - /// Packing uint8 (fixed packed type). - /** - * The packed type is always uint8. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_fix_uint8(uint8_t d); - - /// Packing uint8 (fixed packed type). - /** - * The packed type is always uint16. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_fix_uint16(uint16_t d); - - /// Packing uint8 (fixed packed type). - /** - * The packed type is always uint32. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_fix_uint32(uint32_t d); - - /// Packing uint8 (fixed packed type). - /** - * The packed type is always uint64. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_fix_uint64(uint64_t d); - - /// Packing uint8 (fixed packed type). - /** - * The packed type is always int8. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_fix_int8(int8_t d); - - /// Packing uint8 (fixed packed type). - /** - * The packed type is always int16. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_fix_int16(int16_t d); - - /// Packing uint8 (fixed packed type). - /** - * The packed type is always int32. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_fix_int32(int32_t d); - - /// Packing uint8 (fixed packed type). - /** - * The packed type is always int64. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_fix_int64(int64_t d); - - - /// Packing char - /** - * The byte size of the packed data depends on `d`. - * If `d` is zero or positive, the packed type is positive fixnum, or uint*, - * else the packed type is negative fixnum, or int* - * The minimum byte size expression is used. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_char(char d); - - /// Packing wchar_t - /** - * The byte size of the packed data depends on `d`. - * If `d` is zero or positive, the packed type is positive fixnum, or uint*, - * else the packed type is negative fixnum, or int* - * The minimum byte size expression is used. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_wchar(wchar_t d); - - /// Packing signed char - /** - * The byte size of the packed data depends on `d`. - * If `d` is zero or positive, the packed type is positive fixnum, or uint*, - * else the packed type is negative fixnum, or int* - * The minimum byte size expression is used. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_signed_char(signed char d); - - /// Packing short - /** - * The byte size of the packed data depends on `d`. - * If `d` is zero or positive, the packed type is positive fixnum, or uint*, - * else the packed type is negative fixnum, or int* - * The minimum byte size expression is used. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_short(short d); - - /// Packing int - /** - * The byte size of the packed data depends on `d`. - * If `d` is zero or positive, the packed type is positive fixnum, or uint*, - * else the packed type is negative fixnum, or int* - * The minimum byte size expression is used. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_int(int d); - - /// Packing long - /** - * The byte size of the packed data depends on `d`. - * If `d` is zero or positive, the packed type is positive fixnum, or uint*, - * else the packed type is negative fixnum, or int* - * The minimum byte size expression is used. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_long(long d); - - /// Packing long long - /** - * The byte size of the packed data depends on `d`. - * If `d` is zero or positive, the packed type is positive fixnum, or uint*, - * else the packed type is negative fixnum, or int* - * The minimum byte size expression is used. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_long_long(long long d); - - - /// Packing unsigned char - /** - * The byte size of the packed data depends on `d`. - * The packed type is positive fixnum, or uint*. - * The minimum byte size expression is used. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_unsigned_char(unsigned char d); - - /// Packing unsigned short - /** - * The byte size of the packed data depends on `d`. - * The packed type is positive fixnum, or uint*. - * The minimum byte size expression is used. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_unsigned_short(unsigned short d); - - /// Packing unsigned int - /** - * The byte size of the packed data depends on `d`. - * The packed type is positive fixnum, or uint*. - * The minimum byte size expression is used. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_unsigned_int(unsigned int d); - - /// Packing unsigned long - /** - * The byte size of the packed data depends on `d`. - * The packed type is positive fixnum, or uint*. - * The minimum byte size expression is used. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_unsigned_long(unsigned long d); - - /// Packing unsigned long long - /** - * The byte size of the packed data depends on `d`. - * The packed type is positive fixnum, or uint*. - * The minimum byte size expression is used. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_unsigned_long_long(unsigned long long d); - - /// Packing float - /** - * The packed type is float32. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-float - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_float(float d); - - /// Packing double - /** - * The packed type is float64. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-float - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_double(double d); - - - /// Packing nil - /** - * The packed type is nil. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-nil - * - * @return The reference of `*this`. - */ - packer& pack_nil(); - - /// Packing true - /** - * The packed type is bool, value is true. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#bool-format-family - * - * @return The reference of `*this`. - */ - packer& pack_true(); - - /// Packing false - /** - * The packed type is bool, value is false. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#bool-format-family - * - * @return The reference of `*this`. - */ - packer& pack_false(); - - /// Packing array header and size - /** - * The packed type is array header and array size. - * You need to pack `n` msgpack objects following this header and size. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#array-format-family - * - * @param n The number of array elements (array size). - * - * @return The reference of `*this`. - */ - packer& pack_array(uint32_t n); - - /// Packing map header and size - /** - * The packed type is map header and map size. - * You need to pack `n` pairs of msgpack objects following this header and size. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#map-format-family - * - * @param n The number of array elements (array size). - * - * @return The reference of `*this`. - */ - packer& pack_map(uint32_t n); - - - /// Packing str header and length - /** - * The packed type is str header and length. - * The minimum byte size length expression is used. - * You need to call `pack_str_body(const char* b, uint32_t l)` after this function calling with the same `l` value. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-str - * - * @param l The length of string. - * - * @return The reference of `*this`. - */ - packer& pack_str(uint32_t l); - - /// Packing str body - /** - * You need to call this function just after `pack_str(uint32_t l)` calling. - * The value `l` should be the same as `pack_str(uint32_t l)` argument `l`. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-str - * - * @param l The length of string. - * - * @return The reference of `*this`. - */ - packer& pack_str_body(const char* b, uint32_t l); - - /// Packing raw (v4) header and length - /** - * The packed type is raw header and length. - * The minimum byte size length expression is used. - * The format raw (v4) is old MessagePack version4 format. - * You need to call `pack_v4raw_body(const char* b, uint32_t l)` after this function calling with the same `l` value. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-str - * - * @param l The length of string. - * - * @return The reference of `*this`. - */ - packer& pack_v4raw(uint32_t l); +MSGPACK_API_VERSION_NAMESPACE(v1) +{ + /// @endcond - /// Packing raw (v4) body + /// The class template that supports continuous packing. /** - * The format raw (v4) is old MessagePack version4 format. - * You need to call this function just after `pack_v4raw(uint32_t l)` calling. - * The value `l` should be the same as `pack_v4raw(uint32_t l)` argument `l`. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-str - * - * @param l The length of string. + * @tparam Stream Any type that have a member function `Stream write(const char*, size_t s)` * - * @return The reference of `*this`. */ - packer& pack_v4raw_body(const char* b, uint32_t l); + template class packer { + public: + /// Constructor + /** + * This constructor is left for compatibility. + * Use `packer(Stream& s)` instead of the constructor. + * + * @param s A pointer to packing destination stream object. + */ + packer(Stream* s); + /// Constructor + /** + * @param s Packing destination stream object. + */ + packer(Stream& s); + + public: + /// Packing function template + /** + * @tparam T The type of packing object. + * + * @param v a packing object. + * + * @return The reference of `*this`. + */ + template packer& pack(const T& v); + + /// Packing uint8 + /** + * The byte size of the packed data depends on `d`. + * The packed type is positive fixnum or uint8. + * The minimum byte size expression is used. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_uint8(uint8_t d); + + /// Packing uint16 + /** + * The byte size of the packed data depends on `d`. + * The packed type is positive fixnum, uint8 or uint16. + * The minimum byte size expression is used. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_uint16(uint16_t d); + + /// Packing uint32 + /** + * The byte size of the packed data depends on `d`. + * The packed type is positive fixnum, uint8, uint16 or uint32. + * The minimum byte size expression is used. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_uint32(uint32_t d); + + /// Packing uint16 + /** + * The byte size of the packed data depends on `d`. + * The packed type is positive fixnum, uint8, uint16, uint32 or uint64. + * The minimum byte size expression is used. + * positive fixnum, uint8, uint16, or uint32 is used. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_uint64(uint64_t d); + + /// Packing int8 + /** + * The byte size of the packed data depends on `d`. + * If `d` is zero or positive, the packed type is positive fixnum, or uint8, + * else the packed type is negative fixnum, or int8 + * The minimum byte size expression is used. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_int8(int8_t d); + + /// Packing int16 + /** + * The byte size of the packed data depends on `d`. + * If `d` is zero or positive, the packed type is positive fixnum, uint8, or uint16, + * else the packed type is negative fixnum, int8, or int16. + * The minimum byte size expression is used. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_int16(int16_t d); + + /// Packing int32 + /** + * The byte size of the packed data depends on `d`. + * If `d` is zero or positive, the packed type is positive fixnum, uint8, uint16, or uint32, + * else the packed type is negative fixnum, int8, int16, or int32. + * The minimum byte size expression is used. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_int32(int32_t d); + + /// Packing int32 + /** + * The byte size of the packed data depends on `d`. + * If `d` is zero or positive, the packed type is positive fixnum, uint8, uint16, uint32, or uint64, + * else the packed type is negative fixnum, int8, int16, int32, or int64. + * The minimum byte size expression is used. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_int64(int64_t d); + + /// Packing uint8 (fixed packed type). + /** + * The packed type is always uint8. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_fix_uint8(uint8_t d); + + /// Packing uint8 (fixed packed type). + /** + * The packed type is always uint16. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_fix_uint16(uint16_t d); + + /// Packing uint8 (fixed packed type). + /** + * The packed type is always uint32. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_fix_uint32(uint32_t d); + + /// Packing uint8 (fixed packed type). + /** + * The packed type is always uint64. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_fix_uint64(uint64_t d); + + /// Packing uint8 (fixed packed type). + /** + * The packed type is always int8. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_fix_int8(int8_t d); + + /// Packing uint8 (fixed packed type). + /** + * The packed type is always int16. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_fix_int16(int16_t d); + + /// Packing uint8 (fixed packed type). + /** + * The packed type is always int32. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_fix_int32(int32_t d); + + /// Packing uint8 (fixed packed type). + /** + * The packed type is always int64. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_fix_int64(int64_t d); + + /// Packing char + /** + * The byte size of the packed data depends on `d`. + * If `d` is zero or positive, the packed type is positive fixnum, or uint*, + * else the packed type is negative fixnum, or int* + * The minimum byte size expression is used. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_char(char d); + + /// Packing wchar_t + /** + * The byte size of the packed data depends on `d`. + * If `d` is zero or positive, the packed type is positive fixnum, or uint*, + * else the packed type is negative fixnum, or int* + * The minimum byte size expression is used. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_wchar(wchar_t d); + + /// Packing signed char + /** + * The byte size of the packed data depends on `d`. + * If `d` is zero or positive, the packed type is positive fixnum, or uint*, + * else the packed type is negative fixnum, or int* + * The minimum byte size expression is used. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_signed_char(signed char d); + + /// Packing short + /** + * The byte size of the packed data depends on `d`. + * If `d` is zero or positive, the packed type is positive fixnum, or uint*, + * else the packed type is negative fixnum, or int* + * The minimum byte size expression is used. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_short(short d); + + /// Packing int + /** + * The byte size of the packed data depends on `d`. + * If `d` is zero or positive, the packed type is positive fixnum, or uint*, + * else the packed type is negative fixnum, or int* + * The minimum byte size expression is used. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_int(int d); + + /// Packing long + /** + * The byte size of the packed data depends on `d`. + * If `d` is zero or positive, the packed type is positive fixnum, or uint*, + * else the packed type is negative fixnum, or int* + * The minimum byte size expression is used. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_long(long d); + + /// Packing long long + /** + * The byte size of the packed data depends on `d`. + * If `d` is zero or positive, the packed type is positive fixnum, or uint*, + * else the packed type is negative fixnum, or int* + * The minimum byte size expression is used. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_long_long(long long d); + + /// Packing unsigned char + /** + * The byte size of the packed data depends on `d`. + * The packed type is positive fixnum, or uint*. + * The minimum byte size expression is used. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_unsigned_char(unsigned char d); + + /// Packing unsigned short + /** + * The byte size of the packed data depends on `d`. + * The packed type is positive fixnum, or uint*. + * The minimum byte size expression is used. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_unsigned_short(unsigned short d); + + /// Packing unsigned int + /** + * The byte size of the packed data depends on `d`. + * The packed type is positive fixnum, or uint*. + * The minimum byte size expression is used. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_unsigned_int(unsigned int d); + + /// Packing unsigned long + /** + * The byte size of the packed data depends on `d`. + * The packed type is positive fixnum, or uint*. + * The minimum byte size expression is used. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_unsigned_long(unsigned long d); + + /// Packing unsigned long long + /** + * The byte size of the packed data depends on `d`. + * The packed type is positive fixnum, or uint*. + * The minimum byte size expression is used. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_unsigned_long_long(unsigned long long d); + + /// Packing float + /** + * The packed type is float32. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-float + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_float(float d); + + /// Packing double + /** + * The packed type is float64. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-float + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_double(double d); + + /// Packing nil + /** + * The packed type is nil. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-nil + * + * @return The reference of `*this`. + */ + packer& pack_nil(); + + /// Packing true + /** + * The packed type is bool, value is true. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#bool-format-family + * + * @return The reference of `*this`. + */ + packer& pack_true(); + + /// Packing false + /** + * The packed type is bool, value is false. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#bool-format-family + * + * @return The reference of `*this`. + */ + packer& pack_false(); + + /// Packing array header and size + /** + * The packed type is array header and array size. + * You need to pack `n` msgpack objects following this header and size. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#array-format-family + * + * @param n The number of array elements (array size). + * + * @return The reference of `*this`. + */ + packer& pack_array(uint32_t n); + + /// Packing map header and size + /** + * The packed type is map header and map size. + * You need to pack `n` pairs of msgpack objects following this header and size. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#map-format-family + * + * @param n The number of array elements (array size). + * + * @return The reference of `*this`. + */ + packer& pack_map(uint32_t n); + + /// Packing str header and length + /** + * The packed type is str header and length. + * The minimum byte size length expression is used. + * You need to call `pack_str_body(const char* b, uint32_t l)` after this function calling with the same `l` + * value. See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-str + * + * @param l The length of string. + * + * @return The reference of `*this`. + */ + packer& pack_str(uint32_t l); + + /// Packing str body + /** + * You need to call this function just after `pack_str(uint32_t l)` calling. + * The value `l` should be the same as `pack_str(uint32_t l)` argument `l`. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-str + * + * @param l The length of string. + * + * @return The reference of `*this`. + */ + packer& pack_str_body(const char* b, uint32_t l); + + /// Packing raw (v4) header and length + /** + * The packed type is raw header and length. + * The minimum byte size length expression is used. + * The format raw (v4) is old MessagePack version4 format. + * You need to call `pack_v4raw_body(const char* b, uint32_t l)` after this function calling with the same `l` + * value. See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-str + * + * @param l The length of string. + * + * @return The reference of `*this`. + */ + packer& pack_v4raw(uint32_t l); + + /// Packing raw (v4) body + /** + * The format raw (v4) is old MessagePack version4 format. + * You need to call this function just after `pack_v4raw(uint32_t l)` calling. + * The value `l` should be the same as `pack_v4raw(uint32_t l)` argument `l`. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-str + * + * @param l The length of string. + * + * @return The reference of `*this`. + */ + packer& pack_v4raw_body(const char* b, uint32_t l); + + /// Packing bin header and length + /** + * The packed type is bin header and length. + * The minimum byte size length expression is used. + * You need to call `pack_bin_body(const char* b, uint32_t l)` after this function calling with the same `l` + * value. See https://github.com/msgpack/msgpack/blob/master/spec.md#bin-format-family + * + * @param l The length of string. + * + * @return The reference of `*this`. + */ + packer& pack_bin(uint32_t l); + + /// Packing bin body + /** + * You need to call this function just after `pack_bin(uint32_t l)` calling. + * The value `l` should be the same as `pack_bin(uint32_t l)` argument `l`. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#bin-format-family + * + * @param l The length of string. + * + * @return The reference of `*this`. + */ + packer& pack_bin_body(const char* b, uint32_t l); + + /// Packing ext header, type, and length + /** + * The packed type is ext. + * The minimum byte size length expression is used. + * The length 1, 2, 4, 8, and 16 can be encoded in the header. + * You need to call `pack_ext_body(const char* b, uint32_t l)` after this function calling with the same `l` + * value. See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-ext + * + * @param l The length of string. + * + * @return The reference of `*this`. + */ + packer& pack_ext(size_t l, int8_t type); + + /// Packing ext body + /** + * You need to call this function just after `pack_ext(size_t l, int8_t type)` calling. + * The value `l` should be the same as `pack_ext(size_t l, int8_t type)` argument `l`. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#bin-format-family + * + * @param l The length of string. + * + * @return The reference of `*this`. + */ + packer& pack_ext_body(const char* b, uint32_t l); + + private: + template void pack_imp_uint8(T d); + template void pack_imp_uint16(T d); + template void pack_imp_uint32(T d); + template void pack_imp_uint64(T d); + template void pack_imp_int8(T d); + template void pack_imp_int16(T d); + template void pack_imp_int32(T d); + template void pack_imp_int64(T d); + + void append_buffer(const char* buf, size_t len) { append_buffer(&Stream::write, buf, len); } + + template + void append_buffer(Ret (Cls::*)(const char*, SizeType), const char* buf, size_t len) + { + m_stream.write(buf, static_cast(len)); + } - /// Packing bin header and length - /** - * The packed type is bin header and length. - * The minimum byte size length expression is used. - * You need to call `pack_bin_body(const char* b, uint32_t l)` after this function calling with the same `l` value. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#bin-format-family - * - * @param l The length of string. - * - * @return The reference of `*this`. - */ - packer& pack_bin(uint32_t l); + private: + Stream& m_stream; - /// Packing bin body - /** - * You need to call this function just after `pack_bin(uint32_t l)` calling. - * The value `l` should be the same as `pack_bin(uint32_t l)` argument `l`. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#bin-format-family - * - * @param l The length of string. - * - * @return The reference of `*this`. - */ - packer& pack_bin_body(const char* b, uint32_t l); +#if defined(MSGPACK_USE_CPP03) + private: + packer(const packer&); + packer& operator=(const packer&); + packer(); +#else // defined(MSGPACK_USE_CPP03) + public: + packer(const packer&) = delete; + packer& operator=(const packer&) = delete; + packer() = delete; +#endif // defined(MSGPACK_USE_CPP03) + }; - /// Packing ext header, type, and length + /// Pack the value as MessagePack format into the stream /** - * The packed type is ext. - * The minimum byte size length expression is used. - * The length 1, 2, 4, 8, and 16 can be encoded in the header. - * You need to call `pack_ext_body(const char* b, uint32_t l)` after this function calling with the same `l` value. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-ext + * This function template is left for compatibility. + * Use `void pack(Stream& s, const T& v)` instead of the function template. * - * @param l The length of string. - * - * @return The reference of `*this`. + * @tparam Stream Any type that have a member function `Stream write(const char*, size_t s)` + * @tparam T Any type that is adapted to MessagePack + * @param s The pointer to packing destination stream + * @param v Packing value */ - packer& pack_ext(size_t l, int8_t type); + template inline void pack(Stream * s, const T& v) + { + packer(*s).pack(v); + } - /// Packing ext body + /// Pack the value as MessagePack format into the stream /** - * You need to call this function just after `pack_ext(size_t l, int8_t type)` calling. - * The value `l` should be the same as `pack_ext(size_t l, int8_t type)` argument `l`. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#bin-format-family - * - * @param l The length of string. - * - * @return The reference of `*this`. + * @tparam Stream Any type that have a member function `Stream write(const char*, size_t s)` + * @tparam T Any type that is adapted to MessagePack + * @param s Packing destination stream + * @param v Packing value */ - packer& pack_ext_body(const char* b, uint32_t l); - -private: - template - void pack_imp_uint8(T d); - template - void pack_imp_uint16(T d); - template - void pack_imp_uint32(T d); - template - void pack_imp_uint64(T d); - template - void pack_imp_int8(T d); - template - void pack_imp_int16(T d); - template - void pack_imp_int32(T d); - template - void pack_imp_int64(T d); - - void append_buffer(const char* buf, size_t len) + template inline void pack(Stream & s, const T& v) { - append_buffer(&Stream::write, buf, len); + packer(s).pack(v); } - template - void append_buffer(Ret (Cls::*)(const char*, SizeType), const char* buf, size_t len) +#if MSGPACK_ENDIAN_LITTLE_BYTE + template inline char take8_8(T d) { - m_stream.write(buf, static_cast(len)); + return static_cast(reinterpret_cast(&d)[0]); + } + template inline char take8_16(T d) + { + return static_cast(reinterpret_cast(&d)[0]); + } + template inline char take8_32(T d) + { + return static_cast(reinterpret_cast(&d)[0]); + } + template inline char take8_64(T d) + { + return static_cast(reinterpret_cast(&d)[0]); } - -private: - Stream& m_stream; - -#if defined(MSGPACK_USE_CPP03) -private: - packer(const packer&); - packer& operator=(const packer&); - packer(); -#else // defined(MSGPACK_USE_CPP03) -public: - packer(const packer&) = delete; - packer& operator=(const packer&) = delete; - packer() = delete; -#endif // defined(MSGPACK_USE_CPP03) -}; - - -/// Pack the value as MessagePack format into the stream -/** - * This function template is left for compatibility. - * Use `void pack(Stream& s, const T& v)` instead of the function template. - * - * @tparam Stream Any type that have a member function `Stream write(const char*, size_t s)` - * @tparam T Any type that is adapted to MessagePack - * @param s The pointer to packing destination stream - * @param v Packing value - */ -template -inline void pack(Stream* s, const T& v) -{ - packer(*s).pack(v); -} - -/// Pack the value as MessagePack format into the stream -/** - * @tparam Stream Any type that have a member function `Stream write(const char*, size_t s)` - * @tparam T Any type that is adapted to MessagePack - * @param s Packing destination stream - * @param v Packing value - */ -template -inline void pack(Stream& s, const T& v) -{ - packer(s).pack(v); -} - - -#if MSGPACK_ENDIAN_LITTLE_BYTE -template -inline char take8_8(T d) { - return static_cast(reinterpret_cast(&d)[0]); -} -template -inline char take8_16(T d) { - return static_cast(reinterpret_cast(&d)[0]); -} -template -inline char take8_32(T d) { - return static_cast(reinterpret_cast(&d)[0]); -} -template -inline char take8_64(T d) { - return static_cast(reinterpret_cast(&d)[0]); -} #elif MSGPACK_ENDIAN_BIG_BYTE -template -inline char take8_8(T d) { - return static_cast(reinterpret_cast(&d)[0]); -} -template -inline char take8_16(T d) { - return static_cast(reinterpret_cast(&d)[1]); -} -template -inline char take8_32(T d) { - return static_cast(reinterpret_cast(&d)[3]); -} -template -inline char take8_64(T d) { - return static_cast(reinterpret_cast(&d)[7]); -} + template inline char take8_8(T d) + { + return static_cast(reinterpret_cast(&d)[0]); + } + template inline char take8_16(T d) + { + return static_cast(reinterpret_cast(&d)[1]); + } + template inline char take8_32(T d) + { + return static_cast(reinterpret_cast(&d)[3]); + } + template inline char take8_64(T d) + { + return static_cast(reinterpret_cast(&d)[7]); + } #else #error msgpack-c supports only big endian and little endian #endif -template -inline packer::packer(Stream* s) : m_stream(*s) { } + template + inline packer::packer(Stream * s) + : m_stream(*s) + {} -template -inline packer::packer(Stream& s) : m_stream(s) { } + template + inline packer::packer(Stream & s) + : m_stream(s) + {} + template inline packer& packer::pack_uint8(uint8_t d) + { + pack_imp_uint8(d); + return *this; + } -template -inline packer& packer::pack_uint8(uint8_t d) -{ pack_imp_uint8(d); return *this; } + template inline packer& packer::pack_uint16(uint16_t d) + { + pack_imp_uint16(d); + return *this; + } -template -inline packer& packer::pack_uint16(uint16_t d) -{ pack_imp_uint16(d); return *this; } + template inline packer& packer::pack_uint32(uint32_t d) + { + pack_imp_uint32(d); + return *this; + } -template -inline packer& packer::pack_uint32(uint32_t d) -{ pack_imp_uint32(d); return *this; } + template inline packer& packer::pack_uint64(uint64_t d) + { + pack_imp_uint64(d); + return *this; + } -template -inline packer& packer::pack_uint64(uint64_t d) -{ pack_imp_uint64(d); return *this; } + template inline packer& packer::pack_int8(int8_t d) + { + pack_imp_int8(d); + return *this; + } -template -inline packer& packer::pack_int8(int8_t d) -{ pack_imp_int8(d); return *this; } + template inline packer& packer::pack_int16(int16_t d) + { + pack_imp_int16(d); + return *this; + } -template -inline packer& packer::pack_int16(int16_t d) -{ pack_imp_int16(d); return *this; } + template inline packer& packer::pack_int32(int32_t d) + { + pack_imp_int32(d); + return *this; + } -template -inline packer& packer::pack_int32(int32_t d) -{ pack_imp_int32(d); return *this; } + template inline packer& packer::pack_int64(int64_t d) + { + pack_imp_int64(d); + return *this; + } -template -inline packer& packer::pack_int64(int64_t d) -{ pack_imp_int64(d); return *this;} + template inline packer& packer::pack_fix_uint8(uint8_t d) + { + char buf[2] = { static_cast(0xccu), take8_8(d) }; + append_buffer(buf, 2); + return *this; + } + template inline packer& packer::pack_fix_uint16(uint16_t d) + { + char buf[3]; + buf[0] = static_cast(0xcdu); + _msgpack_store16(&buf[1], d); + append_buffer(buf, 3); + return *this; + } -template -inline packer& packer::pack_fix_uint8(uint8_t d) -{ - char buf[2] = {static_cast(0xccu), take8_8(d)}; - append_buffer(buf, 2); - return *this; -} + template inline packer& packer::pack_fix_uint32(uint32_t d) + { + char buf[5]; + buf[0] = static_cast(0xceu); + _msgpack_store32(&buf[1], d); + append_buffer(buf, 5); + return *this; + } -template -inline packer& packer::pack_fix_uint16(uint16_t d) -{ - char buf[3]; - buf[0] = static_cast(0xcdu); _msgpack_store16(&buf[1], d); - append_buffer(buf, 3); - return *this; -} - -template -inline packer& packer::pack_fix_uint32(uint32_t d) -{ - char buf[5]; - buf[0] = static_cast(0xceu); _msgpack_store32(&buf[1], d); - append_buffer(buf, 5); - return *this; -} - -template -inline packer& packer::pack_fix_uint64(uint64_t d) -{ - char buf[9]; - buf[0] = static_cast(0xcfu); _msgpack_store64(&buf[1], d); - append_buffer(buf, 9); - return *this; -} - -template -inline packer& packer::pack_fix_int8(int8_t d) -{ - char buf[2] = {static_cast(0xd0u), take8_8(d)}; - append_buffer(buf, 2); - return *this; -} + template inline packer& packer::pack_fix_uint64(uint64_t d) + { + char buf[9]; + buf[0] = static_cast(0xcfu); + _msgpack_store64(&buf[1], d); + append_buffer(buf, 9); + return *this; + } -template -inline packer& packer::pack_fix_int16(int16_t d) -{ - char buf[3]; - buf[0] = static_cast(0xd1u); _msgpack_store16(&buf[1], (uint16_t)d); - append_buffer(buf, 3); - return *this; -} - -template -inline packer& packer::pack_fix_int32(int32_t d) -{ - char buf[5]; - buf[0] = static_cast(0xd2u); _msgpack_store32(&buf[1], (uint32_t)d); - append_buffer(buf, 5); - return *this; -} - -template -inline packer& packer::pack_fix_int64(int64_t d) -{ - char buf[9]; - buf[0] = static_cast(0xd3u); _msgpack_store64(&buf[1], d); - append_buffer(buf, 9); - return *this; -} + template inline packer& packer::pack_fix_int8(int8_t d) + { + char buf[2] = { static_cast(0xd0u), take8_8(d) }; + append_buffer(buf, 2); + return *this; + } + template inline packer& packer::pack_fix_int16(int16_t d) + { + char buf[3]; + buf[0] = static_cast(0xd1u); + _msgpack_store16(&buf[1], (uint16_t)d); + append_buffer(buf, 3); + return *this; + } -template -inline packer& packer::pack_char(char d) -{ + template inline packer& packer::pack_fix_int32(int32_t d) + { + char buf[5]; + buf[0] = static_cast(0xd2u); + _msgpack_store32(&buf[1], (uint32_t)d); + append_buffer(buf, 5); + return *this; + } + + template inline packer& packer::pack_fix_int64(int64_t d) + { + char buf[9]; + buf[0] = static_cast(0xd3u); + _msgpack_store64(&buf[1], d); + append_buffer(buf, 9); + return *this; + } + + template inline packer& packer::pack_char(char d) + { #if defined(CHAR_MIN) #if CHAR_MIN < 0 - pack_imp_int8(d); + pack_imp_int8(d); #else - pack_imp_uint8(d); + pack_imp_uint8(d); #endif #else #error CHAR_MIN is not defined #endif - return *this; -} - -template -inline packer& packer::pack_wchar(wchar_t d) -{ - if (d < 0) { - pack_imp_int64(static_cast(d)); + return *this; } - else { - pack_imp_uint64(static_cast(d)); + + template inline packer& packer::pack_wchar(wchar_t d) + { + if (d < 0) { + pack_imp_int64(static_cast(d)); + } else { + pack_imp_uint64(static_cast(d)); + } + return *this; } - return *this; -} -template -inline packer& packer::pack_signed_char(signed char d) -{ - pack_imp_int8(d); - return *this; -} + template inline packer& packer::pack_signed_char(signed char d) + { + pack_imp_int8(d); + return *this; + } -template -inline packer& packer::pack_short(short d) -{ + template inline packer& packer::pack_short(short d) + { #if defined(SIZEOF_SHORT) #if SIZEOF_SHORT == 2 - pack_imp_int16(d); + pack_imp_int16(d); #elif SIZEOF_SHORT == 4 - pack_imp_int32(d); + pack_imp_int32(d); #else - pack_imp_int64(d); + pack_imp_int64(d); #endif #elif defined(SHRT_MAX) #if SHRT_MAX == 0x7fff - pack_imp_int16(d); + pack_imp_int16(d); #elif SHRT_MAX == 0x7fffffff - pack_imp_int32(d); + pack_imp_int32(d); #else - pack_imp_int64(d); + pack_imp_int64(d); #endif #else - if(sizeof(short) == 2) { - pack_imp_int16(d); - } else if(sizeof(short) == 4) { - pack_imp_int32(d); - } else { - pack_imp_int64(d); - } + if (sizeof(short) == 2) { + pack_imp_int16(d); + } else if (sizeof(short) == 4) { + pack_imp_int32(d); + } else { + pack_imp_int64(d); + } #endif - return *this; -} + return *this; + } -template -inline packer& packer::pack_int(int d) -{ + template inline packer& packer::pack_int(int d) + { #if defined(SIZEOF_INT) #if SIZEOF_INT == 2 - pack_imp_int16(d); + pack_imp_int16(d); #elif SIZEOF_INT == 4 - pack_imp_int32(d); + pack_imp_int32(d); #else - pack_imp_int64(d); + pack_imp_int64(d); #endif #elif defined(INT_MAX) #if INT_MAX == 0x7fff - pack_imp_int16(d); + pack_imp_int16(d); #elif INT_MAX == 0x7fffffff - pack_imp_int32(d); + pack_imp_int32(d); #else - pack_imp_int64(d); + pack_imp_int64(d); #endif #else - if(sizeof(int) == 2) { - pack_imp_int16(d); - } else if(sizeof(int) == 4) { - pack_imp_int32(d); - } else { - pack_imp_int64(d); - } + if (sizeof(int) == 2) { + pack_imp_int16(d); + } else if (sizeof(int) == 4) { + pack_imp_int32(d); + } else { + pack_imp_int64(d); + } #endif - return *this; -} + return *this; + } -template -inline packer& packer::pack_long(long d) -{ + template inline packer& packer::pack_long(long d) + { #if defined(SIZEOF_LONG) #if SIZEOF_LONG == 2 - pack_imp_int16(d); + pack_imp_int16(d); #elif SIZEOF_LONG == 4 - pack_imp_int32(d); + pack_imp_int32(d); #else - pack_imp_int64(d); + pack_imp_int64(d); #endif #elif defined(LONG_MAX) #if LONG_MAX == 0x7fffL - pack_imp_int16(d); + pack_imp_int16(d); #elif LONG_MAX == 0x7fffffffL - pack_imp_int32(d); + pack_imp_int32(d); #else - pack_imp_int64(d); + pack_imp_int64(d); #endif #else - if(sizeof(long) == 2) { - pack_imp_int16(d); - } else if(sizeof(long) == 4) { - pack_imp_int32(d); - } else { - pack_imp_int64(d); - } + if (sizeof(long) == 2) { + pack_imp_int16(d); + } else if (sizeof(long) == 4) { + pack_imp_int32(d); + } else { + pack_imp_int64(d); + } #endif - return *this; -} + return *this; + } -template -inline packer& packer::pack_long_long(long long d) -{ + template inline packer& packer::pack_long_long(long long d) + { #if defined(SIZEOF_LONG_LONG) #if SIZEOF_LONG_LONG == 2 - pack_imp_int16(d); + pack_imp_int16(d); #elif SIZEOF_LONG_LONG == 4 - pack_imp_int32(d); + pack_imp_int32(d); #else - pack_imp_int64(d); + pack_imp_int64(d); #endif #elif defined(LLONG_MAX) #if LLONG_MAX == 0x7fffL - pack_imp_int16(d); + pack_imp_int16(d); #elif LLONG_MAX == 0x7fffffffL - pack_imp_int32(d); + pack_imp_int32(d); #else - pack_imp_int64(d); + pack_imp_int64(d); #endif #else - if(sizeof(long long) == 2) { - pack_imp_int16(d); - } else if(sizeof(long long) == 4) { - pack_imp_int32(d); - } else { - pack_imp_int64(d); - } + if (sizeof(long long) == 2) { + pack_imp_int16(d); + } else if (sizeof(long long) == 4) { + pack_imp_int32(d); + } else { + pack_imp_int64(d); + } #endif - return *this; -} - + return *this; + } -template -inline packer& packer::pack_unsigned_char(unsigned char d) -{ - pack_imp_uint8(d); - return *this; -} + template inline packer& packer::pack_unsigned_char(unsigned char d) + { + pack_imp_uint8(d); + return *this; + } -template -inline packer& packer::pack_unsigned_short(unsigned short d) -{ + template inline packer& packer::pack_unsigned_short(unsigned short d) + { #if defined(SIZEOF_SHORT) #if SIZEOF_SHORT == 2 - pack_imp_uint16(d); + pack_imp_uint16(d); #elif SIZEOF_SHORT == 4 - pack_imp_uint32(d); + pack_imp_uint32(d); #else - pack_imp_uint64(d); + pack_imp_uint64(d); #endif #elif defined(USHRT_MAX) #if USHRT_MAX == 0xffffU - pack_imp_uint16(d); + pack_imp_uint16(d); #elif USHRT_MAX == 0xffffffffU - pack_imp_uint32(d); + pack_imp_uint32(d); #else - pack_imp_uint64(d); + pack_imp_uint64(d); #endif #else - if(sizeof(unsigned short) == 2) { - pack_imp_uint16(d); - } else if(sizeof(unsigned short) == 4) { - pack_imp_uint32(d); - } else { - pack_imp_uint64(d); - } + if (sizeof(unsigned short) == 2) { + pack_imp_uint16(d); + } else if (sizeof(unsigned short) == 4) { + pack_imp_uint32(d); + } else { + pack_imp_uint64(d); + } #endif - return *this; -} + return *this; + } -template -inline packer& packer::pack_unsigned_int(unsigned int d) -{ + template inline packer& packer::pack_unsigned_int(unsigned int d) + { #if defined(SIZEOF_INT) #if SIZEOF_INT == 2 - pack_imp_uint16(d); + pack_imp_uint16(d); #elif SIZEOF_INT == 4 - pack_imp_uint32(d); + pack_imp_uint32(d); #else - pack_imp_uint64(d); + pack_imp_uint64(d); #endif #elif defined(UINT_MAX) #if UINT_MAX == 0xffffU - pack_imp_uint16(d); + pack_imp_uint16(d); #elif UINT_MAX == 0xffffffffU - pack_imp_uint32(d); + pack_imp_uint32(d); #else - pack_imp_uint64(d); + pack_imp_uint64(d); #endif #else - if(sizeof(unsigned int) == 2) { - pack_imp_uint16(d); - } else if(sizeof(unsigned int) == 4) { - pack_imp_uint32(d); - } else { - pack_imp_uint64(d); - } + if (sizeof(unsigned int) == 2) { + pack_imp_uint16(d); + } else if (sizeof(unsigned int) == 4) { + pack_imp_uint32(d); + } else { + pack_imp_uint64(d); + } #endif - return *this; -} + return *this; + } -template -inline packer& packer::pack_unsigned_long(unsigned long d) -{ + template inline packer& packer::pack_unsigned_long(unsigned long d) + { #if defined(SIZEOF_LONG) #if SIZEOF_LONG == 2 - pack_imp_uint16(d); + pack_imp_uint16(d); #elif SIZEOF_LONG == 4 - pack_imp_uint32(d); + pack_imp_uint32(d); #else - pack_imp_uint64(d); + pack_imp_uint64(d); #endif #elif defined(ULONG_MAX) #if ULONG_MAX == 0xffffUL - pack_imp_uint16(d); + pack_imp_uint16(d); #elif ULONG_MAX == 0xffffffffUL - pack_imp_uint32(d); + pack_imp_uint32(d); #else - pack_imp_uint64(d); + pack_imp_uint64(d); #endif #else - if(sizeof(unsigned long) == 2) { - pack_imp_uint16(d); - } else if(sizeof(unsigned long) == 4) { - pack_imp_uint32(d); - } else { - pack_imp_uint64(d); - } + if (sizeof(unsigned long) == 2) { + pack_imp_uint16(d); + } else if (sizeof(unsigned long) == 4) { + pack_imp_uint32(d); + } else { + pack_imp_uint64(d); + } #endif - return *this; -} + return *this; + } -template -inline packer& packer::pack_unsigned_long_long(unsigned long long d) -{ + template inline packer& packer::pack_unsigned_long_long(unsigned long long d) + { #if defined(SIZEOF_LONG_LONG) #if SIZEOF_LONG_LONG == 2 - pack_imp_uint16(d); + pack_imp_uint16(d); #elif SIZEOF_LONG_LONG == 4 - pack_imp_uint32(d); + pack_imp_uint32(d); #else - pack_imp_uint64(d); + pack_imp_uint64(d); #endif #elif defined(ULLONG_MAX) #if ULLONG_MAX == 0xffffUL - pack_imp_uint16(d); + pack_imp_uint16(d); #elif ULLONG_MAX == 0xffffffffUL - pack_imp_uint32(d); + pack_imp_uint32(d); #else - pack_imp_uint64(d); + pack_imp_uint64(d); #endif #else - if(sizeof(unsigned long long) == 2) { - pack_imp_uint16(d); - } else if(sizeof(unsigned long long) == 4) { - pack_imp_uint32(d); - } else { - pack_imp_uint64(d); - } + if (sizeof(unsigned long long) == 2) { + pack_imp_uint16(d); + } else if (sizeof(unsigned long long) == 4) { + pack_imp_uint32(d); + } else { + pack_imp_uint64(d); + } #endif - return *this; -} - + return *this; + } -template -inline packer& packer::pack_float(float d) -{ - if(d == d) { // check for nan - // compare d to limits to avoid undefined behaviour - if(d >= 0 && d <= float(std::numeric_limits::max()) && d == float(uint64_t(d))) { - pack_imp_uint64(uint64_t(d)); - return *this; - } else if(d < 0 && d >= float(std::numeric_limits::min()) && d == float(int64_t(d))) { - pack_imp_int64(int64_t(d)); - return *this; + template inline packer& packer::pack_float(float d) + { + if (d == d) { // check for nan + // compare d to limits to avoid undefined behaviour + if (d >= 0 && d <= float(std::numeric_limits::max()) && d == float(uint64_t(d))) { + pack_imp_uint64(uint64_t(d)); + return *this; + } else if (d < 0 && d >= float(std::numeric_limits::min()) && d == float(int64_t(d))) { + pack_imp_int64(int64_t(d)); + return *this; + } } - } - union { float f; uint32_t i; } mem; - mem.f = d; - char buf[5]; - buf[0] = static_cast(0xcau); _msgpack_store32(&buf[1], mem.i); - append_buffer(buf, 5); - return *this; -} + union { + float f; + uint32_t i; + } mem; + mem.f = d; + char buf[5]; + buf[0] = static_cast(0xcau); + _msgpack_store32(&buf[1], mem.i); + append_buffer(buf, 5); + return *this; + } -template -inline packer& packer::pack_double(double d) -{ - if(d == d) { // check for nan - // compare d to limits to avoid undefined behaviour - if(d >= 0 && d <= double(std::numeric_limits::max()) && d == double(uint64_t(d))) { - pack_imp_uint64(uint64_t(d)); - return *this; - } else if(d < 0 && d >= double(std::numeric_limits::min()) && d == double(int64_t(d))) { - pack_imp_int64(int64_t(d)); - return *this; + template inline packer& packer::pack_double(double d) + { + if (d == d) { // check for nan + // compare d to limits to avoid undefined behaviour + if (d >= 0 && d <= double(std::numeric_limits::max()) && d == double(uint64_t(d))) { + pack_imp_uint64(uint64_t(d)); + return *this; + } else if (d < 0 && d >= double(std::numeric_limits::min()) && d == double(int64_t(d))) { + pack_imp_int64(int64_t(d)); + return *this; + } } - } - union { double f; uint64_t i; } mem; - mem.f = d; - char buf[9]; - buf[0] = static_cast(0xcbu); + union { + double f; + uint64_t i; + } mem; + mem.f = d; + char buf[9]; + buf[0] = static_cast(0xcbu); #if defined(TARGET_OS_IPHONE) - // ok + // ok #elif defined(__arm__) && !(__ARM_EABI__) // arm-oabi - // https://github.com/msgpack/msgpack-perl/pull/1 - mem.i = (mem.i & 0xFFFFFFFFUL) << 32UL | (mem.i >> 32UL); + // https://github.com/msgpack/msgpack-perl/pull/1 + mem.i = (mem.i & 0xFFFFFFFFUL) << 32UL | (mem.i >> 32UL); #endif - _msgpack_store64(&buf[1], mem.i); - append_buffer(buf, 9); - return *this; -} - - -template -inline packer& packer::pack_nil() -{ - const char d = static_cast(0xc0u); - append_buffer(&d, 1); - return *this; -} - -template -inline packer& packer::pack_true() -{ - const char d = static_cast(0xc3u); - append_buffer(&d, 1); - return *this; -} - -template -inline packer& packer::pack_false() -{ - const char d = static_cast(0xc2u); - append_buffer(&d, 1); - return *this; -} - + _msgpack_store64(&buf[1], mem.i); + append_buffer(buf, 9); + return *this; + } -template -inline packer& packer::pack_array(uint32_t n) -{ - if(n < 16) { - char d = static_cast(0x90u | n); + template inline packer& packer::pack_nil() + { + const char d = static_cast(0xc0u); append_buffer(&d, 1); - } else if(n < 65536) { - char buf[3]; - buf[0] = static_cast(0xdcu); _msgpack_store16(&buf[1], static_cast(n)); - append_buffer(buf, 3); - } else { - char buf[5]; - buf[0] = static_cast(0xddu); _msgpack_store32(&buf[1], static_cast(n)); - append_buffer(buf, 5); + return *this; } - return *this; -} -template -inline packer& packer::pack_map(uint32_t n) -{ - if(n < 16) { - unsigned char d = static_cast(0x80u | n); - char buf = take8_8(d); - append_buffer(&buf, 1); - } else if(n < 65536) { - char buf[3]; - buf[0] = static_cast(0xdeu); _msgpack_store16(&buf[1], static_cast(n)); - append_buffer(buf, 3); - } else { - char buf[5]; - buf[0] = static_cast(0xdfu); _msgpack_store32(&buf[1], static_cast(n)); - append_buffer(buf, 5); + template inline packer& packer::pack_true() + { + const char d = static_cast(0xc3u); + append_buffer(&d, 1); + return *this; } - return *this; -} -template -inline packer& packer::pack_str(uint32_t l) -{ - if(l < 32) { - unsigned char d = static_cast(0xa0u | l); - char buf = take8_8(d); - append_buffer(&buf, 1); - } else if(l < 256) { - char buf[2]; - buf[0] = static_cast(0xd9u); buf[1] = static_cast(l); - append_buffer(buf, 2); - } else if(l < 65536) { - char buf[3]; - buf[0] = static_cast(0xdau); _msgpack_store16(&buf[1], static_cast(l)); - append_buffer(buf, 3); - } else { - char buf[5]; - buf[0] = static_cast(0xdbu); _msgpack_store32(&buf[1], static_cast(l)); - append_buffer(buf, 5); + template inline packer& packer::pack_false() + { + const char d = static_cast(0xc2u); + append_buffer(&d, 1); + return *this; } - return *this; -} -template -inline packer& packer::pack_str_body(const char* b, uint32_t l) -{ - append_buffer(b, l); - return *this; -} - -// Raw (V4) - -template -inline packer& packer::pack_v4raw(uint32_t l) -{ - if(l < 32) { - unsigned char d = static_cast(0xa0u | l); - char buf = take8_8(d); - append_buffer(&buf, 1); - } else if(l < 65536) { - char buf[3]; - buf[0] = static_cast(0xdau); _msgpack_store16(&buf[1], static_cast(l)); - append_buffer(buf, 3); - } else { - char buf[5]; - buf[0] = static_cast(0xdbu); _msgpack_store32(&buf[1], static_cast(l)); - append_buffer(buf, 5); + template inline packer& packer::pack_array(uint32_t n) + { + if (n < 16) { + char d = static_cast(0x90u | n); + append_buffer(&d, 1); + } else if (n < 65536) { + char buf[3]; + buf[0] = static_cast(0xdcu); + _msgpack_store16(&buf[1], static_cast(n)); + append_buffer(buf, 3); + } else { + char buf[5]; + buf[0] = static_cast(0xddu); + _msgpack_store32(&buf[1], static_cast(n)); + append_buffer(buf, 5); + } + return *this; } - return *this; -} - -template -inline packer& packer::pack_v4raw_body(const char* b, uint32_t l) -{ - append_buffer(b, l); - return *this; -} -template -inline packer& packer::pack_bin(uint32_t l) -{ - if(l < 256) { - char buf[2]; - buf[0] = static_cast(0xc4u); buf[1] = static_cast(l); - append_buffer(buf, 2); - } else if(l < 65536) { - char buf[3]; - buf[0] = static_cast(0xc5u); _msgpack_store16(&buf[1], static_cast(l)); - append_buffer(buf, 3); - } else { - char buf[5]; - buf[0] = static_cast(0xc6u); _msgpack_store32(&buf[1], static_cast(l)); - append_buffer(buf, 5); + template inline packer& packer::pack_map(uint32_t n) + { + if (n < 16) { + unsigned char d = static_cast(0x80u | n); + char buf = take8_8(d); + append_buffer(&buf, 1); + } else if (n < 65536) { + char buf[3]; + buf[0] = static_cast(0xdeu); + _msgpack_store16(&buf[1], static_cast(n)); + append_buffer(buf, 3); + } else { + char buf[5]; + buf[0] = static_cast(0xdfu); + _msgpack_store32(&buf[1], static_cast(n)); + append_buffer(buf, 5); + } + return *this; } - return *this; -} - -template -inline packer& packer::pack_bin_body(const char* b, uint32_t l) -{ - append_buffer(b, l); - return *this; -} -template -inline packer& packer::pack_ext(size_t l, int8_t type) -{ - switch(l) { - case 1: { - char buf[2]; - buf[0] = static_cast(0xd4u); - buf[1] = static_cast(type); - append_buffer(buf, 2); - } break; - case 2: { - char buf[2]; - buf[0] = static_cast(0xd5u); - buf[1] = static_cast(type); - append_buffer(buf, 2); - } break; - case 4: { - char buf[2]; - buf[0] = static_cast(0xd6u); - buf[1] = static_cast(type); - append_buffer(buf, 2); - } break; - case 8: { - char buf[2]; - buf[0] = static_cast(0xd7u); - buf[1] = static_cast(type); - append_buffer(buf, 2); - } break; - case 16: { - char buf[2]; - buf[0] = static_cast(0xd8u); - buf[1] = static_cast(type); - append_buffer(buf, 2); - } break; - default: - if(l < 256) { - char buf[3]; - buf[0] = static_cast(0xc7u); + template inline packer& packer::pack_str(uint32_t l) + { + if (l < 32) { + unsigned char d = static_cast(0xa0u | l); + char buf = take8_8(d); + append_buffer(&buf, 1); + } else if (l < 256) { + char buf[2]; + buf[0] = static_cast(0xd9u); buf[1] = static_cast(l); - buf[2] = static_cast(type); - append_buffer(buf, 3); - } else if(l < 65536) { - char buf[4]; - buf[0] = static_cast(0xc8u); + append_buffer(buf, 2); + } else if (l < 65536) { + char buf[3]; + buf[0] = static_cast(0xdau); _msgpack_store16(&buf[1], static_cast(l)); - buf[3] = static_cast(type); - append_buffer(buf, 4); + append_buffer(buf, 3); } else { - char buf[6]; - buf[0] = static_cast(0xc9u); + char buf[5]; + buf[0] = static_cast(0xdbu); _msgpack_store32(&buf[1], static_cast(l)); - buf[5] = static_cast(type); - append_buffer(buf, 6); + append_buffer(buf, 5); } - break; + return *this; } - return *this; -} -template -inline packer& packer::pack_ext_body(const char* b, uint32_t l) -{ - append_buffer(b, l); - return *this; -} - -template -template -inline void packer::pack_imp_uint8(T d) -{ - if(d < (1<<7)) { - /* fixnum */ - char buf = take8_8(d); - append_buffer(&buf, 1); - } else { - /* unsigned 8 */ - char buf[2] = {static_cast(0xccu), take8_8(d)}; - append_buffer(buf, 2); + template inline packer& packer::pack_str_body(const char* b, uint32_t l) + { + append_buffer(b, l); + return *this; } -} -template -template -inline void packer::pack_imp_uint16(T d) -{ - if(d < (1<<7)) { - /* fixnum */ - char buf = take8_16(d); - append_buffer(&buf, 1); - } else if(d < (1<<8)) { - /* unsigned 8 */ - char buf[2] = {static_cast(0xccu), take8_16(d)}; - append_buffer(buf, 2); - } else { - /* unsigned 16 */ - char buf[3]; - buf[0] = static_cast(0xcdu); _msgpack_store16(&buf[1], static_cast(d)); - append_buffer(buf, 3); - } -} + // Raw (V4) -template -template -inline void packer::pack_imp_uint32(T d) -{ - if(d < (1<<8)) { - if(d < (1<<7)) { - /* fixnum */ - char buf = take8_32(d); + template inline packer& packer::pack_v4raw(uint32_t l) + { + if (l < 32) { + unsigned char d = static_cast(0xa0u | l); + char buf = take8_8(d); append_buffer(&buf, 1); - } else { - /* unsigned 8 */ - char buf[2] = {static_cast(0xccu), take8_32(d)}; - append_buffer(buf, 2); - } - } else { - if(d < (1<<16)) { - /* unsigned 16 */ + } else if (l < 65536) { char buf[3]; - buf[0] = static_cast(0xcdu); _msgpack_store16(&buf[1], static_cast(d)); + buf[0] = static_cast(0xdau); + _msgpack_store16(&buf[1], static_cast(l)); append_buffer(buf, 3); } else { - /* unsigned 32 */ char buf[5]; - buf[0] = static_cast(0xceu); _msgpack_store32(&buf[1], static_cast(d)); + buf[0] = static_cast(0xdbu); + _msgpack_store32(&buf[1], static_cast(l)); append_buffer(buf, 5); } + return *this; } -} -template -template -inline void packer::pack_imp_uint64(T d) -{ - if(d < (1ULL<<8)) { - if(d < (1ULL<<7)) { - /* fixnum */ - char buf = take8_64(d); - append_buffer(&buf, 1); - } else { - /* unsigned 8 */ - char buf[2] = {static_cast(0xccu), take8_64(d)}; + template inline packer& packer::pack_v4raw_body(const char* b, uint32_t l) + { + append_buffer(b, l); + return *this; + } + + template inline packer& packer::pack_bin(uint32_t l) + { + if (l < 256) { + char buf[2]; + buf[0] = static_cast(0xc4u); + buf[1] = static_cast(l); append_buffer(buf, 2); - } - } else { - if(d < (1ULL<<16)) { - /* unsigned 16 */ + } else if (l < 65536) { char buf[3]; - buf[0] = static_cast(0xcdu); _msgpack_store16(&buf[1], static_cast(d)); + buf[0] = static_cast(0xc5u); + _msgpack_store16(&buf[1], static_cast(l)); append_buffer(buf, 3); - } else if(d < (1ULL<<32)) { - /* unsigned 32 */ + } else { char buf[5]; - buf[0] = static_cast(0xceu); _msgpack_store32(&buf[1], static_cast(d)); + buf[0] = static_cast(0xc6u); + _msgpack_store32(&buf[1], static_cast(l)); append_buffer(buf, 5); - } else { - /* unsigned 64 */ - char buf[9]; - buf[0] = static_cast(0xcfu); _msgpack_store64(&buf[1], d); - append_buffer(buf, 9); } + return *this; } -} -template -template -inline void packer::pack_imp_int8(T d) -{ - if(d < -(1<<5)) { - /* signed 8 */ - char buf[2] = {static_cast(0xd0u), take8_8(d)}; - append_buffer(buf, 2); - } else { - /* fixnum */ - char buf = take8_8(d); - append_buffer(&buf, 1); + template inline packer& packer::pack_bin_body(const char* b, uint32_t l) + { + append_buffer(b, l); + return *this; } -} -template -template -inline void packer::pack_imp_int16(T d) -{ - if(d < -(1<<5)) { - if(d < -(1<<7)) { - /* signed 16 */ - char buf[3]; - buf[0] = static_cast(0xd1u); _msgpack_store16(&buf[1], static_cast(d)); - append_buffer(buf, 3); - } else { - /* signed 8 */ - char buf[2] = {static_cast(0xd0u), take8_16(d)}; + template inline packer& packer::pack_ext(size_t l, int8_t type) + { + switch (l) { + case 1: { + char buf[2]; + buf[0] = static_cast(0xd4u); + buf[1] = static_cast(type); append_buffer(buf, 2); - } - } else if(d < (1<<7)) { - /* fixnum */ - char buf = take8_16(d); - append_buffer(&buf, 1); - } else { - if(d < (1<<8)) { - /* unsigned 8 */ - char buf[2] = {static_cast(0xccu), take8_16(d)}; + } break; + case 2: { + char buf[2]; + buf[0] = static_cast(0xd5u); + buf[1] = static_cast(type); append_buffer(buf, 2); - } else { - /* unsigned 16 */ - char buf[3]; - buf[0] = static_cast(0xcdu); _msgpack_store16(&buf[1], static_cast(d)); - append_buffer(buf, 3); + } break; + case 4: { + char buf[2]; + buf[0] = static_cast(0xd6u); + buf[1] = static_cast(type); + append_buffer(buf, 2); + } break; + case 8: { + char buf[2]; + buf[0] = static_cast(0xd7u); + buf[1] = static_cast(type); + append_buffer(buf, 2); + } break; + case 16: { + char buf[2]; + buf[0] = static_cast(0xd8u); + buf[1] = static_cast(type); + append_buffer(buf, 2); + } break; + default: + if (l < 256) { + char buf[3]; + buf[0] = static_cast(0xc7u); + buf[1] = static_cast(l); + buf[2] = static_cast(type); + append_buffer(buf, 3); + } else if (l < 65536) { + char buf[4]; + buf[0] = static_cast(0xc8u); + _msgpack_store16(&buf[1], static_cast(l)); + buf[3] = static_cast(type); + append_buffer(buf, 4); + } else { + char buf[6]; + buf[0] = static_cast(0xc9u); + _msgpack_store32(&buf[1], static_cast(l)); + buf[5] = static_cast(type); + append_buffer(buf, 6); + } + break; } + return *this; } -} -template -template -inline void packer::pack_imp_int32(T d) -{ - if(d < -(1<<5)) { - if(d < -(1<<15)) { - /* signed 32 */ - char buf[5]; - buf[0] = static_cast(0xd2u); _msgpack_store32(&buf[1], static_cast(d)); - append_buffer(buf, 5); - } else if(d < -(1<<7)) { - /* signed 16 */ - char buf[3]; - buf[0] = static_cast(0xd1u); _msgpack_store16(&buf[1], static_cast(d)); - append_buffer(buf, 3); + template inline packer& packer::pack_ext_body(const char* b, uint32_t l) + { + append_buffer(b, l); + return *this; + } + + template template inline void packer::pack_imp_uint8(T d) + { + if (d < (1 << 7)) { + /* fixnum */ + char buf = take8_8(d); + append_buffer(&buf, 1); } else { - /* signed 8 */ - char buf[2] = { static_cast(0xd0u), take8_32(d)}; + /* unsigned 8 */ + char buf[2] = { static_cast(0xccu), take8_8(d) }; append_buffer(buf, 2); } - } else if(d < (1<<7)) { - /* fixnum */ - char buf = take8_32(d); - append_buffer(&buf, 1); - } else { - if(d < (1<<8)) { + } + + template template inline void packer::pack_imp_uint16(T d) + { + if (d < (1 << 7)) { + /* fixnum */ + char buf = take8_16(d); + append_buffer(&buf, 1); + } else if (d < (1 << 8)) { /* unsigned 8 */ - char buf[2] = { static_cast(0xccu), take8_32(d)}; + char buf[2] = { static_cast(0xccu), take8_16(d) }; append_buffer(buf, 2); - } else if(d < (1<<16)) { + } else { /* unsigned 16 */ char buf[3]; - buf[0] = static_cast(0xcdu); _msgpack_store16(&buf[1], static_cast(d)); + buf[0] = static_cast(0xcdu); + _msgpack_store16(&buf[1], static_cast(d)); append_buffer(buf, 3); + } + } + + template template inline void packer::pack_imp_uint32(T d) + { + if (d < (1 << 8)) { + if (d < (1 << 7)) { + /* fixnum */ + char buf = take8_32(d); + append_buffer(&buf, 1); + } else { + /* unsigned 8 */ + char buf[2] = { static_cast(0xccu), take8_32(d) }; + append_buffer(buf, 2); + } } else { - /* unsigned 32 */ - char buf[5]; - buf[0] = static_cast(0xceu); _msgpack_store32(&buf[1], static_cast(d)); - append_buffer(buf, 5); + if (d < (1 << 16)) { + /* unsigned 16 */ + char buf[3]; + buf[0] = static_cast(0xcdu); + _msgpack_store16(&buf[1], static_cast(d)); + append_buffer(buf, 3); + } else { + /* unsigned 32 */ + char buf[5]; + buf[0] = static_cast(0xceu); + _msgpack_store32(&buf[1], static_cast(d)); + append_buffer(buf, 5); + } } } -} -template -template -inline void packer::pack_imp_int64(T d) -{ - if(d < -(1LL<<5)) { - if(d < -(1LL<<15)) { - if(d < -(1LL<<31)) { - /* signed 64 */ - char buf[9]; - buf[0] = static_cast(0xd3u); _msgpack_store64(&buf[1], d); - append_buffer(buf, 9); + template template inline void packer::pack_imp_uint64(T d) + { + if (d < (1ULL << 8)) { + if (d < (1ULL << 7)) { + /* fixnum */ + char buf = take8_64(d); + append_buffer(&buf, 1); } else { - /* signed 32 */ + /* unsigned 8 */ + char buf[2] = { static_cast(0xccu), take8_64(d) }; + append_buffer(buf, 2); + } + } else { + if (d < (1ULL << 16)) { + /* unsigned 16 */ + char buf[3]; + buf[0] = static_cast(0xcdu); + _msgpack_store16(&buf[1], static_cast(d)); + append_buffer(buf, 3); + } else if (d < (1ULL << 32)) { + /* unsigned 32 */ char buf[5]; - buf[0] = static_cast(0xd2u); _msgpack_store32(&buf[1], static_cast(d)); + buf[0] = static_cast(0xceu); + _msgpack_store32(&buf[1], static_cast(d)); append_buffer(buf, 5); + } else { + /* unsigned 64 */ + char buf[9]; + buf[0] = static_cast(0xcfu); + _msgpack_store64(&buf[1], d); + append_buffer(buf, 9); } + } + } + + template template inline void packer::pack_imp_int8(T d) + { + if (d < -(1 << 5)) { + /* signed 8 */ + char buf[2] = { static_cast(0xd0u), take8_8(d) }; + append_buffer(buf, 2); } else { - if(d < -(1<<7)) { + /* fixnum */ + char buf = take8_8(d); + append_buffer(&buf, 1); + } + } + + template template inline void packer::pack_imp_int16(T d) + { + if (d < -(1 << 5)) { + if (d < -(1 << 7)) { /* signed 16 */ char buf[3]; - buf[0] = static_cast(0xd1u); _msgpack_store16(&buf[1], static_cast(d)); + buf[0] = static_cast(0xd1u); + _msgpack_store16(&buf[1], static_cast(d)); append_buffer(buf, 3); } else { /* signed 8 */ - char buf[2] = {static_cast(0xd0u), take8_64(d)}; + char buf[2] = { static_cast(0xd0u), take8_16(d) }; append_buffer(buf, 2); } - } - } else if(d < (1<<7)) { - /* fixnum */ - char buf = take8_64(d); - append_buffer(&buf, 1); - } else { - if(d < (1LL<<16)) { - if(d < (1<<8)) { + } else if (d < (1 << 7)) { + /* fixnum */ + char buf = take8_16(d); + append_buffer(&buf, 1); + } else { + if (d < (1 << 8)) { /* unsigned 8 */ - char buf[2] = {static_cast(0xccu), take8_64(d)}; + char buf[2] = { static_cast(0xccu), take8_16(d) }; append_buffer(buf, 2); } else { /* unsigned 16 */ char buf[3]; - buf[0] = static_cast(0xcdu); _msgpack_store16(&buf[1], static_cast(d)); + buf[0] = static_cast(0xcdu); + _msgpack_store16(&buf[1], static_cast(d)); + append_buffer(buf, 3); + } + } + } + + template template inline void packer::pack_imp_int32(T d) + { + if (d < -(1 << 5)) { + if (d < -(1 << 15)) { + /* signed 32 */ + char buf[5]; + buf[0] = static_cast(0xd2u); + _msgpack_store32(&buf[1], static_cast(d)); + append_buffer(buf, 5); + } else if (d < -(1 << 7)) { + /* signed 16 */ + char buf[3]; + buf[0] = static_cast(0xd1u); + _msgpack_store16(&buf[1], static_cast(d)); append_buffer(buf, 3); + } else { + /* signed 8 */ + char buf[2] = { static_cast(0xd0u), take8_32(d) }; + append_buffer(buf, 2); } + } else if (d < (1 << 7)) { + /* fixnum */ + char buf = take8_32(d); + append_buffer(&buf, 1); } else { - if(d < (1LL<<32)) { + if (d < (1 << 8)) { + /* unsigned 8 */ + char buf[2] = { static_cast(0xccu), take8_32(d) }; + append_buffer(buf, 2); + } else if (d < (1 << 16)) { + /* unsigned 16 */ + char buf[3]; + buf[0] = static_cast(0xcdu); + _msgpack_store16(&buf[1], static_cast(d)); + append_buffer(buf, 3); + } else { /* unsigned 32 */ char buf[5]; - buf[0] = static_cast(0xceu); _msgpack_store32(&buf[1], static_cast(d)); + buf[0] = static_cast(0xceu); + _msgpack_store32(&buf[1], static_cast(d)); append_buffer(buf, 5); + } + } + } + + template template inline void packer::pack_imp_int64(T d) + { + if (d < -(1LL << 5)) { + if (d < -(1LL << 15)) { + if (d < -(1LL << 31)) { + /* signed 64 */ + char buf[9]; + buf[0] = static_cast(0xd3u); + _msgpack_store64(&buf[1], d); + append_buffer(buf, 9); + } else { + /* signed 32 */ + char buf[5]; + buf[0] = static_cast(0xd2u); + _msgpack_store32(&buf[1], static_cast(d)); + append_buffer(buf, 5); + } } else { - /* unsigned 64 */ - char buf[9]; - buf[0] = static_cast(0xcfu); _msgpack_store64(&buf[1], d); - append_buffer(buf, 9); + if (d < -(1 << 7)) { + /* signed 16 */ + char buf[3]; + buf[0] = static_cast(0xd1u); + _msgpack_store16(&buf[1], static_cast(d)); + append_buffer(buf, 3); + } else { + /* signed 8 */ + char buf[2] = { static_cast(0xd0u), take8_64(d) }; + append_buffer(buf, 2); + } + } + } else if (d < (1 << 7)) { + /* fixnum */ + char buf = take8_64(d); + append_buffer(&buf, 1); + } else { + if (d < (1LL << 16)) { + if (d < (1 << 8)) { + /* unsigned 8 */ + char buf[2] = { static_cast(0xccu), take8_64(d) }; + append_buffer(buf, 2); + } else { + /* unsigned 16 */ + char buf[3]; + buf[0] = static_cast(0xcdu); + _msgpack_store16(&buf[1], static_cast(d)); + append_buffer(buf, 3); + } + } else { + if (d < (1LL << 32)) { + /* unsigned 32 */ + char buf[5]; + buf[0] = static_cast(0xceu); + _msgpack_store32(&buf[1], static_cast(d)); + append_buffer(buf, 5); + } else { + /* unsigned 64 */ + char buf[9]; + buf[0] = static_cast(0xcfu); + _msgpack_store64(&buf[1], d); + append_buffer(buf, 9); + } } } } -} -/// @cond -} // MSGPACK_API_VERSION_NAMESPACE(v1) + /// @cond +} // MSGPACK_API_VERSION_NAMESPACE(v1) /// @endcond -} // namespace msgpack +} // namespace msgpack #endif // MSGPACK_V1_PACK_HPP diff --git a/barretenberg/cpp/src/msgpack-c/include/msgpack/v2/object_fwd.hpp b/barretenberg/cpp/src/msgpack-c/include/msgpack/v2/object_fwd.hpp index 9c44aae6099..38a95e258e5 100644 --- a/barretenberg/cpp/src/msgpack-c/include/msgpack/v2/object_fwd.hpp +++ b/barretenberg/cpp/src/msgpack-c/include/msgpack/v2/object_fwd.hpp @@ -11,96 +11,89 @@ #ifndef MSGPACK_V2_OBJECT_FWD_HPP #define MSGPACK_V2_OBJECT_FWD_HPP -#include "msgpack/v2/object_fwd_decl.hpp" #include "msgpack/object_fwd.hpp" +#include "msgpack/v2/object_fwd_decl.hpp" namespace msgpack { /// @cond -MSGPACK_API_VERSION_NAMESPACE(v2) { -/// @endcond - -struct object : v1::object { - object() {} - object(v1::object const& o):v1::object(o) {} - /// Construct object from T - /** - * If `v` is the type that is corresponding to MessegePack format str, bin, ext, array, or map, - * you need to call `object(const T& v, msgpack::zone& z)` instead of this constructor. - * - * @tparam T The type of `v`. - * @param v The value you want to convert. - */ - template - explicit object(const T& v) { - *this << v; - } - - /// Construct object from T - /** - * The object is constructed on the zone `z`. - * See https://github.com/msgpack/msgpack-c/wiki/v1_1_cpp_object - * - * @tparam T The type of `v`. - * @param v The value you want to convert. - * @param z The zone that is used by the object. - */ - template - object(const T& v, msgpack::zone& z):v1::object(v, z) {} - -public: - /// Convert the object - /** - * If the object can't be converted to T, msgpack::type_error would be thrown. - * @tparam T The type of v. - * @param v The value you want to get. `v` is output parameter. `v` is overwritten by converted value from the object. - * @return The reference of `v`. - */ - template - T& convert(T& v) const { return v1::object::convert(v); } - - using v1::object::with_zone; - implicit_type convert() const; -}; +MSGPACK_API_VERSION_NAMESPACE(v2) +{ + /// @endcond + + struct object : v1::object { + object() {} + object(v1::object const& o) + : v1::object(o) + {} + /// Construct object from T + /** + * If `v` is the type that is corresponding to MessegePack format str, bin, ext, array, or map, + * you need to call `object(const T& v, msgpack::zone& z)` instead of this constructor. + * + * @tparam T The type of `v`. + * @param v The value you want to convert. + */ + template explicit object(const T& v) { *this << v; } + + /// Construct object from T + /** + * The object is constructed on the zone `z`. + * See https://github.com/msgpack/msgpack-c/wiki/v1_1_cpp_object + * + * @tparam T The type of `v`. + * @param v The value you want to convert. + * @param z The zone that is used by the object. + */ + template + object(const T& v, msgpack::zone& z) + : v1::object(v, z) + {} + + public: + /// Convert the object + /** + * If the object can't be converted to T, msgpack::type_error would be thrown. + * @tparam T The type of v. + * @param v The value you want to get. `v` is output parameter. `v` is overwritten by converted value from the + * object. + * @return The reference of `v`. + */ + template T& convert(T& v) const { return v1::object::convert(v); } + + using v1::object::with_zone; + implicit_type convert() const; + }; #if !defined(MSGPACK_USE_CPP03) -namespace adaptor { + namespace adaptor { -// If v1 has as specialization for T, then dispatch v1::adaptor::as. -// So I call v1::has_as meta function intentionally. -template -struct as::value>::type> : v1::adaptor::as { -}; + // If v1 has as specialization for T, then dispatch v1::adaptor::as. + // So I call v1::has_as meta function intentionally. + template struct as::value>::type> : v1::adaptor::as {}; -} // namespace adaptor + } // namespace adaptor -template -struct has_as { -private: - template - static auto check(U*) -> - typename std::enable_if< + template struct has_as { + private: + template + static auto check_(U*) -> typename std::enable_if< // check v2 specialization - std::is_same< - decltype(adaptor::as()(std::declval())), - U - >::value - || - // check v1 specialization - v1::has_as::value, - std::true_type - >::type; - template - static std::false_type check(...); -public: - using type = decltype(check(MSGPACK_NULLPTR)); - static constexpr bool value = type::value; -}; + std::is_same()(std::declval())), U>::value || + // check v1 specialization + v1::has_as::value, + std::true_type>::type; + template static std::false_type check_(...); + + public: + using type = decltype(check_(MSGPACK_NULLPTR)); + static constexpr bool value = type::value; + }; #endif // !defined(MSGPACK_USE_CPP03) -/// @cond + /// @cond } // MSGPACK_API_VERSION_NAMESPACE(v2) /// @endcond diff --git a/barretenberg/cpp/src/msgpack-c/include/msgpack/v3/object_fwd.hpp b/barretenberg/cpp/src/msgpack-c/include/msgpack/v3/object_fwd.hpp index d282f1b4a47..0fa02c7a149 100644 --- a/barretenberg/cpp/src/msgpack-c/include/msgpack/v3/object_fwd.hpp +++ b/barretenberg/cpp/src/msgpack-c/include/msgpack/v3/object_fwd.hpp @@ -11,57 +11,47 @@ #ifndef MSGPACK_V3_OBJECT_FWD_HPP #define MSGPACK_V3_OBJECT_FWD_HPP -#include "msgpack/v3/object_fwd_decl.hpp" #include "msgpack/object_fwd.hpp" +#include "msgpack/v3/object_fwd_decl.hpp" namespace msgpack { /// @cond -MSGPACK_API_VERSION_NAMESPACE(v3) { -/// @endcond +MSGPACK_API_VERSION_NAMESPACE(v3) +{ + /// @endcond #if !defined(MSGPACK_USE_CPP03) -namespace adaptor { + namespace adaptor { -// If v2 has as specialization for T, then dispatch v2::adaptor::as. -// So I call v2::has_as meta function intentionally. -template -struct as::value>::type> : v2::adaptor::as { -}; + // If v2 has as specialization for T, then dispatch v2::adaptor::as. + // So I call v2::has_as meta function intentionally. + template struct as::value>::type> : v2::adaptor::as {}; -} // namespace adaptor + } // namespace adaptor -template -struct has_as { -private: - template - static auto check(U*) -> - typename std::enable_if< + template struct has_as { + private: + template + static auto check_(U*) -> typename std::enable_if< // check v3 specialization - std::is_same< - decltype(adaptor::as()(std::declval())), - U - >::value - || - // check v2 specialization - v2::has_as::value - || - // check v1 specialization - v1::has_as::value, - std::true_type - >::type; - template - static std::false_type check(...); -public: - using type = decltype(check(MSGPACK_NULLPTR)); - static constexpr bool value = type::value; -}; + std::is_same()(std::declval())), U>::value || + // check v2 specialization + v2::has_as::value || + // check v1 specialization + v1::has_as::value, + std::true_type>::type; + template static std::false_type check_(...); + + public: + using type = decltype(check_(MSGPACK_NULLPTR)); + static constexpr bool value = type::value; + }; #endif // !defined(MSGPACK_USE_CPP03) - -/// @cond + /// @cond } // MSGPACK_API_VERSION_NAMESPACE(v3) /// @endcond diff --git a/barretenberg/cpp/src/msgpack-c/include/msgpack/version_master.hpp b/barretenberg/cpp/src/msgpack-c/include/msgpack/version_master.hpp index fdab088941d..1b8b0ec220a 100644 --- a/barretenberg/cpp/src/msgpack-c/include/msgpack/version_master.hpp +++ b/barretenberg/cpp/src/msgpack-c/include/msgpack/version_master.hpp @@ -1,3 +1,3 @@ -#define MSGPACK_VERSION_MAJOR 6 -#define MSGPACK_VERSION_MINOR 0 +#define MSGPACK_VERSION_MAJOR 6 +#define MSGPACK_VERSION_MINOR 1 #define MSGPACK_VERSION_REVISION 0 diff --git a/barretenberg/cpp/src/msgpack-c/preprocess.rb b/barretenberg/cpp/src/msgpack-c/preprocess.rb new file mode 100644 index 00000000000..95cd313bd22 --- /dev/null +++ b/barretenberg/cpp/src/msgpack-c/preprocess.rb @@ -0,0 +1,17 @@ +require 'erb' + +files = { + "erb/v1/cpp03_msgpack_tuple_decl.hpp" => "include/msgpack/v1/adaptor/detail/cpp03_msgpack_tuple_decl.hpp", + "erb/v1/cpp03_msgpack_tuple.hpp" => "include/msgpack/v1/adaptor/detail/cpp03_msgpack_tuple.hpp", + "erb/v1/cpp03_define_array_decl.hpp" => "include/msgpack/v1/adaptor/detail/cpp03_define_array_decl.hpp", + "erb/v1/cpp03_define_array.hpp" => "include/msgpack/v1/adaptor/detail/cpp03_define_array.hpp", + "erb/v1/cpp03_define_map_decl.hpp" => "include/msgpack/v1/adaptor/detail/cpp03_define_map_decl.hpp", + "erb/v1/cpp03_define_map.hpp" => "include/msgpack/v1/adaptor/detail/cpp03_define_map.hpp", + "erb/v1/cpp03_zone_decl.hpp" => "include/msgpack/v1/detail/cpp03_zone_decl.hpp", + "erb/v1/cpp03_zone.hpp" => "include/msgpack/v1/detail/cpp03_zone.hpp" +} + +files.map { |erb, hpp| + res = ERB.new(File.open(erb+".erb").read).result + File.write(hpp, res) +} \ No newline at end of file diff --git a/barretenberg/cpp/src/msgpack-c/test/CMakeLists.txt b/barretenberg/cpp/src/msgpack-c/test/CMakeLists.txt index e0ebf2583ce..a0233dd3557 100644 --- a/barretenberg/cpp/src/msgpack-c/test/CMakeLists.txt +++ b/barretenberg/cpp/src/msgpack-c/test/CMakeLists.txt @@ -1,6 +1,6 @@ FIND_PACKAGE (Threads REQUIRED) FIND_PACKAGE (ZLIB) -FIND_PACKAGE (Boost REQUIRED COMPONENTS unit_test_framework system) +FIND_PACKAGE (Boost REQUIRED COMPONENTS unit_test_framework) LIST (APPEND check_PROGRAMS array_ref.cpp @@ -79,7 +79,6 @@ FOREACH (source_file ${check_PROGRAMS}) TARGET_LINK_LIBRARIES (${source_file_we} msgpack-cxx - Boost::system Boost::unit_test_framework Threads::Threads ZLIB::ZLIB diff --git a/barretenberg/cpp/src/msgpack-c/test/boost_variant.cpp b/barretenberg/cpp/src/msgpack-c/test/boost_variant.cpp index 9ab3dc611e7..22b7c5958aa 100644 --- a/barretenberg/cpp/src/msgpack-c/test/boost_variant.cpp +++ b/barretenberg/cpp/src/msgpack-c/test/boost_variant.cpp @@ -1,7 +1,7 @@ #include +#include #include #include -#include #define BOOST_TEST_MODULE MSGPACK_BOOST #include @@ -12,10 +12,8 @@ #if defined(MSGPACK_NO_BOOST) -BOOST_AUTO_TEST_CASE(empty) -{ -} -#else // defined(MSGPACK_NO_BOOST) +BOOST_AUTO_TEST_CASE(empty) {} +#else // defined(MSGPACK_NO_BOOST) const double kEPS = 1e-10; @@ -29,8 +27,7 @@ BOOST_AUTO_TEST_CASE(pack_convert_variant_nil) msgpack::pack(ss, val1); std::string const& str = ss.str(); - msgpack::object_handle oh = - msgpack::unpack(str.data(), str.size()); + msgpack::object_handle oh = msgpack::unpack(str.data(), str.size()); msgpack::type::variant val2 = oh.get().as(); BOOST_CHECK(val2.is_nil()); BOOST_CHECK_NO_THROW(boost::get(val2)); @@ -68,8 +65,7 @@ BOOST_AUTO_TEST_CASE(pack_convert_variant_nil_default) msgpack::pack(ss, val1); std::string const& str = ss.str(); - msgpack::object_handle oh = - msgpack::unpack(str.data(), str.size()); + msgpack::object_handle oh = msgpack::unpack(str.data(), str.size()); msgpack::type::variant val2 = oh.get().as(); BOOST_CHECK(val2.is_nil()); BOOST_CHECK_NO_THROW(boost::get(val2)); @@ -108,8 +104,7 @@ BOOST_AUTO_TEST_CASE(pack_convert_variant_bool) msgpack::pack(ss, val1); std::string const& str = ss.str(); - msgpack::object_handle oh = - msgpack::unpack(str.data(), str.size()); + msgpack::object_handle oh = msgpack::unpack(str.data(), str.size()); msgpack::type::variant val2 = oh.get().as(); BOOST_CHECK(val2.is_bool()); BOOST_CHECK(val2.as_bool()); @@ -162,8 +157,7 @@ BOOST_AUTO_TEST_CASE(pack_convert_variant_positive_integer) msgpack::pack(ss, val1); std::string const& str = ss.str(); - msgpack::object_handle oh = - msgpack::unpack(str.data(), str.size()); + msgpack::object_handle oh = msgpack::unpack(str.data(), str.size()); msgpack::type::variant val2 = oh.get().as(); BOOST_CHECK(val2.is_uint64_t()); BOOST_CHECK_EQUAL(val2.as_uint64_t(), 123U); @@ -210,8 +204,7 @@ BOOST_AUTO_TEST_CASE(pack_convert_variant_negative_integer) msgpack::pack(ss, val1); std::string const& str = ss.str(); - msgpack::object_handle oh = - msgpack::unpack(str.data(), str.size()); + msgpack::object_handle oh = msgpack::unpack(str.data(), str.size()); msgpack::type::variant val2 = oh.get().as(); BOOST_CHECK(val2.is_int64_t()); BOOST_CHECK_EQUAL(val2.as_int64_t(), -123); @@ -258,13 +251,12 @@ BOOST_AUTO_TEST_CASE(pack_convert_variant_float) msgpack::pack(ss, val1); std::string const& str = ss.str(); - msgpack::object_handle oh = - msgpack::unpack(str.data(), str.size()); + msgpack::object_handle oh = msgpack::unpack(str.data(), str.size()); msgpack::type::variant val2 = oh.get().as(); BOOST_CHECK(val2.is_double()); BOOST_CHECK(fabs(12.34 - val2.as_double()) <= kEPS); BOOST_CHECK_NO_THROW(boost::get(val2)); - BOOST_CHECK(fabs(val2.as_double() - val2.as_double()) <= kEPS); + BOOST_CHECK(fabs(val1.as_double() - val2.as_double()) <= kEPS); } BOOST_AUTO_TEST_CASE(object_variant_float) @@ -277,7 +269,8 @@ BOOST_AUTO_TEST_CASE(object_variant_float) BOOST_CHECK(val2.is_double()); BOOST_CHECK(fabs(12.34 - val2.as_double()) <= kEPS); BOOST_CHECK_NO_THROW(boost::get(val2)); - BOOST_CHECK(fabs(val2.as_double() - val2.as_double()) <= kEPS); + BOOST_CHECK(fabs(val1.as_double() - val2.as_double()) <= kEPS); + BOOST_CHECK(val1 == val2); } BOOST_AUTO_TEST_CASE(object_with_zone_variant_float) @@ -291,7 +284,114 @@ BOOST_AUTO_TEST_CASE(object_with_zone_variant_float) BOOST_CHECK(val2.is_double()); BOOST_CHECK(fabs(12.34 - val2.as_double()) <= kEPS); BOOST_CHECK_NO_THROW(boost::get(val2)); - BOOST_CHECK(fabs(val2.as_double() - val2.as_double()) <= kEPS); + BOOST_CHECK(fabs(val1.as_double() - val2.as_double()) <= kEPS); + BOOST_CHECK(val1 == val2); +} + +BOOST_AUTO_TEST_CASE(pack_convert_variant_float_zero_atdp_positive) +{ + std::stringstream ss; + msgpack::type::variant val1 = 12.0; + BOOST_CHECK(val1.is_uint64_t()); + BOOST_CHECK_EQUAL(val1.as_uint64_t(), 12); + BOOST_CHECK(fabs(12.0 - val1.as_double()) <= kEPS); + + msgpack::pack(ss, val1); + + std::string const& str = ss.str(); + msgpack::object_handle oh = msgpack::unpack(str.data(), str.size()); + msgpack::type::variant val2 = oh.get().as(); + BOOST_CHECK(val2.is_uint64_t()); + BOOST_CHECK_EQUAL(val2.as_uint64_t(), 12); + BOOST_CHECK_NO_THROW(boost::get(val2)); + BOOST_CHECK(fabs(12.0 - val2.as_double()) <= kEPS); + BOOST_CHECK_EQUAL(val1.as_uint64_t(), val2.as_uint64_t()); +} + +BOOST_AUTO_TEST_CASE(object_variant_float_zero_atdp_positive) +{ + msgpack::type::variant val1 = 12.0; + BOOST_CHECK(val1.is_uint64_t()); + BOOST_CHECK_EQUAL(val1.as_uint64_t(), 12); + BOOST_CHECK(fabs(12.0 - val1.as_double()) <= kEPS); + msgpack::object obj(val1); + msgpack::type::variant val2 = obj.as(); + BOOST_CHECK(val2.is_uint64_t()); + BOOST_CHECK_EQUAL(val2.as_uint64_t(), 12); + BOOST_CHECK_NO_THROW(boost::get(val2)); + BOOST_CHECK(fabs(12.0 - val2.as_double()) <= kEPS); + BOOST_CHECK_EQUAL(val1.as_uint64_t(), val2.as_uint64_t()); + BOOST_CHECK(val1 == val2); +} + +BOOST_AUTO_TEST_CASE(object_with_zone_variant_float_zero_atdp_positive) +{ + msgpack::zone z; + msgpack::type::variant val1 = 12.0; + BOOST_CHECK(val1.is_uint64_t()); + BOOST_CHECK_EQUAL(val1.as_uint64_t(), 12); + BOOST_CHECK(fabs(12.0 - val1.as_double()) <= kEPS); + msgpack::object obj(val1, z); + msgpack::type::variant val2 = obj.as(); + BOOST_CHECK(val2.is_uint64_t()); + BOOST_CHECK_EQUAL(val2.as_uint64_t(), 12); + BOOST_CHECK_NO_THROW(boost::get(val2)); + BOOST_CHECK_EQUAL(val1.as_uint64_t(), val2.as_uint64_t()); + BOOST_CHECK(fabs(12.0 - val2.as_double()) <= kEPS); + BOOST_CHECK(val1 == val2); +} + +BOOST_AUTO_TEST_CASE(pack_convert_variant_float_zero_atdp_negative) +{ + std::stringstream ss; + msgpack::type::variant val1 = -12.0; + BOOST_CHECK(val1.is_int64_t()); + BOOST_CHECK_EQUAL(val1.as_int64_t(), -12); + BOOST_CHECK(fabs(-12.0 - val1.as_double()) <= kEPS); + + msgpack::pack(ss, val1); + + std::string const& str = ss.str(); + msgpack::object_handle oh = msgpack::unpack(str.data(), str.size()); + msgpack::type::variant val2 = oh.get().as(); + BOOST_CHECK(val2.is_int64_t()); + BOOST_CHECK_EQUAL(val2.as_int64_t(), -12); + BOOST_CHECK_NO_THROW(boost::get(val2)); + BOOST_CHECK(fabs(-12.0 - val2.as_double()) <= kEPS); + BOOST_CHECK_EQUAL(val1.as_int64_t(), val2.as_int64_t()); +} + +BOOST_AUTO_TEST_CASE(object_variant_float_zero_atdp_negative) +{ + msgpack::type::variant val1 = -12.0; + BOOST_CHECK(val1.is_int64_t()); + BOOST_CHECK_EQUAL(val1.as_int64_t(), -12); + BOOST_CHECK(fabs(-12.0 - val1.as_double()) <= kEPS); + msgpack::object obj(val1); + msgpack::type::variant val2 = obj.as(); + BOOST_CHECK(val2.is_int64_t()); + BOOST_CHECK_EQUAL(val2.as_int64_t(), -12); + BOOST_CHECK_NO_THROW(boost::get(val2)); + BOOST_CHECK(fabs(-12.0 - val2.as_double()) <= kEPS); + BOOST_CHECK_EQUAL(val1.as_int64_t(), val2.as_int64_t()); + BOOST_CHECK(val1 == val2); +} + +BOOST_AUTO_TEST_CASE(object_with_zone_variant_float_zero_atdp_negative) +{ + msgpack::zone z; + msgpack::type::variant val1 = -12.0; + BOOST_CHECK(val1.is_int64_t()); + BOOST_CHECK_EQUAL(val1.as_int64_t(), -12); + BOOST_CHECK(fabs(-12.0 - val1.as_double()) <= kEPS); + msgpack::object obj(val1, z); + msgpack::type::variant val2 = obj.as(); + BOOST_CHECK(val2.is_int64_t()); + BOOST_CHECK_EQUAL(val2.as_int64_t(), -12); + BOOST_CHECK_NO_THROW(boost::get(val2)); + BOOST_CHECK(fabs(-12.0 - val2.as_double()) <= kEPS); + BOOST_CHECK_EQUAL(val1.as_int64_t(), val2.as_int64_t()); + BOOST_CHECK(val1 == val2); } // str @@ -306,8 +406,7 @@ BOOST_AUTO_TEST_CASE(pack_convert_variant_str) msgpack::pack(ss, val1); std::string const& str = ss.str(); - msgpack::object_handle oh = - msgpack::unpack(str.data(), str.size()); + msgpack::object_handle oh = msgpack::unpack(str.data(), str.size()); msgpack::type::variant val2 = oh.get().as(); BOOST_CHECK(val2.is_string()); BOOST_CHECK_EQUAL(val2.as_string(), "ABC"); @@ -315,7 +414,6 @@ BOOST_AUTO_TEST_CASE(pack_convert_variant_str) BOOST_CHECK(val1 == val2); } - BOOST_AUTO_TEST_CASE(object_with_zone_variant_str) { msgpack::zone z; @@ -369,17 +467,14 @@ BOOST_AUTO_TEST_CASE(pack_convert_variant_bin) msgpack::pack(ss, val1); std::string const& str = ss.str(); - msgpack::object_handle oh = - msgpack::unpack(str.data(), str.size()); + msgpack::object_handle oh = msgpack::unpack(str.data(), str.size()); msgpack::type::variant val2 = oh.get().as(); BOOST_CHECK(val2.is_vector_char()); BOOST_CHECK(val2.as_vector_char() == v); - BOOST_CHECK_NO_THROW(boost::get >(val2)); + BOOST_CHECK_NO_THROW(boost::get>(val2)); BOOST_CHECK(val1 == val2); } - - BOOST_AUTO_TEST_CASE(object_with_zone_variant_bin) { msgpack::zone z; @@ -394,7 +489,7 @@ BOOST_AUTO_TEST_CASE(object_with_zone_variant_bin) msgpack::type::variant val2 = obj.as(); BOOST_CHECK(val2.is_vector_char()); BOOST_CHECK(val2.as_vector_char() == v); - BOOST_CHECK_NO_THROW(boost::get >(val2)); + BOOST_CHECK_NO_THROW(boost::get>(val2)); BOOST_CHECK(val1 == val2); } @@ -417,8 +512,8 @@ BOOST_AUTO_TEST_CASE(object_with_zone_variant_raw_ref) // Converted as std::vector. BOOST_CHECK(val2.is_vector_char()); BOOST_CHECK(val2.as_vector_char() == v); - BOOST_CHECK_NO_THROW(boost::get >(val2)); - // msgpack::type::raw_ref and std::vector are different. + BOOST_CHECK_NO_THROW(boost::get>(val2)); + // msgpack::type::raw_ref and std::vector are different. BOOST_CHECK(!(val1 == val2)); } @@ -441,8 +536,7 @@ BOOST_AUTO_TEST_CASE(pack_convert_variant_ext) msgpack::pack(ss, val1); std::string const& str = ss.str(); - msgpack::object_handle oh = - msgpack::unpack(str.data(), str.size()); + msgpack::object_handle oh = msgpack::unpack(str.data(), str.size()); msgpack::type::variant val2 = oh.get().as(); BOOST_CHECK(val2.is_ext()); BOOST_CHECK(val2.as_ext() == e); @@ -487,7 +581,7 @@ BOOST_AUTO_TEST_CASE(object_with_zone_variant_ext_ref) BOOST_CHECK(val2.is_ext()); BOOST_CHECK(val2.as_ext() == msgpack::type::ext(e)); BOOST_CHECK_NO_THROW(boost::get(val2)); - // msgpack::type::ext_ref and msgpack::type::ext are different. + // msgpack::type::ext_ref and msgpack::type::ext are different. BOOST_CHECK(!(val1 == val2)); } @@ -507,12 +601,11 @@ BOOST_AUTO_TEST_CASE(pack_convert_variant_array) msgpack::pack(ss, val1); std::string const& str = ss.str(); - msgpack::object_handle oh = - msgpack::unpack(str.data(), str.size()); + msgpack::object_handle oh = msgpack::unpack(str.data(), str.size()); msgpack::type::variant val2 = oh.get().as(); BOOST_CHECK(val2.is_vector()); BOOST_CHECK(val2.as_vector() == v); - BOOST_CHECK_NO_THROW(boost::get >(val2)); + BOOST_CHECK_NO_THROW(boost::get>(val2)); BOOST_CHECK(val1 == val2); } @@ -530,7 +623,7 @@ BOOST_AUTO_TEST_CASE(object_with_zone_variant_array) msgpack::type::variant val2 = obj.as(); BOOST_CHECK(val2.is_vector()); BOOST_CHECK(val2.as_vector() == v); - BOOST_CHECK_NO_THROW(boost::get >(val2)); + BOOST_CHECK_NO_THROW(boost::get>(val2)); BOOST_CHECK(val1 == val2); } @@ -550,8 +643,7 @@ BOOST_AUTO_TEST_CASE(pack_convert_variant_map) msgpack::pack(ss, val1); std::string const& str = ss.str(); - msgpack::object_handle oh = - msgpack::unpack(str.data(), str.size()); + msgpack::object_handle oh = msgpack::unpack(str.data(), str.size()); msgpack::type::variant val2 = oh.get().as(); BOOST_CHECK(val2.is_multimap()); BOOST_CHECK(val2.as_multimap() == v); @@ -595,8 +687,7 @@ BOOST_AUTO_TEST_CASE(pack_convert_variant_ref_str) msgpack::pack(ss, val1); std::string const& str = ss.str(); - msgpack::object_handle oh = - msgpack::unpack(str.data(), str.size()); + msgpack::object_handle oh = msgpack::unpack(str.data(), str.size()); msgpack::type::variant_ref val2 = oh.get().as(); BOOST_CHECK(val2.is_boost_string_ref()); BOOST_CHECK_EQUAL(val2.as_boost_string_ref(), sr); @@ -604,8 +695,6 @@ BOOST_AUTO_TEST_CASE(pack_convert_variant_ref_str) BOOST_CHECK(val1 == val2); } - - BOOST_AUTO_TEST_CASE(object_with_zone_variant_ref_str) { msgpack::zone z; @@ -641,8 +730,7 @@ BOOST_AUTO_TEST_CASE(pack_convert_variant_ref_bin) msgpack::pack(ss, val1); std::string const& str = ss.str(); - msgpack::object_handle oh = - msgpack::unpack(str.data(), str.size()); + msgpack::object_handle oh = msgpack::unpack(str.data(), str.size()); msgpack::type::variant_ref val2 = oh.get().as(); BOOST_CHECK(val2.is_raw_ref()); BOOST_CHECK(val2.as_raw_ref() == rr); @@ -650,8 +738,6 @@ BOOST_AUTO_TEST_CASE(pack_convert_variant_ref_bin) BOOST_CHECK(val1 == val2); } - - BOOST_AUTO_TEST_CASE(object_with_zone_variant_ref_bin) { msgpack::zone z; @@ -689,8 +775,7 @@ BOOST_AUTO_TEST_CASE(pack_convert_variant_ref_ext) msgpack::pack(ss, val1); std::string const& str = ss.str(); - msgpack::object_handle oh = - msgpack::unpack(str.data(), str.size()); + msgpack::object_handle oh = msgpack::unpack(str.data(), str.size()); msgpack::type::variant_ref val2 = oh.get().as(); BOOST_CHECK_NO_THROW(boost::get(val2)); BOOST_CHECK(val2.is_ext_ref()); @@ -698,7 +783,6 @@ BOOST_AUTO_TEST_CASE(pack_convert_variant_ref_ext) BOOST_CHECK(val1 == val2); } - BOOST_AUTO_TEST_CASE(object_with_zone_variant_ref_ext) { msgpack::zone z; @@ -740,12 +824,11 @@ BOOST_AUTO_TEST_CASE(pack_convert_variant_ref_array) msgpack::pack(ss, val1); std::string const& str = ss.str(); - msgpack::object_handle oh = - msgpack::unpack(str.data(), str.size()); + msgpack::object_handle oh = msgpack::unpack(str.data(), str.size()); msgpack::type::variant_ref val2 = oh.get().as(); BOOST_CHECK(val2.is_vector()); BOOST_CHECK(val2.as_vector() == v); - BOOST_CHECK_NO_THROW(boost::get >(val2)); + BOOST_CHECK_NO_THROW(boost::get>(val2)); BOOST_CHECK(val1 == val2); } @@ -768,7 +851,7 @@ BOOST_AUTO_TEST_CASE(object_with_zone_variant_ref_array) msgpack::type::variant_ref val2 = obj.as(); BOOST_CHECK(val2.is_vector()); BOOST_CHECK(val2.as_vector() == v); - BOOST_CHECK_NO_THROW(boost::get >(val2)); + BOOST_CHECK_NO_THROW(boost::get>(val2)); BOOST_CHECK(val1 == val2); } @@ -783,7 +866,8 @@ BOOST_AUTO_TEST_CASE(pack_convert_variant_ref_map) std::string s1("ABC"); std::string s2("DEF"); #if (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53 - v.insert(multimap_t::value_type(msgpack::type::variant_ref(boost::string_ref(s1)), msgpack::type::variant_ref(boost::string_ref(s2)))); + v.insert(multimap_t::value_type(msgpack::type::variant_ref(boost::string_ref(s1)), + msgpack::type::variant_ref(boost::string_ref(s2)))); #else // (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53 v.insert(multimap_t::value_type(msgpack::type::variant_ref(s1), msgpack::type::variant_ref(s2))); #endif // (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53 @@ -794,8 +878,7 @@ BOOST_AUTO_TEST_CASE(pack_convert_variant_ref_map) msgpack::pack(ss, val1); std::string const& str = ss.str(); - msgpack::object_handle oh = - msgpack::unpack(str.data(), str.size()); + msgpack::object_handle oh = msgpack::unpack(str.data(), str.size()); msgpack::type::variant_ref val2 = oh.get().as(); BOOST_CHECK(val2.is_multimap()); BOOST_CHECK(val2.as_multimap() == v); @@ -812,7 +895,8 @@ BOOST_AUTO_TEST_CASE(object_with_zone_variant_ref_map) std::string s1("ABC"); std::string s2("DEF"); #if (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53 - v.insert(multimap_t::value_type(msgpack::type::variant_ref(boost::string_ref(s1)), msgpack::type::variant_ref(boost::string_ref(s2)))); + v.insert(multimap_t::value_type(msgpack::type::variant_ref(boost::string_ref(s1)), + msgpack::type::variant_ref(boost::string_ref(s2)))); #else // (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53 v.insert(multimap_t::value_type(msgpack::type::variant_ref(s1), msgpack::type::variant_ref(s2))); #endif // (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53 diff --git a/barretenberg/cpp/src/msgpack-c/test/msgpack_cpp11.cpp b/barretenberg/cpp/src/msgpack-c/test/msgpack_cpp11.cpp index 2a856cb8ba8..242c21c6a8e 100644 --- a/barretenberg/cpp/src/msgpack-c/test/msgpack_cpp11.cpp +++ b/barretenberg/cpp/src/msgpack-c/test/msgpack_cpp11.cpp @@ -9,18 +9,15 @@ #if !defined(MSGPACK_USE_CPP03) -class TestEnumClassMemberClass -{ -public: +class TestEnumClassMemberClass { + public: TestEnumClassMemberClass() - : t1(TestEnumClassType::STATE_A), t2(TestEnumClassType::STATE_B), t3(TestEnumClassType::STATE_C) {} - - enum class TestEnumClassType:long { - STATE_INVALID = 0, - STATE_A = 1, - STATE_B = 2, - STATE_C = 3 - }; + : t1(TestEnumClassType::STATE_A) + , t2(TestEnumClassType::STATE_B) + , t3(TestEnumClassType::STATE_C) + {} + + enum class TestEnumClassType : long { STATE_INVALID = 0, STATE_A = 1, STATE_B = 2, STATE_C = 3 }; TestEnumClassType t1; TestEnumClassType t2; TestEnumClassType t3; @@ -35,7 +32,6 @@ using namespace std; const unsigned int kLoop = 10000; const unsigned int kElements = 100; - // C++11 BOOST_AUTO_TEST_CASE(simple_tuple) @@ -43,9 +39,8 @@ BOOST_AUTO_TEST_CASE(simple_tuple) msgpack::sbuffer sbuf; std::tuple val1(true, "kzk", 12.3); msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); - std::tuple val2 = oh.get().as >(); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + std::tuple val2 = oh.get().as>(); BOOST_CHECK(val1 == val2); } @@ -54,9 +49,8 @@ BOOST_AUTO_TEST_CASE(simple_tuple_empty) msgpack::sbuffer sbuf; std::tuple<> val1; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); - std::tuple<> val2 = oh.get().as >(); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + std::tuple<> val2 = oh.get().as>(); BOOST_CHECK(val1 == val2); } @@ -65,9 +59,8 @@ BOOST_AUTO_TEST_CASE(simple_tuple_size_greater_than_as) msgpack::sbuffer sbuf; std::tuple val1(true, "kzk", 42); msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); - std::tuple val2 = oh.get().as >(); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + std::tuple val2 = oh.get().as>(); BOOST_CHECK_EQUAL(std::get<0>(val1), std::get<0>(val2)); BOOST_CHECK_EQUAL(std::get<1>(val1), std::get<1>(val2)); BOOST_CHECK_EQUAL(std::get<2>(val1), std::get<2>(val2)); @@ -78,8 +71,7 @@ BOOST_AUTO_TEST_CASE(simple_tuple_size_greater_than_convert) msgpack::sbuffer sbuf; std::tuple val1(true, "kzk", 42); msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); std::tuple val2; oh.get().convert(val2); BOOST_CHECK_EQUAL(std::get<0>(val1), std::get<0>(val2)); @@ -92,9 +84,8 @@ BOOST_AUTO_TEST_CASE(simple_tuple_size_less_than_as) msgpack::sbuffer sbuf; std::tuple val1(true, "kzk", 42); msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); - std::tuple val2 = oh.get().as >(); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + std::tuple val2 = oh.get().as>(); BOOST_CHECK_EQUAL(std::get<0>(val1), std::get<0>(val2)); BOOST_CHECK_EQUAL(std::get<1>(val1), std::get<1>(val2)); } @@ -104,8 +95,7 @@ BOOST_AUTO_TEST_CASE(simple_tuple_size_less_than_convert) msgpack::sbuffer sbuf; std::tuple val1(true, "kzk", 42); msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); std::tuple val2; oh.get().convert(val2); BOOST_CHECK_EQUAL(std::get<0>(val1), std::get<0>(val2)); @@ -120,10 +110,9 @@ BOOST_AUTO_TEST_CASE(simple_array) val1[i] = rand(); msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); BOOST_CHECK_EQUAL(oh.get().type, msgpack::type::ARRAY); - array val2 = oh.get().as >(); + array val2 = oh.get().as>(); BOOST_CHECK_EQUAL(val1.size(), val2.size()); BOOST_CHECK(equal(val1.begin(), val1.end(), val2.begin())); } @@ -134,39 +123,35 @@ BOOST_AUTO_TEST_CASE(simple_array_empty) array val1; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); BOOST_CHECK_EQUAL(oh.get().type, msgpack::type::ARRAY); - array val2 = oh.get().as >(); + array val2 = oh.get().as>(); BOOST_CHECK_EQUAL(val1.size(), val2.size()); BOOST_CHECK(equal(val1.begin(), val1.end(), val2.begin())); } BOOST_AUTO_TEST_CASE(simple_array_size_less_than) { - array val1 { {1 , 2} }; + array val1{ { 1, 2 } }; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); BOOST_CHECK_EQUAL(oh.get().type, msgpack::type::ARRAY); array val2; try { oh.get().convert(val2); BOOST_CHECK(false); - } - catch (msgpack::type_error const&) { + } catch (msgpack::type_error const&) { BOOST_CHECK(true); } } BOOST_AUTO_TEST_CASE(simple_array_size_greater_than) { - array val1 { {1 , 2} }; + array val1{ { 1, 2 } }; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); BOOST_CHECK_EQUAL(oh.get().type, msgpack::type::ARRAY); array val2; oh.get().convert(val2); @@ -182,10 +167,9 @@ BOOST_AUTO_TEST_CASE(simple_buffer_array_char) val1[i] = static_cast(rand()); msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); BOOST_CHECK_EQUAL(oh.get().type, msgpack::type::BIN); - array val2 = oh.get().as >(); + array val2 = oh.get().as>(); BOOST_CHECK_EQUAL(val1.size(), val2.size()); BOOST_CHECK(equal(val1.begin(), val1.end(), val2.begin())); } @@ -196,27 +180,26 @@ BOOST_AUTO_TEST_CASE(simple_buffer_array_char_empty) array val1; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); BOOST_CHECK_EQUAL(oh.get().type, msgpack::type::BIN); - array val2 = oh.get().as >(); + array val2 = oh.get().as>(); BOOST_CHECK_EQUAL(val1.size(), val2.size()); BOOST_CHECK(equal(val1.begin(), val1.end(), val2.begin())); } BOOST_AUTO_TEST_CASE(simple_buffer_array_unsigned_char) { - if (!msgpack::is_same::value) return; + if (!msgpack::is_same::value) + return; for (unsigned int k = 0; k < kLoop; k++) { array val1; for (unsigned int i = 0; i < kElements; i++) val1[i] = static_cast(rand()); msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); BOOST_CHECK_EQUAL(oh.get().type, msgpack::type::BIN); - array val2 = oh.get().as >(); + array val2 = oh.get().as>(); BOOST_CHECK_EQUAL(val1.size(), val2.size()); BOOST_CHECK(equal(val1.begin(), val1.end(), val2.begin())); } @@ -224,14 +207,14 @@ BOOST_AUTO_TEST_CASE(simple_buffer_array_unsigned_char) BOOST_AUTO_TEST_CASE(simple_buffer_array_unsigned_char_empty) { - if (!msgpack::is_same::value) return; + if (!msgpack::is_same::value) + return; array val1; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); BOOST_CHECK_EQUAL(oh.get().type, msgpack::type::BIN); - array val2 = oh.get().as >(); + array val2 = oh.get().as>(); BOOST_CHECK_EQUAL(val1.size(), val2.size()); BOOST_CHECK(equal(val1.begin(), val1.end(), val2.begin())); } @@ -239,19 +222,20 @@ BOOST_AUTO_TEST_CASE(simple_buffer_array_unsigned_char_empty) // strong typedefs namespace test { -template -struct hash : std::hash { +template struct hash : std::hash { using std::hash::hash; }; -template -struct equal_to : std::equal_to { +template struct equal_to : std::equal_to { using std::equal_to::equal_to; }; -template -struct set_allocator : std::allocator { +template struct set_allocator : std::allocator { using std::allocator::allocator; + + template struct rebind { + using other = set_allocator; + }; }; // C++ named requirement Allocator implies that the first template type @@ -259,17 +243,22 @@ struct set_allocator : std::allocator { // parameters, but the first one must match the type. // That's why this helper with exactly one template parameter representing // a whole key-value pair is required -template -struct map_allocator_impl : std::allocator { +template struct map_allocator_impl : std::allocator { using std::allocator::allocator; + + template struct rebind { + using other = map_allocator_impl; + }; }; -template -using map_allocator = map_allocator_impl>; +template using map_allocator = map_allocator_impl>; -template -struct allocator : std::allocator { +template struct allocator : std::allocator { using std::allocator::allocator; + + template struct rebind { + using other = allocator; + }; }; } // namespace test @@ -283,9 +272,8 @@ BOOST_AUTO_TEST_CASE(simple_buffer_forward_list) val1.push_front(rand()); msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); - type val2 = oh.get().as(); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + type val2 = oh.get().as(); BOOST_CHECK(val1 == val2); } } @@ -296,9 +284,8 @@ BOOST_AUTO_TEST_CASE(simple_buffer_forward_list_empty) type val1; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); - type val2 = oh.get().as(); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + type val2 = oh.get().as(); BOOST_CHECK(val1 == val2); } @@ -311,9 +298,8 @@ BOOST_AUTO_TEST_CASE(simple_buffer_unordered_map) val1[rand()] = rand(); msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); - type val2 = oh.get().as(); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + type val2 = oh.get().as(); BOOST_CHECK(val1 == val2); } } @@ -324,9 +310,8 @@ BOOST_AUTO_TEST_CASE(simple_buffer_unordered_map_empty) type val1; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); - type val2 = oh.get().as(); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + type val2 = oh.get().as(); BOOST_CHECK(val1 == val2); } @@ -342,9 +327,8 @@ BOOST_AUTO_TEST_CASE(simple_buffer_unordered_multimap) } msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); - type val2 = oh.get().as(); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + type val2 = oh.get().as(); BOOST_CHECK(val1 == val2); } @@ -356,9 +340,8 @@ BOOST_AUTO_TEST_CASE(simple_buffer_unordered_multimap_empty) type val1; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); - type val2 = oh.get().as(); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + type val2 = oh.get().as(); BOOST_CHECK(val1 == val2); } @@ -372,8 +355,7 @@ BOOST_AUTO_TEST_CASE(simple_buffer_unordered_set) val1.insert(rand()); msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); type val2 = oh.get().as(); BOOST_CHECK(val1 == val2); } @@ -385,8 +367,7 @@ BOOST_AUTO_TEST_CASE(simple_buffer_unordered_set_empty) type val1; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); type val2 = oh.get().as(); BOOST_CHECK(val1 == val2); } @@ -400,9 +381,8 @@ BOOST_AUTO_TEST_CASE(simple_buffer_unordered_multiset) val1.insert(rand()); msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); - type val2 = oh.get().as(); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + type val2 = oh.get().as(); BOOST_CHECK(val1 == val2); } } @@ -413,9 +393,8 @@ BOOST_AUTO_TEST_CASE(simple_buffer_unordered_multiset_empty) type val1; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); - type val2 = oh.get().as(); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + type val2 = oh.get().as(); BOOST_CHECK(val1 == val2); } @@ -424,8 +403,7 @@ BOOST_AUTO_TEST_CASE(simple_buffer_enum_class_member) TestEnumClassMemberClass val1; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); TestEnumClassMemberClass val2 = oh.get().as(); BOOST_CHECK(val1.t1 == val2.t1); BOOST_CHECK(val1.t2 == val2.t2); @@ -434,53 +412,58 @@ BOOST_AUTO_TEST_CASE(simple_buffer_enum_class_member) struct no_def_con { no_def_con() = delete; - no_def_con(int i):i(i) {} + no_def_con(int i) + : i(i) + {} int i; MSGPACK_DEFINE(i); }; -inline bool operator==(no_def_con const& lhs, no_def_con const& rhs) { +inline bool operator==(no_def_con const& lhs, no_def_con const& rhs) +{ return lhs.i == rhs.i; } -inline bool operator!=(no_def_con const& lhs, no_def_con const& rhs) { +inline bool operator!=(no_def_con const& lhs, no_def_con const& rhs) +{ return !(lhs == rhs); } -inline bool operator<(no_def_con const& lhs, no_def_con const& rhs) { - return lhs.i < rhs.i; +inline bool operator<(no_def_con const& lhs, no_def_con const& rhs) +{ + return lhs.i < rhs.i; } namespace msgpack { -MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS) { +MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS) +{ namespace adaptor { - template <> - struct as { - no_def_con operator()(msgpack::object const& o) const { - if (o.type != msgpack::type::ARRAY) throw msgpack::type_error(); - if (o.via.array.size != 1) throw msgpack::type_error(); + template <> struct as { + no_def_con operator()(msgpack::object const& o) const + { + if (o.type != msgpack::type::ARRAY) + throw msgpack::type_error(); + if (o.via.array.size != 1) + throw msgpack::type_error(); return no_def_con(o.via.array.ptr[0].as()); } }; - } // adaptor + } // namespace adaptor } // MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS) -} // msgpack +} // namespace msgpack namespace std { template <> struct hash { - size_t operator()(const no_def_con & x) const { - return hash()(x.i); - } + size_t operator()(const no_def_con& x) const { return hash()(x.i); } }; -} // std +} // namespace std BOOST_AUTO_TEST_CASE(no_def_con_simple_buffer) { no_def_con val1(42); msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); no_def_con val2 = oh.get().as(); BOOST_CHECK(val1 == val2); @@ -488,230 +471,224 @@ BOOST_AUTO_TEST_CASE(no_def_con_simple_buffer) struct no_def_con_composite { no_def_con_composite() = delete; - no_def_con_composite(int i):ndc(i) {} - no_def_con_composite(no_def_con const& a):ndc(a) {} + no_def_con_composite(int i) + : ndc(i) + {} + no_def_con_composite(no_def_con const& a) + : ndc(a) + {} no_def_con ndc; MSGPACK_DEFINE(ndc); }; -inline bool operator==(no_def_con_composite const& lhs, no_def_con_composite const& rhs) { +inline bool operator==(no_def_con_composite const& lhs, no_def_con_composite const& rhs) +{ return lhs.ndc == rhs.ndc; } -inline bool operator!=(no_def_con_composite const& lhs, no_def_con_composite const& rhs) { +inline bool operator!=(no_def_con_composite const& lhs, no_def_con_composite const& rhs) +{ return !(lhs == rhs); } -inline bool operator<(no_def_con_composite const& lhs, no_def_con_composite const& rhs) { +inline bool operator<(no_def_con_composite const& lhs, no_def_con_composite const& rhs) +{ return lhs.ndc < rhs.ndc; } namespace msgpack { -MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS) { +MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS) +{ namespace adaptor { - template <> - struct as { - no_def_con_composite operator()(msgpack::object const& o) const { - if (o.type != msgpack::type::ARRAY) throw msgpack::type_error(); - if (o.via.array.size != 1) throw msgpack::type_error(); + template <> struct as { + no_def_con_composite operator()(msgpack::object const& o) const + { + if (o.type != msgpack::type::ARRAY) + throw msgpack::type_error(); + if (o.via.array.size != 1) + throw msgpack::type_error(); return no_def_con_composite(o.via.array.ptr[0].as()); } }; - } // adaptor + } // namespace adaptor } // MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS) -} // msgpack +} // namespace msgpack BOOST_AUTO_TEST_CASE(no_def_con_composite_simple_buffer) { no_def_con_composite val1(42); msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); no_def_con_composite val2 = oh.get().as(); BOOST_CHECK(val1 == val2); } struct no_def_con_inherit : no_def_con { no_def_con_inherit() = delete; - no_def_con_inherit(no_def_con const& a):no_def_con(a) {} + no_def_con_inherit(no_def_con const& a) + : no_def_con(a) + {} MSGPACK_DEFINE(MSGPACK_BASE(no_def_con)); }; namespace msgpack { -MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS) { +MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS) +{ namespace adaptor { - template <> - struct as { - no_def_con_inherit operator()(msgpack::object const& o) const { - if (o.type != msgpack::type::ARRAY) throw msgpack::type_error(); - if (o.via.array.size != 1) throw msgpack::type_error(); + template <> struct as { + no_def_con_inherit operator()(msgpack::object const& o) const + { + if (o.type != msgpack::type::ARRAY) + throw msgpack::type_error(); + if (o.via.array.size != 1) + throw msgpack::type_error(); return no_def_con_inherit(o.via.array.ptr[0].as()); } }; - } // adaptor + } // namespace adaptor } // MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS) -} // msgpack +} // namespace msgpack BOOST_AUTO_TEST_CASE(no_def_con_inherit_simple_buffer) { no_def_con_inherit val1(42); msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); no_def_con_inherit val2 = oh.get().as(); BOOST_CHECK(val1 == val2); } BOOST_AUTO_TEST_CASE(no_def_con_vector_simple_buffer) { - std::vector val1 { 1, 2, 3 }; + std::vector val1{ 1, 2, 3 }; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); std::vector val2 = oh.get().as>(); BOOST_CHECK(val1 == val2); } BOOST_AUTO_TEST_CASE(no_def_con_list_simple_buffer) { - std::list val1 { 1, 2, 3 }; + std::list val1{ 1, 2, 3 }; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); std::list val2 = oh.get().as>(); BOOST_CHECK(val1 == val2); } BOOST_AUTO_TEST_CASE(no_def_con_set_simple_buffer) { - std::set val1 { 1, 2, 3 }; + std::set val1{ 1, 2, 3 }; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); std::set val2 = oh.get().as>(); BOOST_CHECK(val1 == val2); } BOOST_AUTO_TEST_CASE(no_def_con_multiset_simple_buffer) { - std::multiset val1 { 1, 2, 3 }; + std::multiset val1{ 1, 2, 3 }; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); std::multiset val2 = oh.get().as>(); BOOST_CHECK(val1 == val2); } BOOST_AUTO_TEST_CASE(no_def_con_assoc_vector_simple_buffer) { - msgpack::type::assoc_vector val1 { {1, 2}, {3, 4}, {5, 6}}; + msgpack::type::assoc_vector val1{ { 1, 2 }, { 3, 4 }, { 5, 6 } }; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); - msgpack::type::assoc_vector val2 - = oh.get().as>(); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::type::assoc_vector val2 = + oh.get().as>(); BOOST_CHECK(val1 == val2); } BOOST_AUTO_TEST_CASE(no_def_con_def_con_assoc_vector_simple_buffer) { - msgpack::type::assoc_vector val1 { {1, 2}, {3, 4}, {5, 6}}; + msgpack::type::assoc_vector val1{ { 1, 2 }, { 3, 4 }, { 5, 6 } }; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); - msgpack::type::assoc_vector val2 - = oh.get().as>(); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::type::assoc_vector val2 = oh.get().as>(); BOOST_CHECK(val1 == val2); } BOOST_AUTO_TEST_CASE(no_def_con_map_simple_buffer) { - std::map val1 { {1, 2}, {3, 4}, {5, 6}}; + std::map val1{ { 1, 2 }, { 3, 4 }, { 5, 6 } }; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); - std::map val2 - = oh.get().as>(); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + std::map val2 = oh.get().as>(); BOOST_CHECK(val1 == val2); } BOOST_AUTO_TEST_CASE(no_def_con_def_con_map_simple_buffer) { - std::map val1 { {1, 2}, {3, 4}, {5, 6}}; + std::map val1{ { 1, 2 }, { 3, 4 }, { 5, 6 } }; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); - std::map val2 - = oh.get().as>(); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + std::map val2 = oh.get().as>(); BOOST_CHECK(val1 == val2); } BOOST_AUTO_TEST_CASE(no_def_con_multimap_simple_buffer) { - std::multimap val1 { {1, 2}, {3, 4}, {5, 6}}; + std::multimap val1{ { 1, 2 }, { 3, 4 }, { 5, 6 } }; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); - std::multimap val2 - = oh.get().as>(); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + std::multimap val2 = + oh.get().as>(); BOOST_CHECK(val1 == val2); } BOOST_AUTO_TEST_CASE(no_def_con_def_con_multimap_simple_buffer) { - std::multimap val1 { {1, 2}, {3, 4}, {5, 6}}; + std::multimap val1{ { 1, 2 }, { 3, 4 }, { 5, 6 } }; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); - std::multimap val2 - = oh.get().as>(); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + std::multimap val2 = oh.get().as>(); BOOST_CHECK(val1 == val2); } BOOST_AUTO_TEST_CASE(no_def_con_deque_simple_buffer) { - std::deque val1 { 1, 2, 3 }; + std::deque val1{ 1, 2, 3 }; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); std::deque val2 = oh.get().as>(); BOOST_CHECK(val1 == val2); } BOOST_AUTO_TEST_CASE(no_def_con_pair_simple_buffer) { - std::pair val1 {1, 2}; + std::pair val1{ 1, 2 }; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); - std::pair val2 - = oh.get().as>(); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + std::pair val2 = oh.get().as>(); BOOST_CHECK(val1 == val2); } BOOST_AUTO_TEST_CASE(no_def_con_def_con_pair_simple_buffer) { - std::pair val1 {1, 2}; + std::pair val1{ 1, 2 }; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); - std::pair val2 - = oh.get().as>(); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + std::pair val2 = oh.get().as>(); BOOST_CHECK(val1 == val2); } @@ -721,49 +698,44 @@ BOOST_AUTO_TEST_CASE(no_def_con_def_con_pair_simple_buffer) BOOST_AUTO_TEST_CASE(no_def_con_tuple_simple_buffer) { - std::tuple val1 {1, 2, 3}; + std::tuple val1{ 1, 2, 3 }; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); - std::tuple val2 - = oh.get().as>(); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + std::tuple val2 = + oh.get().as>(); BOOST_CHECK(val1 == val2); } BOOST_AUTO_TEST_CASE(no_def_con_def_con_tuple_simple_buffer) { - std::tuple val1 {1, 2, 3}; + std::tuple val1{ 1, 2, 3 }; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); - std::tuple val2 - = oh.get().as>(); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + std::tuple val2 = oh.get().as>(); BOOST_CHECK(val1 == val2); } BOOST_AUTO_TEST_CASE(no_def_con_msgpack_tuple_simple_buffer) { - msgpack::type::tuple val1 {1, 2, 3}; + msgpack::type::tuple val1{ 1, 2, 3 }; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); - msgpack::type::tuple val2 - = oh.get().as>(); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::type::tuple val2 = + oh.get().as>(); BOOST_CHECK(val1 == val2); } BOOST_AUTO_TEST_CASE(no_def_con_def_con_msgpack_tuple_simple_buffer) { - msgpack::type::tuple val1 {1, 2, 3}; + msgpack::type::tuple val1{ 1, 2, 3 }; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); - msgpack::type::tuple val2 - = oh.get().as>(); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::type::tuple val2 = + oh.get().as>(); BOOST_CHECK(val1 == val2); } @@ -771,106 +743,93 @@ BOOST_AUTO_TEST_CASE(no_def_con_def_con_msgpack_tuple_simple_buffer) BOOST_AUTO_TEST_CASE(no_def_forward_list_simple_buffer) { - std::forward_list val1 { 1, 2, 3 }; + std::forward_list val1{ 1, 2, 3 }; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); std::forward_list val2 = oh.get().as>(); BOOST_CHECK(val1 == val2); } BOOST_AUTO_TEST_CASE(no_def_con_unordered_set_simple_buffer) { - std::unordered_set val1 { 1, 2, 3 }; + std::unordered_set val1{ 1, 2, 3 }; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); std::unordered_set val2 = oh.get().as>(); BOOST_CHECK(val1 == val2); } BOOST_AUTO_TEST_CASE(no_def_con_unordered_multiset_simple_buffer) { - std::unordered_multiset val1 { 1, 2, 3 }; + std::unordered_multiset val1{ 1, 2, 3 }; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); std::unordered_multiset val2 = oh.get().as>(); BOOST_CHECK(val1 == val2); } BOOST_AUTO_TEST_CASE(no_def_con_unordered_map_simple_buffer) { - std::unordered_map val1 { {1, 2}, {3, 4}, {5, 6}}; + std::unordered_map val1{ { 1, 2 }, { 3, 4 }, { 5, 6 } }; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); - std::unordered_map val2 - = oh.get().as>(); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + std::unordered_map val2 = + oh.get().as>(); BOOST_CHECK(val1 == val2); } BOOST_AUTO_TEST_CASE(no_def_con_def_con_unordered_map_simple_buffer) { - std::unordered_map val1 { {1, 2}, {3, 4}, {5, 6}}; + std::unordered_map val1{ { 1, 2 }, { 3, 4 }, { 5, 6 } }; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); - std::unordered_map val2 - = oh.get().as>(); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + std::unordered_map val2 = oh.get().as>(); BOOST_CHECK(val1 == val2); } BOOST_AUTO_TEST_CASE(no_def_con_unordered_multimap_simple_buffer) { - std::unordered_multimap val1 { {1, 2}, {3, 4}, {5, 6}}; + std::unordered_multimap val1{ { 1, 2 }, { 3, 4 }, { 5, 6 } }; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); - std::unordered_multimap val2 - = oh.get().as>(); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + std::unordered_multimap val2 = + oh.get().as>(); BOOST_CHECK(val1 == val2); } BOOST_AUTO_TEST_CASE(no_def_con_def_con_unordered_multimap_simple_buffer) { - std::unordered_multimap val1 { {1, 2}, {3, 4}, {5, 6}}; + std::unordered_multimap val1{ { 1, 2 }, { 3, 4 }, { 5, 6 } }; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); - std::unordered_multimap val2 - = oh.get().as>(); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + std::unordered_multimap val2 = oh.get().as>(); BOOST_CHECK(val1 == val2); } BOOST_AUTO_TEST_CASE(no_def_con_array_simple_buffer) { - std::array val1 { { 1, 2, 3 } }; + std::array val1{ { 1, 2, 3 } }; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); std::array val2 = oh.get().as>(); BOOST_CHECK(val1 == val2); } -#if !defined(MSGPACK_NO_BOOST) - BOOST_AUTO_TEST_CASE(system_clock) { std::chrono::system_clock::time_point val1; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); std::chrono::system_clock::time_point val2 = oh.get().as(); BOOST_CHECK(val1 == val2); @@ -884,18 +843,11 @@ BOOST_AUTO_TEST_CASE(system_clock_32) std::chrono::system_clock::time_point val1(std::chrono::seconds(0x12345678L)); msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - char packed[] = { - static_cast(0xd6u), - static_cast(-1), - static_cast(0x12), - static_cast(0x34), - static_cast(0x56), - static_cast(0x78) - }; + char packed[] = { static_cast(0xd6u), static_cast(-1), static_cast(0x12), + static_cast(0x34), static_cast(0x56), static_cast(0x78) }; BOOST_CHECK_EQUAL(memcmp(sbuf.data(), packed, sizeof(packed)), 0); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); std::chrono::system_clock::time_point val2 = oh.get().as(); BOOST_CHECK(val1 == val2); @@ -909,18 +861,11 @@ BOOST_AUTO_TEST_CASE(system_clock_32_max) std::chrono::system_clock::time_point val1(std::chrono::seconds(0xffffffffL)); msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - char packed[] = { - static_cast(0xd6u), - static_cast(-1), - static_cast(0xffu), - static_cast(0xffu), - static_cast(0xffu), - static_cast(0xffu) - }; + char packed[] = { static_cast(0xd6u), static_cast(-1), static_cast(0xffu), + static_cast(0xffu), static_cast(0xffu), static_cast(0xffu) }; BOOST_CHECK_EQUAL(memcmp(sbuf.data(), packed, sizeof(packed)), 0); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); std::chrono::system_clock::time_point val2 = oh.get().as(); BOOST_CHECK(val1 == val2); @@ -929,19 +874,14 @@ BOOST_AUTO_TEST_CASE(system_clock_32_max) BOOST_CHECK(val1 == val3); } - BOOST_AUTO_TEST_CASE(system_clock_64) { std::chrono::system_clock::time_point val1(std::chrono::seconds(0x31234567L)); - val1 += - std::chrono::duration_cast( - std::chrono::nanoseconds(0x312345678L) - ); + val1 += std::chrono::duration_cast(std::chrono::nanoseconds(0x312345678L)); msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); std::chrono::system_clock::time_point val2 = oh.get().as(); BOOST_CHECK(val1 == val2); @@ -954,45 +894,28 @@ BOOST_AUTO_TEST_CASE(system_clock_64_max) { std::chrono::system_clock::time_point val1(std::chrono::seconds(0xffffffffL)); - val1 += - std::chrono::duration_cast( - std::chrono::nanoseconds(0x3b9ac9ffL) // 999,999,999 - ); - msgpack::sbuffer sbuf; - msgpack::pack(sbuf, val1); - char packed_nano[] = { - static_cast(0xd7u), - static_cast(-1), - static_cast(0xeeu), // 999,999,999 << 2 - static_cast(0x6b), - static_cast(0x27), - static_cast(0xfcu), - static_cast(0xffu), // 32 bit sec - static_cast(0xffu), - static_cast(0xffu), - static_cast(0xffu) - }; - char packed_micro[] = { - static_cast(0xd7u), - static_cast(-1), - static_cast(0xeeu), // 999,999,000 << 2 - static_cast(0x6b), - static_cast(0x18), - static_cast(0x60), - static_cast(0xffu), // 32 bit sec - static_cast(0xffu), - static_cast(0xffu), - static_cast(0xffu) - }; + val1 += std::chrono::duration_cast( + std::chrono::nanoseconds(0x3b9ac9ffL) // 999,999,999 + ); + msgpack::sbuffer sbuf; + msgpack::pack(sbuf, val1); + char packed_nano[] = { static_cast(0xd7u), static_cast(-1), + static_cast(0xeeu), // 999,999,999 << 2 + static_cast(0x6b), static_cast(0x27), static_cast(0xfcu), + static_cast(0xffu), // 32 bit sec + static_cast(0xffu), static_cast(0xffu), static_cast(0xffu) }; + char packed_micro[] = { static_cast(0xd7u), static_cast(-1), + static_cast(0xeeu), // 999,999,000 << 2 + static_cast(0x6b), static_cast(0x18), static_cast(0x60), + static_cast(0xffu), // 32 bit sec + static_cast(0xffu), static_cast(0xffu), static_cast(0xffu) }; if (std::chrono::system_clock::duration::period::ratio::den == 1000000000) { BOOST_CHECK_EQUAL(memcmp(sbuf.data(), packed_nano, sizeof(packed_nano)), 0); - } - else if (std::chrono::system_clock::duration::period::ratio::den == 1000000) { + } else if (std::chrono::system_clock::duration::period::ratio::den == 1000000) { BOOST_CHECK_EQUAL(memcmp(sbuf.data(), packed_micro, sizeof(packed_micro)), 0); } - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); std::chrono::system_clock::time_point val2 = oh.get().as(); BOOST_CHECK(val1 == val2); @@ -1007,8 +930,7 @@ BOOST_AUTO_TEST_CASE(system_clock_impl_min) msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); std::chrono::system_clock::time_point val2 = oh.get().as(); BOOST_CHECK(val1 == val2); @@ -1024,8 +946,7 @@ BOOST_AUTO_TEST_CASE(system_clock_impl_max) msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); std::chrono::system_clock::time_point val2 = oh.get().as(); BOOST_CHECK(val1 == val2); @@ -1041,8 +962,7 @@ BOOST_AUTO_TEST_CASE(system_clock_impl_now) msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); std::chrono::system_clock::time_point val2 = oh.get().as(); BOOST_CHECK(val1 == val2); @@ -1057,8 +977,7 @@ BOOST_AUTO_TEST_CASE(steady_clock) msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); std::chrono::steady_clock::time_point val2 = oh.get().as(); BOOST_CHECK(val1 == val2); @@ -1072,18 +991,11 @@ BOOST_AUTO_TEST_CASE(steady_clock_32) std::chrono::steady_clock::time_point val1(std::chrono::seconds(0x12345678L)); msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - char packed[] = { - static_cast(0xd6u), - static_cast(-1), - static_cast(0x12), - static_cast(0x34), - static_cast(0x56), - static_cast(0x78) - }; + char packed[] = { static_cast(0xd6u), static_cast(-1), static_cast(0x12), + static_cast(0x34), static_cast(0x56), static_cast(0x78) }; BOOST_CHECK_EQUAL(memcmp(sbuf.data(), packed, sizeof(packed)), 0); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); std::chrono::steady_clock::time_point val2 = oh.get().as(); BOOST_CHECK(val1 == val2); @@ -1097,18 +1009,11 @@ BOOST_AUTO_TEST_CASE(steady_clock_32_max) std::chrono::steady_clock::time_point val1(std::chrono::seconds(0xffffffffL)); msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - char packed[] = { - static_cast(0xd6u), - static_cast(-1), - static_cast(0xffu), - static_cast(0xffu), - static_cast(0xffu), - static_cast(0xffu) - }; + char packed[] = { static_cast(0xd6u), static_cast(-1), static_cast(0xffu), + static_cast(0xffu), static_cast(0xffu), static_cast(0xffu) }; BOOST_CHECK_EQUAL(memcmp(sbuf.data(), packed, sizeof(packed)), 0); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); std::chrono::steady_clock::time_point val2 = oh.get().as(); BOOST_CHECK(val1 == val2); @@ -1117,19 +1022,14 @@ BOOST_AUTO_TEST_CASE(steady_clock_32_max) BOOST_CHECK(val1 == val3); } - BOOST_AUTO_TEST_CASE(steady_clock_64) { std::chrono::steady_clock::time_point val1(std::chrono::seconds(0x31234567L)); - val1 += - std::chrono::duration_cast( - std::chrono::nanoseconds(0x312345678L) - ); + val1 += std::chrono::duration_cast(std::chrono::nanoseconds(0x312345678L)); msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); std::chrono::steady_clock::time_point val2 = oh.get().as(); BOOST_CHECK(val1 == val2); @@ -1142,45 +1042,28 @@ BOOST_AUTO_TEST_CASE(steady_clock_64_max) { std::chrono::steady_clock::time_point val1(std::chrono::seconds(0xffffffffL)); - val1 += - std::chrono::duration_cast( - std::chrono::nanoseconds(0x3b9ac9ffL) // 999,999,999 - ); - msgpack::sbuffer sbuf; - msgpack::pack(sbuf, val1); - char packed_nano[] = { - static_cast(0xd7u), - static_cast(-1), - static_cast(0xeeu), // 999,999,999 << 2 - static_cast(0x6b), - static_cast(0x27), - static_cast(0xfcu), - static_cast(0xffu), // 32 bit sec - static_cast(0xffu), - static_cast(0xffu), - static_cast(0xffu) - }; - char packed_micro[] = { - static_cast(0xd7u), - static_cast(-1), - static_cast(0xeeu), // 999,999,000 << 2 - static_cast(0x6b), - static_cast(0x18), - static_cast(0x60), - static_cast(0xffu), // 32 bit sec - static_cast(0xffu), - static_cast(0xffu), - static_cast(0xffu) - }; + val1 += std::chrono::duration_cast( + std::chrono::nanoseconds(0x3b9ac9ffL) // 999,999,999 + ); + msgpack::sbuffer sbuf; + msgpack::pack(sbuf, val1); + char packed_nano[] = { static_cast(0xd7u), static_cast(-1), + static_cast(0xeeu), // 999,999,999 << 2 + static_cast(0x6b), static_cast(0x27), static_cast(0xfcu), + static_cast(0xffu), // 32 bit sec + static_cast(0xffu), static_cast(0xffu), static_cast(0xffu) }; + char packed_micro[] = { static_cast(0xd7u), static_cast(-1), + static_cast(0xeeu), // 999,999,000 << 2 + static_cast(0x6b), static_cast(0x18), static_cast(0x60), + static_cast(0xffu), // 32 bit sec + static_cast(0xffu), static_cast(0xffu), static_cast(0xffu) }; if (std::chrono::steady_clock::duration::period::ratio::den == 1000000000) { BOOST_CHECK_EQUAL(memcmp(sbuf.data(), packed_nano, sizeof(packed_nano)), 0); - } - else if (std::chrono::steady_clock::duration::period::ratio::den == 1000000) { + } else if (std::chrono::steady_clock::duration::period::ratio::den == 1000000) { BOOST_CHECK_EQUAL(memcmp(sbuf.data(), packed_micro, sizeof(packed_micro)), 0); } - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); std::chrono::steady_clock::time_point val2 = oh.get().as(); BOOST_CHECK(val1 == val2); @@ -1195,8 +1078,7 @@ BOOST_AUTO_TEST_CASE(steady_clock_impl_min) msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); std::chrono::steady_clock::time_point val2 = oh.get().as(); BOOST_CHECK(val1 == val2); @@ -1212,8 +1094,7 @@ BOOST_AUTO_TEST_CASE(steady_clock_impl_max) msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); std::chrono::steady_clock::time_point val2 = oh.get().as(); BOOST_CHECK(val1 == val2); @@ -1229,8 +1110,7 @@ BOOST_AUTO_TEST_CASE(steady_clock_impl_now) msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); std::chrono::steady_clock::time_point val2 = oh.get().as(); BOOST_CHECK(val1 == val2); @@ -1239,15 +1119,13 @@ BOOST_AUTO_TEST_CASE(steady_clock_impl_now) BOOST_CHECK(val1 == val3); } - BOOST_AUTO_TEST_CASE(high_resolution_clock) { std::chrono::high_resolution_clock::time_point val1; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); std::chrono::high_resolution_clock::time_point val2 = oh.get().as(); BOOST_CHECK(val1 == val2); @@ -1261,18 +1139,11 @@ BOOST_AUTO_TEST_CASE(high_resolution_clock_32) std::chrono::high_resolution_clock::time_point val1(std::chrono::seconds(0x12345678L)); msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - char packed[] = { - static_cast(0xd6u), - static_cast(-1), - static_cast(0x12), - static_cast(0x34), - static_cast(0x56), - static_cast(0x78) - }; + char packed[] = { static_cast(0xd6u), static_cast(-1), static_cast(0x12), + static_cast(0x34), static_cast(0x56), static_cast(0x78) }; BOOST_CHECK_EQUAL(memcmp(sbuf.data(), packed, sizeof(packed)), 0); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); std::chrono::high_resolution_clock::time_point val2 = oh.get().as(); BOOST_CHECK(val1 == val2); @@ -1286,18 +1157,11 @@ BOOST_AUTO_TEST_CASE(high_resolution_clock_32_max) std::chrono::high_resolution_clock::time_point val1(std::chrono::seconds(0xffffffffL)); msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - char packed[] = { - static_cast(0xd6u), - static_cast(-1), - static_cast(0xffu), - static_cast(0xffu), - static_cast(0xffu), - static_cast(0xffu) - }; + char packed[] = { static_cast(0xd6u), static_cast(-1), static_cast(0xffu), + static_cast(0xffu), static_cast(0xffu), static_cast(0xffu) }; BOOST_CHECK_EQUAL(memcmp(sbuf.data(), packed, sizeof(packed)), 0); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); std::chrono::high_resolution_clock::time_point val2 = oh.get().as(); BOOST_CHECK(val1 == val2); @@ -1306,19 +1170,15 @@ BOOST_AUTO_TEST_CASE(high_resolution_clock_32_max) BOOST_CHECK(val1 == val3); } - BOOST_AUTO_TEST_CASE(high_resolution_clock_64) { std::chrono::high_resolution_clock::time_point val1(std::chrono::seconds(0x31234567L)); - val1 += - std::chrono::duration_cast( - std::chrono::nanoseconds(0x312345678L) - ); + val1 += std::chrono::duration_cast( + std::chrono::nanoseconds(0x312345678L)); msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); std::chrono::high_resolution_clock::time_point val2 = oh.get().as(); BOOST_CHECK(val1 == val2); @@ -1331,45 +1191,28 @@ BOOST_AUTO_TEST_CASE(high_resolution_clock_64_max) { std::chrono::high_resolution_clock::time_point val1(std::chrono::seconds(0xffffffffL)); - val1 += - std::chrono::duration_cast( - std::chrono::nanoseconds(0x3b9ac9ffL) // 999,999,999 - ); - msgpack::sbuffer sbuf; - msgpack::pack(sbuf, val1); - char packed_nano[] = { - static_cast(0xd7u), - static_cast(-1), - static_cast(0xeeu), // 999,999,999 << 2 - static_cast(0x6b), - static_cast(0x27), - static_cast(0xfcu), - static_cast(0xffu), // 32 bit sec - static_cast(0xffu), - static_cast(0xffu), - static_cast(0xffu) - }; - char packed_micro[] = { - static_cast(0xd7u), - static_cast(-1), - static_cast(0xeeu), // 999,999,000 << 2 - static_cast(0x6b), - static_cast(0x18), - static_cast(0x60), - static_cast(0xffu), // 32 bit sec - static_cast(0xffu), - static_cast(0xffu), - static_cast(0xffu) - }; + val1 += std::chrono::duration_cast( + std::chrono::nanoseconds(0x3b9ac9ffL) // 999,999,999 + ); + msgpack::sbuffer sbuf; + msgpack::pack(sbuf, val1); + char packed_nano[] = { static_cast(0xd7u), static_cast(-1), + static_cast(0xeeu), // 999,999,999 << 2 + static_cast(0x6b), static_cast(0x27), static_cast(0xfcu), + static_cast(0xffu), // 32 bit sec + static_cast(0xffu), static_cast(0xffu), static_cast(0xffu) }; + char packed_micro[] = { static_cast(0xd7u), static_cast(-1), + static_cast(0xeeu), // 999,999,000 << 2 + static_cast(0x6b), static_cast(0x18), static_cast(0x60), + static_cast(0xffu), // 32 bit sec + static_cast(0xffu), static_cast(0xffu), static_cast(0xffu) }; if (std::chrono::high_resolution_clock::duration::period::ratio::den == 1000000000) { BOOST_CHECK_EQUAL(memcmp(sbuf.data(), packed_nano, sizeof(packed_nano)), 0); - } - else if (std::chrono::high_resolution_clock::duration::period::ratio::den == 1000000) { + } else if (std::chrono::high_resolution_clock::duration::period::ratio::den == 1000000) { BOOST_CHECK_EQUAL(memcmp(sbuf.data(), packed_micro, sizeof(packed_micro)), 0); } - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); std::chrono::high_resolution_clock::time_point val2 = oh.get().as(); BOOST_CHECK(val1 == val2); @@ -1384,8 +1227,7 @@ BOOST_AUTO_TEST_CASE(high_resolution_clock_impl_min) msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); std::chrono::high_resolution_clock::time_point val2 = oh.get().as(); BOOST_CHECK(val1 == val2); @@ -1401,8 +1243,7 @@ BOOST_AUTO_TEST_CASE(high_resolution_clock_impl_max) msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); std::chrono::high_resolution_clock::time_point val2 = oh.get().as(); BOOST_CHECK(val1 == val2); @@ -1418,8 +1259,7 @@ BOOST_AUTO_TEST_CASE(high_resolution_clock_impl_now) msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = - msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); std::chrono::high_resolution_clock::time_point val2 = oh.get().as(); BOOST_CHECK(val1 == val2); @@ -1428,9 +1268,6 @@ BOOST_AUTO_TEST_CASE(high_resolution_clock_impl_now) BOOST_CHECK(val1 == val3); } -#endif // !defined(MSGPACK_NO_BOOST) - - BOOST_AUTO_TEST_CASE(timespec_pack_convert_zero) { std::stringstream ss; @@ -1460,7 +1297,9 @@ BOOST_AUTO_TEST_CASE(timespec_object_with_zone_zero) BOOST_AUTO_TEST_CASE(timespec_pack_convert_32bit_sec) { std::stringstream ss; - timespec val1{ std::numeric_limits().tv_sec)>::is_signed ? time_t(INT32_MAX) : time_t(UINT32_MAX), 0 }; + timespec val1{ std::numeric_limits().tv_sec)>::is_signed ? time_t(INT32_MAX) + : time_t(UINT32_MAX), + 0 }; msgpack::pack(ss, val1); std::string const& str = ss.str(); @@ -1476,7 +1315,9 @@ BOOST_AUTO_TEST_CASE(timespec_pack_convert_32bit_sec) BOOST_AUTO_TEST_CASE(timespec_object_with_zone_32bit_sec) { msgpack::zone z; - timespec val1{ std::numeric_limits().tv_sec)>::is_signed ? time_t(INT32_MAX) : time_t(UINT32_MAX), 0 }; + timespec val1{ std::numeric_limits().tv_sec)>::is_signed ? time_t(INT32_MAX) + : time_t(UINT32_MAX), + 0 }; msgpack::object obj(val1, z); timespec val2 = obj.as(); BOOST_CHECK_EQUAL(val1.tv_sec, val2.tv_sec); @@ -1510,7 +1351,8 @@ BOOST_AUTO_TEST_CASE(timespec_object_with_zone_max_nano) BOOST_AUTO_TEST_CASE(timespec_pack_convert_34bit_sec_max_nano) { - if (sizeof(decltype(std::declval().tv_sec)) <= 4) return; + if (sizeof(decltype(std::declval().tv_sec)) <= 4) + return; std::stringstream ss; timespec val1{ static_cast().tv_sec)>(0x3ffffffffULL), 999999999 }; @@ -1527,7 +1369,8 @@ BOOST_AUTO_TEST_CASE(timespec_pack_convert_34bit_sec_max_nano) BOOST_AUTO_TEST_CASE(timespec_object_with_zone_34bit_sec_max_nano) { - if (sizeof(decltype(std::declval().tv_sec)) <= 4) return; + if (sizeof(decltype(std::declval().tv_sec)) <= 4) + return; msgpack::zone z; timespec val1{ static_cast().tv_sec)>(0x3ffffffffULL), 999999999 }; msgpack::object obj(val1, z); @@ -1538,7 +1381,8 @@ BOOST_AUTO_TEST_CASE(timespec_object_with_zone_34bit_sec_max_nano) BOOST_AUTO_TEST_CASE(timespec_pack_convert_35bit_sec_max_nano) { - if (sizeof(decltype(std::declval().tv_sec)) <= 4) return; + if (sizeof(decltype(std::declval().tv_sec)) <= 4) + return; std::stringstream ss; timespec val1{ static_cast().tv_sec)>(0x7ffffffffULL), 999999999 }; @@ -1555,7 +1399,8 @@ BOOST_AUTO_TEST_CASE(timespec_pack_convert_35bit_sec_max_nano) BOOST_AUTO_TEST_CASE(timespec_object_with_zone_35bit_sec_max_nano) { - if (sizeof(decltype(std::declval().tv_sec)) <= 4) return; + if (sizeof(decltype(std::declval().tv_sec)) <= 4) + return; msgpack::zone z; timespec val1{ static_cast().tv_sec)>(0x7ffffffffULL), 999999999 }; msgpack::object obj(val1, z); @@ -1566,7 +1411,8 @@ BOOST_AUTO_TEST_CASE(timespec_object_with_zone_35bit_sec_max_nano) BOOST_AUTO_TEST_CASE(timespec_pack_convert_64bit_sec_max_nano) { - if (sizeof(decltype(std::declval().tv_sec)) <= 4) return; + if (sizeof(decltype(std::declval().tv_sec)) <= 4) + return; std::stringstream ss; timespec val1{ std::numeric_limits().tv_sec)>::max(), 999999999 }; @@ -1591,5 +1437,4 @@ BOOST_AUTO_TEST_CASE(timespec_object_with_zone_64bit_sec_max_nano) BOOST_CHECK_EQUAL(val1.tv_nsec, val2.tv_nsec); } - #endif // !defined(MSGPACK_USE_CPP03) diff --git a/barretenberg/cpp/src/msgpack-c/test/msgpack_cpp17.cpp b/barretenberg/cpp/src/msgpack-c/test/msgpack_cpp17.cpp index c90a55ad4ae..5d0ebf6af4e 100644 --- a/barretenberg/cpp/src/msgpack-c/test/msgpack_cpp17.cpp +++ b/barretenberg/cpp/src/msgpack-c/test/msgpack_cpp17.cpp @@ -8,9 +8,7 @@ #endif // For C++ standards lower than C++17 -BOOST_AUTO_TEST_CASE(dummy) -{ -} +BOOST_AUTO_TEST_CASE(dummy) {} #if MSGPACK_CPP_VERSION >= 201703 @@ -24,9 +22,8 @@ BOOST_AUTO_TEST_CASE(optional_pack_convert_nil) std::optional val1; msgpack::pack(ss, val1); std::string const& str = ss.str(); - msgpack::object_handle oh = - msgpack::unpack(str.data(), str.size()); - std::optional val2 = oh.get().as >(); + msgpack::object_handle oh = msgpack::unpack(str.data(), str.size()); + std::optional val2 = oh.get().as>(); BOOST_CHECK(val1 == val2); } @@ -36,15 +33,14 @@ BOOST_AUTO_TEST_CASE(optional_pack_convert_int) std::optional val1 = 1; msgpack::pack(ss, val1); std::string const& str = ss.str(); - msgpack::object_handle oh = - msgpack::unpack(str.data(), str.size()); - std::optional val2 = oh.get().as >(); + msgpack::object_handle oh = msgpack::unpack(str.data(), str.size()); + std::optional val2 = oh.get().as>(); BOOST_CHECK(val1 == val2); } BOOST_AUTO_TEST_CASE(optional_pack_convert_vector) { - typedef std::optional > ovi_t; + typedef std::optional> ovi_t; std::stringstream ss; ovi_t val1; std::vector v; @@ -54,15 +50,14 @@ BOOST_AUTO_TEST_CASE(optional_pack_convert_vector) val1 = v; msgpack::pack(ss, val1); std::string const& str = ss.str(); - msgpack::object_handle oh = - msgpack::unpack(str.data(), str.size()); - ovi_t val2 = oh.get().as(); + msgpack::object_handle oh = msgpack::unpack(str.data(), str.size()); + ovi_t val2 = oh.get().as(); BOOST_CHECK(val1 == val2); } BOOST_AUTO_TEST_CASE(optional_pack_convert_vector_optional) { - typedef std::vector > voi_t; + typedef std::vector> voi_t; std::stringstream ss; voi_t val1; val1.resize(3); @@ -70,9 +65,8 @@ BOOST_AUTO_TEST_CASE(optional_pack_convert_vector_optional) val1[2] = 3; msgpack::pack(ss, val1); std::string const& str = ss.str(); - msgpack::object_handle oh = - msgpack::unpack(str.data(), str.size()); - voi_t val2 = oh.get().as(); + msgpack::object_handle oh = msgpack::unpack(str.data(), str.size()); + voi_t val2 = oh.get().as(); BOOST_CHECK(val1 == val2); } @@ -80,7 +74,7 @@ BOOST_AUTO_TEST_CASE(optional_object_nil) { std::optional val1; msgpack::object obj(val1); - std::optional val2 = obj.as >(); + std::optional val2 = obj.as>(); BOOST_CHECK(val1 == val2); } @@ -88,7 +82,7 @@ BOOST_AUTO_TEST_CASE(optional_object_int) { std::optional val1 = 1; msgpack::object obj(val1); - std::optional val2 = obj.as >(); + std::optional val2 = obj.as>(); BOOST_CHECK(val1 == val2); } @@ -114,7 +108,7 @@ BOOST_AUTO_TEST_CASE(optional_object_with_zone_nil) msgpack::zone z; std::optional val1; msgpack::object obj(val1, z); - std::optional val2 = obj.as >(); + std::optional val2 = obj.as>(); BOOST_CHECK(val1 == val2); } @@ -123,54 +117,61 @@ BOOST_AUTO_TEST_CASE(optional_object_with_zone_int) msgpack::zone z; std::optional val1 = 1; msgpack::object obj(val1, z); - std::optional val2 = obj.as >(); + std::optional val2 = obj.as>(); BOOST_CHECK(val1 == val2); } BOOST_AUTO_TEST_CASE(optional_object_with_zone_vector_optional) { - typedef std::vector > voi_t; + typedef std::vector> voi_t; msgpack::zone z; voi_t val1; val1.resize(3); val1[0] = 1; val1[2] = 3; msgpack::object obj(val1, z); - voi_t val2 = obj.as(); + voi_t val2 = obj.as(); BOOST_CHECK(val1 == val2); } struct no_def_con { no_def_con() = delete; - no_def_con(int i):i(i) {} + no_def_con(int i) + : i(i) + {} int i; MSGPACK_DEFINE(i); }; -inline bool operator==(no_def_con const& lhs, no_def_con const& rhs) { +inline bool operator==(no_def_con const& lhs, no_def_con const& rhs) +{ return lhs.i == rhs.i; } -inline bool operator!=(no_def_con const& lhs, no_def_con const& rhs) { +inline bool operator!=(no_def_con const& lhs, no_def_con const& rhs) +{ return !(lhs == rhs); } namespace msgpack { -MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS) { -namespace adaptor { - -template <> -struct as { - no_def_con operator()(msgpack::object const& o) const { - if (o.type != msgpack::type::ARRAY) throw msgpack::type_error(); - if (o.via.array.size != 1) throw msgpack::type_error(); - return no_def_con(o.via.array.ptr[0].as()); - } -}; +MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS) +{ + namespace adaptor { + + template <> struct as { + no_def_con operator()(msgpack::object const& o) const + { + if (o.type != msgpack::type::ARRAY) + throw msgpack::type_error(); + if (o.via.array.size != 1) + throw msgpack::type_error(); + return no_def_con(o.via.array.ptr[0].as()); + } + }; -} // adaptor + } // namespace adaptor } // MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS) -} // msgpack +} // namespace msgpack BOOST_AUTO_TEST_CASE(optional_pack_convert_no_def_con) { @@ -178,8 +179,7 @@ BOOST_AUTO_TEST_CASE(optional_pack_convert_no_def_con) std::optional val1 = no_def_con(1); msgpack::pack(ss, val1); std::string const& str = ss.str(); - msgpack::object_handle oh = - msgpack::unpack(str.data(), str.size()); + msgpack::object_handle oh = msgpack::unpack(str.data(), str.size()); std::optional val2 = oh.get().as>(); BOOST_CHECK(val1 == val2); } @@ -227,7 +227,7 @@ BOOST_AUTO_TEST_CASE(string_view_object_with_zone) BOOST_AUTO_TEST_CASE(byte_pack_convert) { std::stringstream ss; - std::byte val1{0xff}; + std::byte val1{ 0xff }; msgpack::pack(ss, val1); @@ -240,7 +240,7 @@ BOOST_AUTO_TEST_CASE(byte_pack_convert) BOOST_AUTO_TEST_CASE(byte_object) { - std::byte val1{0x00}; + std::byte val1{ 0x00 }; msgpack::object obj(val1); std::byte val2 = obj.as(); BOOST_CHECK(val1 == val2); @@ -249,7 +249,7 @@ BOOST_AUTO_TEST_CASE(byte_object) BOOST_AUTO_TEST_CASE(byte_object_with_zone) { msgpack::zone z; - std::byte val1{80}; + std::byte val1{ 80 }; msgpack::object obj(val1, z); std::byte val2 = obj.as(); BOOST_CHECK(val1 == val2); @@ -259,7 +259,7 @@ BOOST_AUTO_TEST_CASE(vector_byte_pack_convert) { std::stringstream ss; std::vector val1{ - std::byte{0x01}, std::byte{0x02}, std::byte{0x7f}, std::byte{0x80}, std::byte{0xff} + std::byte{ 0x01 }, std::byte{ 0x02 }, std::byte{ 0x7f }, std::byte{ 0x80 }, std::byte{ 0xff } }; msgpack::pack(ss, val1); @@ -280,7 +280,7 @@ BOOST_AUTO_TEST_CASE(vector_byte_pack_convert) BOOST_AUTO_TEST_CASE(vector_byte_object) { std::vector val1{ - std::byte{0x01}, std::byte{0x02}, std::byte{0x7f}, std::byte{0x80}, std::byte{0xff} + std::byte{ 0x01 }, std::byte{ 0x02 }, std::byte{ 0x7f }, std::byte{ 0x80 }, std::byte{ 0xff } }; // Caller need to manage val1's lifetime. The Data is not copied. @@ -294,7 +294,7 @@ BOOST_AUTO_TEST_CASE(vector_byte_object_with_zone) { msgpack::zone z; std::vector val1{ - std::byte{0x01}, std::byte{0x02}, std::byte{0x7f}, std::byte{0x80}, std::byte{0xff} + std::byte{ 0x01 }, std::byte{ 0x02 }, std::byte{ 0x7f }, std::byte{ 0x80 }, std::byte{ 0xff } }; msgpack::object obj(val1, z); @@ -306,7 +306,7 @@ BOOST_AUTO_TEST_CASE(array_byte_pack_convert) { std::stringstream ss; std::array val1{ - std::byte{0x01}, std::byte{0x02}, std::byte{0x7f}, std::byte{0x80}, std::byte{0xff} + std::byte{ 0x01 }, std::byte{ 0x02 }, std::byte{ 0x7f }, std::byte{ 0x80 }, std::byte{ 0xff } }; msgpack::pack(ss, val1); @@ -327,8 +327,8 @@ BOOST_AUTO_TEST_CASE(array_byte_pack_convert) { msgpack::object_handle oh; msgpack::unpack(oh, str.data(), str.size()); - BOOST_CHECK_THROW((oh.get().as>()), msgpack::type_error); - BOOST_CHECK_THROW((oh.get().as>()), msgpack::type_error); + BOOST_CHECK_THROW((oh.get().as>()), msgpack::type_error); + BOOST_CHECK_THROW((oh.get().as>()), msgpack::type_error); BOOST_CHECK_THROW((oh.get().as>()), msgpack::type_error); } } @@ -336,7 +336,7 @@ BOOST_AUTO_TEST_CASE(array_byte_pack_convert) BOOST_AUTO_TEST_CASE(array_byte_object) { std::array val1{ - std::byte{0x01}, std::byte{0x02}, std::byte{0x7f}, std::byte{0x80}, std::byte{0xff} + std::byte{ 0x01 }, std::byte{ 0x02 }, std::byte{ 0x7f }, std::byte{ 0x80 }, std::byte{ 0xff } }; // Caller need to manage val1's lifetime. The Data is not copied. @@ -345,8 +345,8 @@ BOOST_AUTO_TEST_CASE(array_byte_object) auto val2 = obj.as>(); BOOST_CHECK(val1 == val2); - BOOST_CHECK_THROW((obj.as>()), msgpack::type_error); - BOOST_CHECK_THROW((obj.as>()), msgpack::type_error); + BOOST_CHECK_THROW((obj.as>()), msgpack::type_error); + BOOST_CHECK_THROW((obj.as>()), msgpack::type_error); BOOST_CHECK_THROW((obj.as>()), msgpack::type_error); } @@ -354,15 +354,15 @@ BOOST_AUTO_TEST_CASE(array_byte_object_with_zone) { msgpack::zone z; std::array val1{ - std::byte{0x01}, std::byte{0x02}, std::byte{0x7f}, std::byte{0x80}, std::byte{0xff} + std::byte{ 0x01 }, std::byte{ 0x02 }, std::byte{ 0x7f }, std::byte{ 0x80 }, std::byte{ 0xff } }; msgpack::object obj(val1, z); auto val2 = obj.as>(); BOOST_CHECK(val1 == val2); - BOOST_CHECK_THROW((obj.as>()), msgpack::type_error); - BOOST_CHECK_THROW((obj.as>()), msgpack::type_error); + BOOST_CHECK_THROW((obj.as>()), msgpack::type_error); + BOOST_CHECK_THROW((obj.as>()), msgpack::type_error); BOOST_CHECK_THROW((obj.as>()), msgpack::type_error); } @@ -389,7 +389,7 @@ BOOST_AUTO_TEST_CASE(array_byte_empty_pack_convert) { msgpack::object_handle oh; msgpack::unpack(oh, str.data(), str.size()); - BOOST_CHECK_THROW((oh.get().as>()), msgpack::type_error); + BOOST_CHECK_THROW((oh.get().as>()), msgpack::type_error); BOOST_CHECK_THROW((oh.get().as>()), msgpack::type_error); } } @@ -404,7 +404,7 @@ BOOST_AUTO_TEST_CASE(array_byte_empty_object) auto val2 = obj.as>(); BOOST_CHECK(val1 == val2); - BOOST_CHECK_THROW((obj.as>()), msgpack::type_error); + BOOST_CHECK_THROW((obj.as>()), msgpack::type_error); BOOST_CHECK_THROW((obj.as>()), msgpack::type_error); } @@ -417,7 +417,7 @@ BOOST_AUTO_TEST_CASE(array_byte_empty_object_with_zone) auto val2 = obj.as>(); BOOST_CHECK(val1 == val2); - BOOST_CHECK_THROW((obj.as>()), msgpack::type_error); + BOOST_CHECK_THROW((obj.as>()), msgpack::type_error); BOOST_CHECK_THROW((obj.as>()), msgpack::type_error); } @@ -425,7 +425,7 @@ BOOST_AUTO_TEST_CASE(carray_byte_pack_convert) { std::stringstream ss; std::byte val1[] = { - std::byte{0x01}, std::byte{0x02}, std::byte{0x7f}, std::byte{0x80}, std::byte{0xff} + std::byte{ 0x01 }, std::byte{ 0x02 }, std::byte{ 0x7f }, std::byte{ 0x80 }, std::byte{ 0xff } }; msgpack::pack(ss, val1); @@ -450,7 +450,7 @@ BOOST_AUTO_TEST_CASE(carray_byte_object_with_zone) { msgpack::zone z; std::byte val1[] = { - std::byte{0x01}, std::byte{0x02}, std::byte{0x7f}, std::byte{0x80}, std::byte{0xff} + std::byte{ 0x01 }, std::byte{ 0x02 }, std::byte{ 0x7f }, std::byte{ 0x80 }, std::byte{ 0xff } }; msgpack::object obj(val1, z); @@ -461,4 +461,30 @@ BOOST_AUTO_TEST_CASE(carray_byte_object_with_zone) } } +#if defined(MSGPACK_USE_STD_VARIANT_ADAPTOR) + +BOOST_AUTO_TEST_CASE(variant_pack_unpack_as) +{ + std::stringstream ss; + std::variant val1{ 1.0 }; + msgpack::pack(ss, val1); + std::string const& str = ss.str(); + msgpack::object_handle oh = msgpack::unpack(str.data(), str.size()); + std::variant val2 = oh.get().as>(); + BOOST_CHECK(val1 == val2); + BOOST_CHECK_THROW((oh.get().as>()), msgpack::type_error); +} + +BOOST_AUTO_TEST_CASE(variant_with_zone) +{ + msgpack::zone z; + std::variant val1{ 1.0 }; + msgpack::object obj(val1, z); + std::variant val2 = obj.as>(); + BOOST_CHECK(val1 == val2); + BOOST_CHECK_THROW((obj.as>()), msgpack::type_error); +} + +#endif // defined(MSGPACK_USE_STD_VARIANT_ADAPTOR) + #endif // MSGPACK_CPP_VERSION >= 201703 From a36bd6f94f3a94f7c66bd5d94506052b7940cf84 Mon Sep 17 00:00:00 2001 From: ludamad Date: Mon, 16 Oct 2023 20:14:45 +0000 Subject: [PATCH 2/6] feat: add msgpack --- .../cpp/src/barretenberg/serialize/cbind.hpp | 1 - .../serialize/msgpack_impl/msgpack_impl.hpp | 3 +- .../msgpack/v1/adaptor/cpp11/chrono.hpp | 4 +- .../msgpack/v1/adaptor/cpp17/variant.hpp | 4 +- .../include/msgpack/v1/detail/cpp11_zone.hpp | 10 +- .../src/artifacts/ecdsa_account_contract.json | 699 ------------------ .../artifacts/schnorr_account_contract.json | 687 ----------------- .../schnorr_single_key_account_contract.json | 622 ---------------- 8 files changed, 10 insertions(+), 2020 deletions(-) delete mode 100644 yarn-project/aztec.js/src/artifacts/ecdsa_account_contract.json delete mode 100644 yarn-project/aztec.js/src/artifacts/schnorr_account_contract.json delete mode 100644 yarn-project/aztec.js/src/artifacts/schnorr_single_key_account_contract.json diff --git a/barretenberg/cpp/src/barretenberg/serialize/cbind.hpp b/barretenberg/cpp/src/barretenberg/serialize/cbind.hpp index be7374f6d41..974cebeb89c 100644 --- a/barretenberg/cpp/src/barretenberg/serialize/cbind.hpp +++ b/barretenberg/cpp/src/barretenberg/serialize/cbind.hpp @@ -13,7 +13,6 @@ #include "msgpack_impl/schema_impl.hpp" #include "msgpack_impl/schema_name.hpp" #include "msgpack_impl/struct_map_impl.hpp" -#include "msgpack_impl/variant_impl.hpp" #include #include diff --git a/barretenberg/cpp/src/barretenberg/serialize/msgpack_impl/msgpack_impl.hpp b/barretenberg/cpp/src/barretenberg/serialize/msgpack_impl/msgpack_impl.hpp index 1db14a898ad..430dd80635b 100644 --- a/barretenberg/cpp/src/barretenberg/serialize/msgpack_impl/msgpack_impl.hpp +++ b/barretenberg/cpp/src/barretenberg/serialize/msgpack_impl/msgpack_impl.hpp @@ -1,4 +1,3 @@ #pragma once // Note: Meant to only be included in compilation units that need msgpack -#include "struct_map_impl.hpp" -#include "variant_impl.hpp" \ No newline at end of file +#include "struct_map_impl.hpp" \ No newline at end of file diff --git a/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/adaptor/cpp11/chrono.hpp b/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/adaptor/cpp11/chrono.hpp index d94524ad8c5..fdbb44c4c96 100644 --- a/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/adaptor/cpp11/chrono.hpp +++ b/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/adaptor/cpp11/chrono.hpp @@ -110,10 +110,10 @@ MSGPACK_API_VERSION_NAMESPACE(v1) Target integral_cast(Source source) { if (would_underflow(source).value) { - throw std::underflow_error{ "casting from Source to Target causes an underflow error" }; + THROW std::underflow_error{ "casting from Source to Target causes an underflow error" }; } if (would_overflow(source).value) { - throw std::overflow_error{ "casting from Source to Target causes an overflow error" }; + THROW std::overflow_error{ "casting from Source to Target causes an overflow error" }; } return static_cast(source); diff --git a/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/adaptor/cpp17/variant.hpp b/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/adaptor/cpp17/variant.hpp index be98e7233eb..d8bb33dc33a 100644 --- a/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/adaptor/cpp17/variant.hpp +++ b/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/adaptor/cpp17/variant.hpp @@ -63,7 +63,7 @@ MSGPACK_API_VERSION_NAMESPACE(v1) if (o.type != msgpack::type::ARRAY || o.via.array.size != 2 || o.via.array.ptr[0].type != msgpack::type::POSITIVE_INTEGER || o.via.array.ptr[0].via.u64 >= sizeof...(Ts)) { - throw msgpack::type_error{}; + THROW msgpack::type_error{}; } return detail::construct_variant, Ts...>( @@ -77,7 +77,7 @@ MSGPACK_API_VERSION_NAMESPACE(v1) if (o.type != msgpack::type::ARRAY || o.via.array.size != 2 || o.via.array.ptr[0].type != msgpack::type::POSITIVE_INTEGER || o.via.array.ptr[0].via.u64 >= sizeof...(Ts)) { - throw msgpack::type_error{}; + THROW msgpack::type_error{}; } v = detail::construct_variant, Ts...>( diff --git a/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/detail/cpp11_zone.hpp b/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/detail/cpp11_zone.hpp index e475798c34e..40b50511c24 100644 --- a/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/detail/cpp11_zone.hpp +++ b/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/detail/cpp11_zone.hpp @@ -160,7 +160,7 @@ MSGPACK_API_VERSION_NAMESPACE(v1) { void* p = ::malloc(size); if (!p) - throw std::bad_alloc(); + THROW std::bad_alloc(); return p; } @@ -218,7 +218,7 @@ MSGPACK_API_VERSION_NAMESPACE(v1) if (!m_chunk_list) { auto ptr = ::malloc(sizeof(chunk_list) + m_chunk_size); if (!ptr) - throw std::bad_alloc(); + THROW std::bad_alloc(); m_chunk_list = new (ptr) chunk_list(m_chunk_size, reinterpret_cast(ptr) + sizeof(chunk_list)); } return *m_chunk_list; @@ -269,7 +269,7 @@ MSGPACK_API_VERSION_NAMESPACE(v1) chunk* c = static_cast(::malloc(sizeof(chunk) + sz)); if (!c) - throw std::bad_alloc(); + THROW std::bad_alloc(); char* ptr = reinterpret_cast(c) + sizeof(chunk); @@ -333,14 +333,14 @@ MSGPACK_API_VERSION_NAMESPACE(v1) m_finalizer_array.push(&zone::object_destruct, x); } catch (...) { undo_allocate(sizeof(T)); - throw; + RETHROW; } try { return new (x) T(args...); } catch (...) { m_finalizer_array.pop(); undo_allocate(sizeof(T)); - throw; + RETHROW; } } diff --git a/yarn-project/aztec.js/src/artifacts/ecdsa_account_contract.json b/yarn-project/aztec.js/src/artifacts/ecdsa_account_contract.json deleted file mode 100644 index 06e4e33b3c2..00000000000 --- a/yarn-project/aztec.js/src/artifacts/ecdsa_account_contract.json +++ /dev/null @@ -1,699 +0,0 @@ -{ - "name": "EcdsaAccount", - "functions": [ - { - "name": "compute_note_hash_and_nullifier", - "functionType": "unconstrained", - "isInternal": false, - "parameters": [ - { - "name": "contract_address", - "type": { - "kind": "field" - }, - "visibility": "private" - }, - { - "name": "nonce", - "type": { - "kind": "field" - }, - "visibility": "private" - }, - { - "name": "storage_slot", - "type": { - "kind": "field" - }, - "visibility": "private" - }, - { - "name": "preimage", - "type": { - "kind": "array", - "length": 5, - "type": { - "kind": "field" - } - }, - "visibility": "private" - } - ], - "returnTypes": [ - { - "kind": "array", - "length": 4, - "type": { - "kind": "field" - } - } - ], - "bytecode": "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", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - }, - { - "name": "constructor", - "functionType": "secret", - "isInternal": false, - "parameters": [ - { - "name": "signing_pub_key_x", - "type": { - "kind": "array", - "length": 32, - "type": { - "kind": "integer", - "sign": "unsigned", - "width": 8 - } - }, - "visibility": "public" - }, - { - "name": "signing_pub_key_y", - "type": { - "kind": "array", - "length": 32, - "type": { - "kind": "integer", - "sign": "unsigned", - "width": 8 - } - }, - "visibility": "public" - } - ], - "returnTypes": [], - "bytecode": "H4sIAAAAAAAA/+2dB5QUxRaGa3fZJaoYyTnn7s1LXHLOQX2KyMIsroCLsIg8nznniIiIiIjkZM45B8w5PPXl7MvZ9+pCjRTlLDu980/4j1Pn3HP37syp+b9/Znq6u6qr92QodaYOaZIydWSbv8N1jlPXdeomOupZdVOnbubUzZ26hVO3dOpWTt3aqds4dVunbufU7Z26g1N3dOpOTt3Zqbs4dVen7ubU3Z26h1P3dOpeTt3bqfs4tefUvlPnOnWeU+c7dYFTFzp1kVMXO3WJU/d16n5O3d+pBzj1QKce5NSlTj3YqYc49VCnHubUw516hFOPdOpRTj3aqcc49VinHufU4516glNPdOpJTj3Zqac49VSnnubU0516hlXLtqGt2tdkO/CN2vf9l9zM5OYmtzC5pcmtTG5tchuT25rczuT2JncwuaPJnUzubHIXk7ua3M3k7ib3MLmnyb1M7m1yH5M9k32Tc03OMznf5AKTC61+j9VxXARvisxzik0uMbmvyf1M7m/yAJMHmjzI5FKTB5s8xOShJg8zebjJI0weafIok0ebPMbksSaPM3m8yRNMnmjyJJMnmzzF5KkmTzN5uskzLG+O1/EDdWAzPz17uaTleYX5+aGi3JCf58/2ckvKigu8/IKywmK/2C8oLpibW5yXFyrOLy4qKSsp8kr8/LyQX15Qklfu7WsnWH15MbZ46jyRROdMEp0nkeicRaLzZBKds0l0lpHonEOicy6JzhCJznISnfNIdJ4C1Bnel2xs+pN9TNmnOt7kE0w+0eSZJp9k8iyTTzZ5tsllJs8xea7JIZPLTZ5n8ilq/75chY5T1YEN7eF8nId+2MOwxvmGRf63QMdChyXLYZE+vBhaE5clht6aAj0+ISM+36cI/nmxUDdTEXTWsrfmQP9OTKx/Xm2pW6hqdNait5ZA/2Ym3j+vNtSt1EF0BuytNdC/k5LjnxeUuo2qQWeA3toC/ZuVPP+8INTtVBQ6o+ytPdC/k5PrnxctdQcVpc4oeusI9G928v3zoqHupALorKG3zkD/ylLDP68m6i4qoM6D9NYV6N+c1PHPOxh1N1ULndX01h3o39zU8s+rjrqHqqXOCL31BPoXSj3/vEjUvVQMOp3eegP9K09N/zyXuo+KUafdG9C/eanrn2dT+wqg0/SWC/TvlNT2zwtT5ymQTt1bPtC/itT3T5pfAOzLPucUq3+nkvgHPE/kzwT6N5/EP+B5Dn8W0L8FJP4Bj9P92UD/FpL4BzzO9OcA/TuNxD/gcZIfAvpXSeIfcD/fnwf0bxGJf8D9VL8C6N/pJP4B97P8+UD/FpP4B9xP8BcC/VtC4h/wd86vBPpXReIfcDvtnw70bymJf8DtjL8E6N8ZJP4Bvyf+UqB/yxLkX8z7+cD3AviZ8Zcl7vMX0/yrIoWbf1UMfF9XkMy/KlG4+Vd9gf7dTDL/qp/Czb/qD/RvJcn8qwEKN/9qINC/W0jmXw1SuPlXpUD/VpHMvxqsotAZZW9DgP7dSjL/aqiKUmcUvQ0D+reaZP7VcBVAZw29jQD6dxvJ/KuRKqDOg/Q2CujfGpL5V6NVLXRW09sYoH+3k8y/GqtqqTNCb+OA/q0lmX81XsWg0+ltAtC/O0jmX01UMeq0epsE9G8dyfyryQqg0/Q2BejfnSTzr6YqkE7d2zSgf+tJzp9OB/a1Anj+9C4S/4DnifyVQP82kPgHPM/hrwL6dzeJf8DjdH810L+NJP4BjzP9NUD/NpH4BzxO8tcC/dtM4h9wP99fB/RvC4l/wP1Ufz3Qv60k/gH3s/wNQP+2kfgH3E/wNwL9207iH/B3zt8M9G8HiX/A7bS/FejfThL/gNsZfzvQv10k/gG/J/5OoH+7SeZfVQLfC+Bnxkf6F14jK9v0J3PO7PVtK9WBa7pmmixtkY7T1YENvR7YYuB7EGbNNP0tNiyLLKYlOqrMZylLVd9KgZqynb7bfPc1UnIdMvOvlFvfy/p3Sq2b5TyUMutRRXg4JdZ5quYpSV8/6SBPS+q6RDU8NWnr/Xg1t6Sso+NF1xK+Po0XfUvoui9esJaw9VS84C0h65R4tWtxX//Dq32L67oaXmwNuV7Ft8cV7v6sF1vzC+OgEb2/GK/rJsy/Uu56BOvfKTXP33koZebPR3g4JealV/OUpM/3PsjTkjqPuoanJm1+sldzS8q8Xy+6lvD5tF70LaHzVL1gLWHzP73gLSHzKr3atbjPV/Rq3+I6D9CLrSHn18Vtf3EGgcbMOGiMh84lQJ0Zls6l1t+NTK6vo475O9P6X5bDVt96PNxyrL9LMXoLcvB+enLeup7FoRzeQ83jh5v6tMqqivLlQxeHZleF5k6orArZJoZPgmdF6CjD+r99sryO9eI5zuO2seHHwjcxPaCVKogbvt0n+pO7FNeXlxXJBJXaW4UMS2P4g3CGjmU6zrQYDlHfffPDLQ7fKi9e36ociyPc7G+VPF4H+7p59tZJWX6rCL4p6/XlGx7e6s0LVU1aWragYs7Y0PJI71lWhH7traO7EbDfx/Bjcf0Sh4cI7Q+ZDA0uM/lMkw/TsVzHDx0dmY6eWIc/gV8if7nCbkTcYUuleHYt0J+beHpwRpw8QOtcprAb/PSweHpYPJqWHhYP1lt6WDxYb+lh8WC9pYfFg/WWHhYP1lt6WDxYb+lh8W/7TQ+L19DSw+JeoJYeFg/WW3pYPFhv6WHxYL2lh8WD9ZYeFg/WW3pYPFgz3aSHxWNs9mBKpvn7LB0/UvtbC5Pt0VB7hDTS4Mr3YYi6gcWhHN7wEHVjU4cWVlQNP23O4uWL9BD1uMp59kBTXZOzI/Rj+yqtjvV3tuWnO0qdY+kqxTDn1lf7h+WV9dp2K7X+rm9paYDVsve71dB6rbCu8Os0tB6va+loiNWxd1yvgcNva4jT6+7lb1QDf6MIOholkN+estLA0Wl/98OPJW0WRayDqWcr/I9GPHSeQ6LzXBKd55HoPJ9E5wUkOi8k0XkRic6LSXReQqLzUhKdl5HovJxE5xUkOq8k0XkVic6rSXReQ6LzWhKd15HovJ5E5w0kOm8k0XkTic4VJDpvJtG5kkTnLSQ6V5HovJVE52oSnbeR6FxDovN2Ep1rSXTeQaJzHYnOO0l0rifReReJzg0kOu8m0bmRROcmEp2bSXRuIdG5lUTnNhKd20l07iDRuZNE5y4SnbtJdN5DovNeEp33kei8n0TnAyQ6HyTR+RCJzodJdD5CovNREp2Pkeh8nETnEyQ6n8ToLM/PzY+rzqdI/HyaROczJDqfJdH5HInO50l0vkCi80USnS+R6HyZROcrJDpfJdH5GonO10l07iHR+QaJzjdJdL5FovNtEp3vkOh8l0TneyQ63yfR+QGJzg9JdH5EovNjEp2fkOj8lETnZyQ6P4+TzkxHpxdb27uoAor5xyTMmUDmL0iYs4DMX5Iw1wEyf0XCnA1k/gkJcw6Q+ackzHWBzD8jYa4AMv+chPlsIPMvSJjPATL/koT5XCDzr0iYzwMy/5qE+Xwg829ImC8AMv+WhPlCIPPvSJgvAjL/noT5YiDzH0iYLwEyf03CfCmQ+Y8kzJcBmf9Ewnw5kPnPJMxXAJn/QsJ8JZD5ryTMVwGZ/0bCfDWQ+e8kzNcAmf9BwnwtkPmfJMzXAZn/RcJ8PZD53yTMNwCZ/0PCfCOQ+b8kzDcBmb8hYV4BZP4fCfPNQGaZuMDAvBLInEHCfAuQOZOEeRWQOYuE+VYgcx0S5tVA5mwS5tuAzDkkzGuAzHVJmG8HMtcjYV4LZK5PwnyHwjE3IGFeAmRuSMK8DsjciIT5TiDzISTM64HMh5Iw3wVkPoyEeQOQuTEJ891A5sNJmDcCmY8gYd4EZD6ShHkzkPkoEuYtQOajSZi3ApmPIWHeBmRuQsK8HcjclIR5B5C5GQnzTiBzcxLmBUDmFiTMu4DMLUmYdwOZW5Ew3wNkbk3CfC+QuQ0J831A5rYkzPcDmduRMD8AZG5PwvwgkLkDCfNDQOaOJMwPA5k7kTA/AmTuTML8KJC5CwnzY0DmriTMjwOZu5EwPwFk7k7C/CSQuQcJ81NA5p4kzE8DmXuRMD8DZO5NwvwskLkPCfNzQGaPhPl5ILNPwvwCkDmXhPlFIHMeCfNLQOZ8EuaXgcwFJMyvAJkLSZhfBTIXkTC/BmQuJmF+HchcQsK8B8jcl4T5DSBzPxLmN4HM/UmY3wIyDyBhfhvIPJCE+R0g8yAS5neBzKUkzO8BmQeTML8PZB5CwvwBkHkoCfOHQOZhJMwfAZmHkzB/DGQeQcL8CZB5JAnzp0DmUSTMnwGZR5Mwfw5kHkPCXA/IPJaEuT6QeRwJcwMg83gS5oZA5gkkzI2AzBNJmA8BMk8iYT4UyDyZhPkwIPMUEubGQOapJMyHA5mnkTAfAWSeTsJ8JJB5BgnzUUDmY0mYjwYyH0fCfAyQ+Xgg8zGmnwzDLPfBlPtCyn0S5b6Bch89OSaUYyQ5ZpB9aNmnlH0s2eeQ32D5TZJttGyz5Dssn2l5j23mJjqa6mimo7mOFjpa6milo7WONjra6mino72ODjo66uiko7OOLjq66uimo7uOHjp66uilo7eOPuKFDl9HrnisI19HgY5CHUU6inWU6Oiro5+O/joG6BioY5DROljHEB1DdQzTMVzHCB0jdYzSMVrHGB1jdYzTMV7HBB0TdUzSMVnHFB1TdUzTMV3HDB1nGR/kHrBf6PhSx1c65B6Sck9Fuceg3HNP7kEn92STe5TJPbvkHlZyTye5x5Hc80fugfO1DrlHitwzRO6hIfeUkHssyD0HZA1+WZNe1miXNctlDW9Z01rWeJY1j2UNYHmzZY1YWTNV1hCVNTVljUlZc1HWIJQ1+WSNOlmzTdYwkzW9ZI0rWfNJ1kCSNYFkjRxZM0bWUJE1RWSNDVlzQtZgkDUJ5Bp9uWZdruGWa5rlGl+55lWuAZVrIuUaQblmTq4hk2uq5BojueZGrkGRazLkGgWZsy9z2GVOt8xxljm/MgdW5oTKHEmZMyhz6GROmcyxkjlHMgdH5qTIHA2ZsyBj+DKmLWO8Mua5dwxQh4wRyZiJjCHIOXU5xyznXOUcpJyTk3NUcs5GzmHIMb0c48oxnxwDyTGB7CPLPqPsQ8k+hfzGym+ObINlmyTf0XD7P+maRAuMTwEA", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - }, - { - "name": "entrypoint", - "functionType": "secret", - "isInternal": false, - "parameters": [ - { - "name": "payload", - "type": { - "kind": "struct", - "path": "authwit::entrypoint::EntrypointPayload", - "fields": [ - { - "name": "function_calls", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "struct", - "path": "authwit::entrypoint::FunctionCall", - "fields": [ - { - "name": "args_hash", - "type": { - "kind": "field" - } - }, - { - "name": "function_selector", - "type": { - "kind": "field" - } - }, - { - "name": "target_address", - "type": { - "kind": "field" - } - }, - { - "name": "is_public", - "type": { - "kind": "boolean" - } - } - ] - } - } - }, - { - "name": "nonce", - "type": { - "kind": "field" - } - } - ] - }, - "visibility": "public" - } - ], - "returnTypes": [], - "bytecode": "H4sIAAAAAAAA/+1dB3wUVRNfEhLS6L333m6TQBIFCVV6rwpKKkWqVEGlKYpSVECxg4oKVlREREEBRRBUUFFEVAQBRUBUFFHgew/mwcvmKOZm1jff7f5+w+wdl7fT3sz83767HV7Isu4paJ05cgkKERQG5+p1uON1HsfrUo7X5RyvKzleV4Nz/VCvk4HH+RrGx2ckxGbYcXaKLzYpNbGBL75BasNEO9FukNggPTYxLi4jMT4xISk1KcGXZMfHZdiZDZLiMn1njxraWL4AD0o5azKRsxYTOWszkbMOEznrMpGzHhM56zOR08dETpuJnLFM5IxjImc8EzkbMJGzIaKcUjbZM1aA8YoLOiWoBPCSwEsBLw28DPCywMsBLw+8AvCKwCsBrwy8CvCqwKsBrw68BvCawGsBrw28DvC6wOsBrw/cB9wGHgs8Dng88AbAG2rjJghKtLIe2D5MsnjE2hVM5LySiZyNmMjZmImcVzGRswkTOZOZyNmUiZzNmMjZnImcLZjI2ZKJnK2YyHm1hd/zFoDxZL8ne78k4FcAvxJ4I+CNgV8FvAnwZOBNgTcD3hx4C+AtgbcCfrV1vudsLagN2E3KBsu8xvTj8vNtBbUTFGqdXVe+0JFsofjJphu7QQLh2ImEYycRjp1COHYq4dhpKhbl3KkA5+0FdRDUUVAnQZ0FdRHUVVA3Qd0F9RDUU1AvQb0F9RF0jaBrBfUV1E/QdYKuF9RfkDSQVCRNULqgDEGZggYIGihokKDBgm5wyDJE0FBBwwQNFzRC0EhBNwoaJWi0oDGCxgoaJ2i8oJsETRA0UdDNgm4RdKugSYImC5oiaKqgaYJuE3S7oOmC7hB0p6AZgu4SdDfIMBP4LOCzgc8Bfo91/pgffpZHCoqA9+CtM+8pe4dp76n/z629p/4/VHtP/X+I9p76/1zae+r/Lcf15ZEM3BfgEW5lr1O+AA+pcyFND8uPvrn82CXEj/3U/4f5sZ/uD/X/ebT31P8r/+WD9yIJbBiNPKaUMcrKejjvQSZr59GaTWII9MtLoF/Mv9Avr6ZfPgL98hPol+9f6Jdf068AgX4FCfQr8C/0K6jpV4hAP+QxbTlmYQI5i+KOmSj9UMS6fD8U1fxQjEC/4shjyjFKaPIrXZXs0dr/F9d0K4Erh51Lu6YaV70uoV23JOp1Y8/MM11/eVzMvyU1WUqhynLWF6W1aym51HWitf+P1OQojSvHGV+UcuivXuvyebJ6snqyerJ6snqyerJ6snqyerJ6snqyerJ6snqyerJ6snqyerJ6snKSVf+Mv7XwUg49CNaBL7oWXorMRmfXwnX95XGxtfDSmixlUGU5uxZeVruWkktdJ1r7fz1uyuLKccYXZRz6q9e6fJ6snqyerJ6snqyerJ6snqyerJ6snqyerJ6snqyerJ6snqyerJ6snqycZNU/428tvIxDD4J14IuuhZehu2629Wd/+pf1IweFry6k/4XiypPVk/Vishb/j2XFv66dEOm4rjwudu9Kl6Ucqixnc0d57VpKLnWdaO3/9bgpjyvHGV+Uc+ivXuvyebJ6snqyerJ6snqyerJ6snqyerJ6snqyerJ6snKRNVr7/xBNFmRsb19sTaGcH1nyGCRLboNkCTdIllCDZIkwSJYwg2TJ9R/Lov+mmqW9p/4/RHtP5ST9t9cqwLn+22sV4Vz/7bVKmp7qvcpwrv/2WhU4j9Deq6qdK14NzqO096rDeYz2Xg04z6e9VxPOC2jv1YJz/ffnasN5Ye29OnBeRHuvLpwX095TdtPtrOxWXntP2a2C9p6yW0XtPWW3Stp7ym6VtfeU3apo7ym76XZUdqumvafisrr2nrJlDe099ZtqNbX3lH1rae+p3yarrb2nbF5He0/9xpeyo9Q/LuT8/6vP6rFY18846lyfU+raycB9gR1n5pR+nWTttbpWlCZDHQNkCTNIlgiDZAk1SJZwg2TJbZAseQySJcSPLLVwZTlzj03lVXmoPFdLk0PJVFOTowayTeQY1f3IUUOTQ12/uiZHNVw55KNnztUtXQ69/qvrV9XkqIIrh3z0zbk6q8tRRZNDXb+yJkclXDnko3fO9QW6HJU0OdT1K2pyVMCVQz76JwuGVnJU0ORQ1y+vyYHc4zaUY9TzI0c5TQ51/XqaHPVx5Tjzm+g+P3LU1+RQ1/dpcti4cpzJZWp89XxTlS/UtUK1z1SBpCZ7ukjtfb23i4VzvS+Mg3O9p4yHc70fbQDnei/bEM71Plj9qHw97T2Vb33ae6pmx2rvqXoVp72nep547T1VYxto76n60lB7T/UoSqY88LfIv1Ea+2/3dhTXZFTf01Z/L+XD/Q3Rs7FUwiGLeq2uFa3JUIBOlsToC1xbHfraGMVvuFoOO6ijhB9ZIgySJcwgWfIaJEuUQbLkMUiW3AbJUswgWQoZJEtRg2TJb5AsMQbJEmmQLOEGyRJqkCwFDZKlsEGy5DNIlmiDZClikCy5/mNZLnTfSP2/vlZfUjtXXH23Rr9/U9qhp3xP3X/X7+moPe55tfcU3tfv8yh8mV97rwKcF9TeC/Gjm8pTuuyqNyqlvaf6a/23vlS+LaO9p3o8/XtQCifo94iUjXRsrGxUAbi85qzw7HqG+NFTH0edU99z1K+TrL3W12RyOeT7L2UpYpAs0QbJks8gWQobJEtBg2QJNUiWcINkiTRIlhiDZMlvkCxFDZKlkEGyFDNIltwGyZLHIFmiDJIlr0GyhBkkS4RBsoT4kQX5O8pnbpPpv21QAXhZTQ4lk76vGfk3ic88I9wph7qu/tu62L8vLMco6biuZWXFmur6Oq4r5LCTzHk7Q87LSRkzcvxJmgzqWqHaZ/aEnJfr25Dzuqj7gfq+Q+czDf3h2zw0evl0veRRwY9e+p53tS/Budc+VPvMAU33cuHn/w5Z9jO3enUc7ZSbIF7P3ML297spug1LOOyp/42MgZKOzxHcp7adcjh/b0EelfzIWUKTs6Ljc1LOyrhynok/XY5c2nX1vTuV/eii/9ZLVVy5YvV9zbps+pGsnev7mKrjytJA3zt9ObLoe7uQ95idee5rTeQx5Ri1NPmVrkr2aO3/9f1zyPv4zuT4GlZWm6rXunyerJ6sXGTVv09R5T+WJVqToRqdLA2iL2CHwg6fyP6kZOh5OZC/K9hAr2WqZ3SuiYZqnxkWfl6usiCXvjdU9x+yrLH6d4DUcbEaQ4eJzj77o9y/kEX//STkfs9HcK/uTL3T+zClq/4cGvX/lD1iLuvCz6HR5fNk9WT1ZPVk9WT1ZPVk9WT1ZPVk9WT1ZPVk9WT1ZPVk9WT1ZPVk9WTlIqv+XYaK/7Es0ZoM5chkifVF+7k21ffjdZ3lcbG1e12Wasg6679Ddjmy6PekkO/hn1nz1++PKbnUdfR7Vvr8wP6NmFxW1t+ISdZe6/J5snqyerJ6snqyerJ6snqyerJ6snqyerJ6snqyerJ6snqyerJ6snqycpFVf9ZEqf9YFn0tviqZLGfX/J3XpvhOmByjpqZzZcc19d/71r8Pg/o9MvvsXn3c75KcvYdQG8bSv0tS18976jfm1XGxew11tb9Tv5+sf2/Ph6rH2e9Z2tr4ydo16mrvx+Je19avmwtIXUP/bWt13iX3+c+qz8m3Tml2qqmNp34/OgQ+E+vnM/W1c30c9bfOc+VHZZ9o7f/1sepdQr5w7e+S1ZgI9tR/szxZex2nydMi93kZ6uHKEKvbNDeMq2KoHp3uPj0mVAw7/SLfjyewubquimF1DfV+qHY+QP0Ai/Y5eai4UjLrvy+v/+a5v3lJoZNP0ylZex2vvX+hz+jzxZ+OPk1H28/nLmaXaO3/7cu8jv43egxS2E3XPVl7ra4l3d9dm3/YuVzGSBGH/vJyg7Vr4n5H286UetfS7JqsyaCuFap9prX2XcZhIJf+XIeK2ljIv6mS7bcPVD/i7zdV9L4U9Xt+0I9g7+PQf5dA389Szc97Odn7oPfJ+n4U7O/8+4unmg5Z5PsUzw2qpdkjl5W9v9Pj+A6tH1GfU/Ve2amENp7+3LNT2t/on6mhnevj6P2jfq78qOwTrf2/Plb1S8gXrv1dMnBfYMcZe+q9f7L2uo4mzwQtNyHvrYnVbar6ERVD1el09+kxoWLY6Rf5fl0Cm6vrqhhW11Dvh2rnj2r9SN3zp+fiSsms4zQdn/iblxQ66T17sva6rvb+hT6jzxd/OtbUdKzl53MXs0u0lR3vXeo6+t/oMUhhN133ZO21upZ0/13a/EP+vQWfvxxQxWEv/Hnvvyfxt85AkfPU/Ja/nafLoa4Vqn1mMdhe/eafmpfycK6ZRWl/p+cW3LjJuq6hjstZr5CyID+Hy6fjDOXH+n6uS/ncLZVH1TXU+/pzt17X8qiOS1RP6++5Yfrn9PPajr+J1v6/HrHO9TU5krXX6lpSzec0Xev5kVtf41X/r6+1Kr/pfT7yOoSt1z01rnMdQt9fXZtMlrNrrf7WQLDXXuQYuv8qO64ZZWV/jl2kdq7jA9vPe/rakjwulhNs7e/U2gfhmsWZPNFAGz/Zyr5OIN9viHtdW7+uyhPqGur9UO38Mw0zqM+pnlzZSccDCXCuMENDP5+J0871cdTfOs+daznR2v/rY8VeQr5w7e+S1dgI9tTXcpK11wmaPBu0ngV5XTpWt6nCDCqGYul09+kxoWLY6Rf5fiKBzdV1VQyra6j3Q7Xzn7T8n3j+9FxcKZmjNHupz+nPlbSJddLXKpO114na+xf6jD5f/OkYr+nYwM/nLmaXaO3/G1zmdfS/0WOQwm667snaa3Ut6f4vtPmHnctljBR16C8vd0i7Jm7PexYv6LU5WZNBXStU+0wlbQ3zqJ81TP0+MvIa5plU4K1hemuYfo5/vYYZFXb+s94apn97Xs4a5klvDfM/W8OsADFsWd4aZrCuYeYNOy+Dt4YZ2IX/7RpmDbC9t4bp/+Cyhpmk5dH/9zXMepqugaxh6n3+f7WGWcohu1trmPp6YkXt2sjz5wwE1NceFd7xF4/6PEOOrdicroES7HeL1ddVL0cWff2oAYEs8f9CFn2dFnkN7YwsDf+FLAmaLEkEsiT+C1mSNFmuJJDlin8hy5WaLI0JZGn0L2RR15d/d5WSQZOvCa58Z/LuVQ5Z1Gt1rWjL/15MXFnO5l3ntXU7xJJd+/LtoGSo/R/aIZ7s2pdvB397TLFluZQdGhpgByVD6f/QDokG2EHJUPI/tMMVBthByRDyH9qhkQF2UDJUctkOUdp7xbRrJ+NeO1G/pvR1Icf48prNkK8pfdzUynpcrJdopsnSAleWMzi/pcO+LfxctxXudW39ugrnq2uo90O18/s17Nvq/Om5GFEyy7hp7udz+nlTx99Ea//fnFjnFpocydprdS2J8+/WdG3uR259fqr/r6PJ3RxZbjlGM02OJn5s1RL3mmfmiG4reVxsjugxfDWuLGfmSGtt/GTtGvp12yDbXb+umiPqGur9UO18iRY3bc6fnosbJbOcI638fE4/b+H4m2jt/1sR63y1Jkey9lpdS86Rxy6QD5y5S5/b+rpUS+1cfVaPZ+QYOhPPupzyuFg8X63JgmzjM/HcVhs/WbuGft12uNe19euqeFbXUO+HauerNB+3O396zsdKZhnPrf18Tj93xnu09v+tiXXW51Wy9lpdS8bzy5qurf3I3VKTW/1/be1z+pxRn9XjGTmGzsSzLqc8LhbPbTRZkG18Jp7ba+Mna9fQr9sB97q2fl0Vz+oa6v1Q7XyL5uMO50/P+VjJLOO5rZ/P6efOeI/W/r8tsc76vErWXqtryXheq+na1o/cel1R/6/f09DnjPqsHs/IMXQmnnU55XGxeG6nyYJs4zPx3FEbP1m7hn7dTrjXtfXrqnhW11Dvh2rn32o+7nT+9JyPlcwyntv7+Zx+7oz3aO3/2xPrrM+rZO21upaM5880Xdv7kVuvK+r/S2uf0+eM+qwez8gxdCaedTnlcbF47qDJgmzjM/HcWRs/WbuGft0uuNe19euqeFbXUO+HaudHNR93OX96zsdKZhnPHf18Tj93xnu09v8diXXW51Wy9lpdS8bzPk3Xjn7k1uuK+v+S2uf0OaM+q8czcgydiWddTnlcLJ47abIg2/hMPHfVxk/WrqFftxvudW39uiqe1TXU+6H6efh5e3Q7f3rOx0pmGc+d/XxOP3fGe7T2/52JddbnVbL2Wl1LxvNxLZ47+5Fbryvq/0O0z+lzRn1Wj2fkGDoTz7qc8rhYPHfRZEG28Zl47q6Nn6xdQ79uD9zr2vp1VTyra6j3Q7Xzolo89zh/es7HSmYZz139fE4/d8Z7tPb/XYl11udVsvZaXUvGc5Sma1c/cut1Rf2/WqOXsaX8pq+ddyXQ5UJzs6smXzGH7ASyJEb7uba0Y7nw89csh6y/HEPtM5OHundQTvODeq+8JtNOSDz6HiB9TxbF3kjnniz1PZE6mqxqPUHf2+vcy6k+o/8+FcVvDtaEsZx7OdW1QrXP1AYfq72c+u8Vqv0OSu4o7e/0PcDVUHU4u5dTl0PZUz+StXN9H3cVVFnO5vfy2vjJ2jX062LPD/26Kr+ra6j3Q7XzRlrOK3f+9NwcUTJLH1b18zn9vLrjb6K1/69KrHMVTY5k7bW6lswBtqZrVT9yF9Xkdu5jD9feS0aUu5pD7qIO+fTvOen5qjyBLBeyYXnNLqUcNsOX5eweHue19e/6KZvp3/XTv89QUZONMk+qcdVvmPn7nVj9exr6vE/WPlNbex85D52RV8VSmEMOda1Q7TNdHHldr7Wqbul79Ks6Poc/v8/mdV0OZU/9SNbO9e/roX6X0Xc2r+vPm0vWrqFfl2KPd3FNd/17qOr9UO08Vct1+hqvmiNKZunDsn4+p5+Xd/xNtPb/ZYl11r+/mqy91n83tZema1k/chfR5Fb/r9cj7N8O1GuuGreIQ75ITRc9X1E8P/JCNvT3/MjyZLKczevOa+u/Q6nX6sFaXley6fVJzweFgVfW3tPjoILjb/TvPevxWwpVX1+DSIcc8rhY3tLrO3Ic+PQ6oPJWcT/Xxe3Js9YflbfUNdT7ev2Zos1lvTdSMaBklj4s4edz+nlZx99Ea/9fglhn/Tm2ydprvXcZq+lawo/chTW5/dUY5Np2Blvrz10t7JAtUtOjiiYHRV98IftV1WxSxWEvAlkaRPu5dqRmG2Uv6c+SoefliEaVw06QY+ZFHlPqEWNlPS6Wn9T1I4DkMSBjdMfhozNG5dL+Xo2pz1V16Ou/odrf5LayyxHm571wP+/lsbIfEdp5pHYerf1dlENO+bl8cB6jvadkVv+Xx8puJ9RJqI4Qx9hxvobx8RkJsRl2nJ3ii01KTWzgi2+Q2jDRTrQbJDZIj02Mi8tIjE9MSEpNSvAl2fFxGXZmg6S4TBg8BFHOWXhjZfmuXC5ke85BtJ8uZ2h2OW1fAEd7p84BjNYBUefP8tH42Y/9fIFo3dHyI2cOR+uEaL/P3bWfL6dad7YuIGcORuuCaL/t7tvPlxOtu1oXkfNfjtYN0X5f/Df28/1brbtbl5DzX4zWA9F+X/539vP9G617Wpch52WO1gvRfjv+W/v5Llfr3tZlynkZo/VBtN9X/739fJej9TXWv5DzEqNdi2i/nWbYz3cprfta/1LOi4zWD9F+X5tjP9/FtL7OyoGcFxjtekT77TLLfr4Lad3fyqGcfkZLQbTfN+bZz+dP61QrADkdo6Uh2u9bM+3nc2qdbgUopzZaBqL9vjPXfj5d60wLQU4YbQCi/XabbT+f0nqghSSnGG0Qov2+N99+8rAHI46lrzkFar89TOyHuE5kb0e0314m9kNc57C/RLTfD0zsh4jT7a8Q7bePif0Qcab9NaL99jOxHyJOsr9BtN8BJvZD7PPt7xDt9yMT+yH2qfb3iPb7iYn9EPssey+i/Q4ysR9in2DvQ7Tfz0zsh1jn7AOI9jvExH6Iedr+CdF+h5nYDzHP2D8j2u8IE/shzhP7MKL9fnHJfoHKeS+iLxBjxv7FvfgLaP/VEAtv/9VQRL/my+/q/M2x1sMsvP1XwxHtlz+/6/kvR1qPsPD2X41EtF8B9+3ny4nWN1p4+69GIdqv4H9jP9+/1Xq0hbf/agyi/Qr9d/bz/Rutx1qXIedljjYO0X6F/1v7+S5X6/HWZcp5GaPdhGi/Iv+9/XyXo/UE61/IeYnRJiLar6gZ9vNdSuubrX8p50VGuwXRfsXMsZ/vYlrfauVAzguMNgnRfsXNsp/vQlpPtnIop5/RpiDar4R59vP503qqFYCcjtGmIdqvpJn28zm1vs0KUE5ttNsR7VfKXPv5dK2nWwhywmh3INqvtNn28ymt77SQ5BSjzUC0Xxnz7ScP+y7EsfQ1p0DtV5aJ/RDXiewCiPYrx8R+iOscdiFE+5VnYj9EnG4XQbRfBSb2Q8SZdjFE+1VkYj9EnGSXQLRfJSb2Q+zz7VKI9qvMxH6IfapdBtF+VZjYD7HPsssh2q8qE/sh9gl2BUT7VWNiP8Q6Z1dCtF91JvZDzNN2FUT71WBiP8Q8Y1dDtF9NJvZDnCd2DUT71XLJfoHKeR+iLxBjxsa0n/oBNvXDbHLP2SlBNwC/D/jdwGcCl8dcQfOsrEcuZB/MR/SB0jUExpsPuszVdLpf0AMQS9l+EM7C/y2z2RauL9WxQDtXP8QXor2n5ko4gU6W4zpOO+aziH9sj8JJCwjGfdDCmyhUej+I76MsSTvEMXagdrgHcayHLLpJganzw4hyctwoHKj9HrGCr9DLmNEL/SPWhQv9o4Ies7Ie2IX+cYuu0D8Oujyq6bRQ0CLr/C/Qqs+GwGcWApfF8wlBTzr0x85bmLXgKYtH3lpseXkrEPs9bQVf3lpsZc1bT1sXzlvPCHrWynpg560lFl3eWgK6PKPptFTQc9aF89ZS63zeel7QC34+Oxs+8zxwGZcvCnrpAjbyBXac6XOfILB9a+SFBGy9nwK7YuvdhskCysuItkT0tY1pP7cWCtpauDlVyajGXCboFUGvCnpN0HJBrwtaIegNQSsFvSlolaC3BL0taLWgNYLeEfSuoLWC1glaL+g9Qe8L2iDoA0EbBW0S9KGgzYK2CPpI0MeCPhG0VdA2QZ8K+kzQ54K2C/pC0JeCdgj6StBOQV8L2iXoG0HfCvpO0G5B3wvaI2ivoB8E7RO0X9ABQT8K+knQQUE/Czok6LCgI4J+sc4f6okI+lMC1KE/qSDZwvEFwQKML0yTVX9SgtInH/x/btTrxp95qleolfW42NMn1PUjrPNPYhiQMbrpmNEDew0aPSxjVJZnUDizUy4/mkkJVKcQqr2n/l/9n2vPe8BO/UcRxsrIlIfPdit1HbXwU5c8ftXOvTXOAMc8CgbFHvc3y+w1Tqn3b/g+In0Aym8Wbv/irHMUMi8jsi2q3+yzD9RRx+/Aj2nvhWn2UZ+Vyee0H9vl0s5D4DMhF/lMrguMc6EaTpZglHLSAH9oykpDRDiuGYJ87d8tvITxR5axxGdTYuMbZjTwNcxITErMSErIbJDgS0vJzExP8MWnpfpSU+Mb+uLsuMzUhFhfamySuGxSRoO0M19mcK1a/mHRVMs/tXOvWgY45h9gUOxxj1tmV0up93F8H/mVNVD9j4Gs2OP+ZeFOUDkJ5Zh6lpcH9nagZQg2UNABM0kfQ44jdWD7/QSi/dwqJicsmmLyt3buFZMAxzwBBsUe9x/L7GIi9f4H30ek0OsfRDndgl6vENkW1W8O6HUS+CntvaCCXtIAOvSShqCGXictvIRx2uIHvU5bNNVSF96rlgGOeRoGxR43Vy6zq6XUO1cudB+RQK9TICv2uCG58KGXHJMaer2CYAMFHTCT9CkLN47Uge330Fx49nOrmITmoikmub1iguuk3ATFJMzwYiL1DiMqJuqgtKkvwMMt6PWqRWNbVL85oFc4GCGPFh9BBb2kAXToJQ1BDb3CERNGRC5+0CuCqFpGetUS10mRBNUyyvBqKfWOYgK98oCs2ONGE0CvaBeg16sINlDQATNJ58mFG0fqwPZ7DEPoFUNUTPJ6xQTXSXkJikk+w4uJ1DsfM+iVjyH0es2isS2q3xzQKz8YoUCwQq/8DuhVwAXolR8xYRRkCL0KElXLQl61xHVSIYJqWdjwain1LswEehUAWbHHLUIAvYq4AL1eQ7CBgg6YSboAE+hVlCH0KkpUTIp5xQTXScUIiklxw4uJ1Ls4M+hVnCH0Wm7R2BbVbw7oVQKMUDJYoVcJB/Qq6QL0KoGYMEoxhF6liKplaa9a4jqpNEG1LGN4tZR6l2ECvUqCrNjjliWAXmVdgF7LEWygoANmki7JBHqVYwi9yhEVk/JeMcF1UnmCYlLB8GIi9a7ADHpVYAi9XrdobIvqNwf0qghGqBSs0KuiA3pVcgF6VURMGJUZQq/KRNWyilctcZ1UhaBaVjW8Wkq9qzKBXpVAVuxxqxFAr2ouQK/XEWygoANmkq7EBHpVZwi9qhMVkxpeMcF1Ug2CYlLT8GIi9a7JDHrVZAi9Vlg0tkX1mwN61QIj1A5W6FXLAb1quwC9aiEmjDoMoVcdompZ16uWuE6qS1At6xleLaXe9ZhAr9ogK/a49QmgV30XoNcKBBso6ICZpGszgV4+htDLR1RMbK+Y4DrJJigmsYYXE6l3LDPoFcsQer1h0dgW1W8O6BUHRogPVugV54Be8S5ArzjEhNGAIfRqQFQtG3rVEtdJDQmqZYLh1VLqncAEesWDrNjjJhJAr0QXoNcbCDZQ0AEzScczgV5JDKFXElExucIrJrhOuoKgmFxpeDGRel/JDHpdyRB6rbRobIvqNwf0agRGaBys0KuRA3o1dgF6NUJMGFcxhF5XEVXLJl61xHVSE4JqmWx4tTwTnEygV2OQFXvcpgTQq6kL0Gslgg0UdMBM0o2ZQK9mDKFXM6Ji0twrJrhOak5QTFoYXkyk3i2YQa8WDKHXmxaNbVH95oBeLcEIrYIVerV0QK9WLkCvlogJ42qG0OtqomrZ2quWuE5qTVAt2xheLaXebZhAr1YgK/a4bQmgV1sXoNebCDZQ0AEzSbdiAr3aMYRe7YiKSXuvmOA6qT1BMelgeDGRendgBr06MIReqywa26L6zQG9OoIROgUr9OrogF6dXIBeHRETRmeG0KszUbXs4lVLXCd1IaiWXQ2vllLvrkygVyeQFXvcbgTQq5sL0GsVgg0UdMBM0p2YQK/uDKFXd6Ji0sMrJrhO6kFQTHoaXkyk3j2ZQa+eDKHXWxaNbVH95oBevcAIvYMVevVyQK/eLkCvXogJow9D6NWHqFpe41VLXCddQ1AtrzW8Wkq9r2UCvXqDrNjj9iWAXn1dgF5vIdhAQQfMJN2bCfTqxxB69SMqJtd5xQTXSdcRFJPrDS8mUu/rmUGv6xlCr7ctGtui+s0BvfqDEVKCFXr1d0CvFBegV3/EhJHKEHqlElXLNK9a4jopjaBaphteLaXe6UygVwrIij1uBgH0ynABer2NYAMFHTCTdAoT6JXJEHplEhWTAV4xwXXSAIJiMtDwYiL1HsgMeg1kCL1WWzS2RfWbA3oNAiMMDlboNcgBvQa7AL0GISaMGxhCrxuIquUQr1riOmkIQbUcani1lHoPZQK9BoOs2OMOI4Bew1yAXqsRbKCgA2aSHswEeg1nCL2GExWTEV4xwXXSCIJiMtLwYiL1HskMeo1kCL3WWDS2RfWbA3rdCEYYFazQ60YH9BrlAvS6ETFhjGYIvUYTVcsxXrXEddIYgmo51vBqKfUeywR6jQJZsccdRwC9xrkAvdYg2EBBB8wkPYoJ9BrPEHqNJyomN3nFBNdJNxEUkwmGFxOp9wRm0GsCQ+j1jkVjW1S/OaDXRDDCzcEKvSY6oNfNLkCviYgJ4xaG0OsWomp5q1ctcZ10K0G1nGR4tZR6T2ICvW4GWbHHnUwAvSa7AL3eQbCBgg6YSfpmJtBrCkPoNYWomEz1igmuk6YSFJNphhcTqfc0ZtBrGkPo9a5FY1tUvzmg121ghNuDFXrd5oBet7sAvW5DTBjTGUKv6UTV8g6vWuI66Q6Canmn4dVS6n0nE+h1O8iKPe4MAug1wwXo9S6CDRR0wEzStzOBXncxhF53ERWTu71iguukuwmKyUzDi4nUeyYz6DWTIfRaa9HYFtVvDug1C4wwO1ih1ywH9JrtAvSahZgw5jCEXnOIquU9XrXEddI9BNXyXsOrpdT7XibQazbIij3ufQTQ6z4XoNdaBBso6ICZpGczgV5zGUKvuUTFZJ5XTHCdNI+gmMw3vJhIveczg17zGUKvdRaNbVH95oBe94MRHghW6HW/A3o94AL0uh8xYSxgCL0WEFXLB71qieukBwmq5UOGV0up90NMoNcDICv2uA8TQK+HXYBe6xBsoKADZpJ+gAn0eoQh9HqEqJg86hUTXCc9SlBMHjO8mEi9H2MGvR5jCL3WWzS2RfWbA3o9DkZYGKzQ63EH9FroAvR6HDFhLGIIvRYRVcsnvGqJ66QnCKrlk4ZXS6n3k0yg10KQFXvcpwig11MuQK/1CDZQ0AEzSS9kAr0WM4Rei4mKydNeMcF10tMExeQZw4uJ1PsZZtDrGYbQ6z2LxraofnNAr2fBCEuCFXo964BeS1yAXs8iJoylDKHXUqJq+ZxXLXGd9BxBtXze8Gop9X6eCfRaArJij/sCAfR6wQXo9R6CDRR0wEzSS5hArxcZQq8XiYrJS14xwXXSSwTF5GXDi4nU+2Vm0OtlhtDrfYvGtqh+c0CvZWCEV4IVei1zQK9XXIBeyxATxqsModerRNXyNa9a4jrpNYJqudzwain1Xs4Eer0CsmKP+zoB9HrdBej1PoINFHTATNKvMIFeKxhCrxVExeQNr5jgOukNgmKy0vBiIvVeyQx6rWQIvTZYNLZF9ZsDer0JRlgVrNDrTQf0WuUC9HoTMWG8xRB6vUVULd/2qiWuk94mqJarDa+WUu/VTKDXKpAVe9w1BNBrjQvQawOCDRR0wEzSq5hAr3cYQq93iIrJu14xwXXSuwTFZK3hxUTqvZYZ9FrLEHp9YNHYFtVvDui1DoywPlih1zoH9FrvAvRah5gw3mMIvd4jqpbve9US10nvE1TLDYZXS6n3BibQaz3Iij3uBwTQ6wMXoNcHCDZQ0AEzSa9nAr02MoReG4mKySavmOA6aRNBMfnQ8GIi9f6QGfT6kCH02mjR2BbVbw7otRmMsCVYoddmB/Ta4gL02oyYMD5iCL0+IqqWH3vVEtdJHxNUy08Mr5ZS70+YQK8tICv2uFsJoNdWF6DXRgQbKOiAmaS3MIFe2xhCr21ExeRTr5jgOulTgmLymeHFROr9GTPo9RlD6LXJorEtqt8c0OtzMML2YIVenzug13YXoNfniAnjC4bQ6wuiavmlVy1xnfQlQbXcYXi1lHrvYAK9toOs2ON+RQC9vnIBem1CsIGCDphJejsT6LWTIfTaSVRMvvaKCa6TviYoJrsMLyZS713MoNcuhtDrQ4vGtqh+c0Cvb8AI3wYr9PrGAb2+dQF6fYOYML5jCL2+I6qWu71qieuk3QTV8nvDq6XU+3sm0OtbkBV73D0E0GuPC9DrQwQbKOiAmaS/ZQK99jKEXnuJiskPXjHBddIPBMVkn+HFROq9jxn02scQem22aGyL6jcH9NoPRjgQrNBrvwN6HXABeu1HTBg/MoRePxJVy5+8aonrpJ8IquVBw6ul1PsgE+h1AGTFHvdnAuj1swvQazOCDRR0wEzSB5hAr0MModchomJy2CsmuE46TFBMjhheTKTeR5hBryMModcWi8a2qH5zQK9fwAhHgxV6/eKAXkddgF6/ICaMXxlCr1+JquVvXrXEddJvBNXyd8OrpdT7dybQ6yjIij3uMQLodcwF6LUFwQYKOmAm6aNMoNcfDKHXH0TF5E+vmOA66U+CYnLc8GIi9T7ODHodZwi9PrJobIvqNwf0+guMcCJYoddfDuh1wgXo9RdiwvibIfT6m6ha/uNVS1wn/UNQLU8aXi2l3ieZQK8TICv2uKcIoNcpF6DXRwg2UNABM0mfYAK9TjOEXqeJioleObxiEuCYpyELYI+bK8TsYiL1zhWC7iNS6KXb1Bfg4Rb0+tiisS2q3xzQKwRehGpvBhX0kgbQoZc0BDX0CkFMGLlD+EGv3CE01TLMq5a4TgojqJbhhldLqXc4UbXEbpVDQVbscfMgT1BpTjkmNfT6GMEGCjpgJunQENw4Uge23yNC8OznVjGJIComkV4xwXVSJEExiTK8mEi9o5hBryiG0OsTi8a2qH5zQK9oeBETrNAr2gG9YlyAXtGICSMvQ+iVl6ha5vOqJa6T8hFUy/yGV0upd34m0CsGZMUetwAB9CrgAvT6BMEGCjpgJukYJtCrIEPoVZComBTyigmukwoRFJPChhcTqXdhZtCrMEPotdWisS2q3xzQqwi8KBqs0KuIA3oVdQF6FUFMGMUYQq9iRNWyuFctcZ1UnKBaljC8Wkq9SzCBXkVBVuxxSxJAr5IuQK+tCDZQ0AEzSRdlAr1KMYRepYiKSWmvmOA6qTRBMSljeDGRepdhBr3KMIRe2ywa26L6zQG9ysKLcsEKvco6oFc5F6BXWcSEUZ4h9CpPVC0reNUS10kVCKplRcOrpdS7IhPoVQ5kxR63EgH0quQC9NqGYAMFHTCTdDkm0KsyQ+hVmaiYVPGKCa6TqhAUk6qGFxOpd1Vm0KsqQ+j1qUVjW1S/OaBXNXhRPVihVzUH9KruAvSqhpgwajCEXjWIqmVNr1riOqkmQbWsZXi1lHrXYgK9qoOs2OPWJoBetV2AXp8i2EBBB8wkXZ0J9KrDEHrVISomdb1iguukugTFpJ7hxUTqXY8Z9KrHEHp9ZtHYFtVvDuhVH174ghV61XdAL58L0Ks+YsKwGUIvm6haxnrVEtdJsQTVMs7wain1jmMCvXwgK/a48QTQK94F6PUZgg0UdMBM0j4m0KsBQ+jVgKiYNPSKCa6TGhIUkwTDi4nUO4EZ9EpgCL0+t2hsi+o3B/RKhBdJwQq9Eh3QK8kF6JWImDCuYAi9riCqlld61RLXSVcSVMtGhldLqXcjJtArCWTFHrcxAfRq7AL0+hzBBgo6YCbpJCbQ6yqG0OsqomLSxCsmuE5qQlBMkg0vJmeCkxn0SmYIvbZbNLZF9ZsDejWFF82CFXo1dUCvZi5Ar6aICaM5Q+jVnKhatvCqJa6TWhBUy5aGV0upd0sm0KsZyIo9bisC6NXKBei1HcEGCjpgJulmTKDX1Qyh19VExaS1V0xwndSaoJi0MbyYSL3bMINebRhCry8sGtui+s0BvdrCi3bBCr3aOqBXOxegV1vEhNGeIfRqT1QtO3jVEtdJHQiqZUfDq6XUuyMT6NUOZMUetxMB9OrkAvT6AsEGCjpgJul2TKBXZ4bQqzNRMeniFRNcJ3UhKCZdDS8mUu+uzKBXV4bQ60uLxraofnNAr27wonuwQq9uDujV3QXo1Q0xYfRgCL16EFXLnl61xHVST4Jq2cvwain17sUEenUHWbHH7U0AvXq7AL2+RLCBgg6YSbo7E+jVhyH06kNUTK7xigmuk64hKCbXGl5MpN7XMoNe1zKEXjssGtui+s0BvfrCi37BCr36OqBXPxegV1/EhHEdQ+h1HVG1vN6rlrhOup6gWvY3vFpKvfszgV79QFbscVMIoFeKC9BrB4INFHTATNL9mECvVIbQK5WomKR5xQTXSWkExSTd8GIi9U5nBr3SGUKvrywa26L6zQG9MuBFZrBCrwwH9Mp0AXplICaMAQyh1wCiajnQq5a4ThpIUC0HGV4tpd6DmECvTJAVe9zBBNBrsAvQ6ysEGyjogJmkM5lArxsYQq8biIrJEK+Y4DppCEExGWp4MZF6D2UGvYYyhF47LRrbovrNAb2GwYvhwQq9hjmg13AXoNcwxIQxgiH0GkFULUd61RLXSSMJquWNhldLqfeNTKDXcJAVe9xRBNBrlAvQayeCDRR0wEzSw5lAr9EModdoomIyxismuE4aQ1BMxhpeTKTeY5lBr7EModfXFo1tUf3mgF7j4MX4YIVe4xzQa7wL0GscYsK4iSH0uomoWk7wqiWukyYQVMuJhldLqfdEJtBrPMiKPe7NBNDrZheg19cINlDQATNJj2cCvW5hCL1uISomt3rFBNdJtxIUk0mGFxOp9yRm0GsSQ+i1y6KxLarfHNBrMryYEqzQa7IDek1xAXpNRkwYUxlCr6lE1XKaVy1xnTSNoFreZni1lHrfxgR6TQFZsce9nQB63e4C9NqFYAMFHTCT9BQm0Gs6Q+g1naiY3OEVE1wn3UFQTO40vJhIve9kBr3uZAi9vrFobIvqNwf0mgEv7gpW6DXDAb3ucgF6zUBMGHczhF53E1XLmV61xHXSTIJqOcvwain1nsUEet0FsmKPO5sAes12AXp9g2ADBR0wk/RdTKDXHIbQaw5RMbnHKya4TrqHoJjca3gxkXrfywx63csQen1r0dgW1W8O6HUfvJgbrNDrPgf0musC9LoPMWHMYwi95hFVy/letcR10nyCanm/4dVS6n0/E+g1F2TFHvcBAuj1gAvQ61sEGyjogJmk5zKBXgsYQq8FRMXkQa+Y4DrpQYJi8pDhxUTq/RAz6PUQQ+j1nUVjW1S/OaDXw/DikWCFXg87oNcjLkCvhxETxqMModejRNXyMa9a4jrpMYJq+bjh1VLq/TgT6PUIyIo97kIC6LXQBej1HYINFHTATNKPMIFeixhCr0VExeQJr5jgOukJgmLypOHFROr9JDPo9SRD6LXborEtqt8c0OspeLE4WKHXUw7otdgF6PUUYsJ4miH0epqoWj7jVUtcJz1DUC2fNbxaSr2fZQK9FoOs2OMuIYBeS1yAXrsRbKCgA2aSXswEei1lCL2WEhWT57xiguuk5wiKyfOGFxOp9/PMoNfzDKHX9xaNbVH95oBeL8CLF4MVer3ggF4vugC9XkBMGC8xhF4vEVXLl71qieuklwmq5TLDq6XUexkT6PUiyIo97isE0OsVF6DX9wg2UNABM0m/yAR6vcoQer1KVExe84oJrpNeIygmyw0vJlLv5cyg13KG0GuPRWNbVL85oNfr8GJFsEKv1x3Qa4UL0Ot1xITxBkPo9QZRtVzpVUtcJ60kqJZvGl4tpd5vMoFeK0BW7HFXEUCvVS5Arz0INlDQATNJr2ACvd5iCL3eIiomb3vFBNdJbxMUk9WGFxOp92pm0Gs1Q+i116KxLarfHNBrDbx4J1ih1xoH9HrHBei1BjFhvMsQer1LVC3XetUS10lrCarlOsOrpdR7HRPo9Q7Iij3uegLotd4F6LUXwQYKOmAm6XeYQK/3GEKv94iKyfteMcF10vsExWSD4cVE6r2BGfTawBB6/WDR2BbVbw7o9QG82Bis0OsDB/Ta6AL0+gAxYWxiCL02EVXLD71qieukDwmq5WbDq6XUezMT6LURZMUedwsB9NriAvT6AcEGCjpgJumNTKDXRwyh10dExeRjr5jgOuljgmLyieHFROr9CTPo9QlD6LXPorEtqt8c0GsrvNgWrNBrqwN6bXMBem1FTBifMoRenxJVy8+8aonrpM8IquXnhldLqffnTKDXNpAVe9ztBNBruwvQax+CDRR0wEzS25hAry8YQq8viIrJl14xwXXSlwTFZIfhxUTqvYMZ9NrBEHrtt2hsi+o3B/T6Cl7sDFbo9ZUDeu10AXp9hZgwvmYIvb4mqpa7vGqJ66RdBNXyG8OrpdT7GybQayfIij3utwTQ61sXoNd+BBso6ICZpHcygV7fMYRe3xEVk91eMcF10m6CYvK94cVE6v09M+j1PUPodcCisS2q3xzQaw+82Bus0GuPA3rtdQF67UFMGD8whF4/EFXLfV61xHXSPoJqud/wain13s8Eeu0FWbHHPUAAvQ64AL0OINhAQQfMJL2XCfT6kSH0+pGomPzkFRNcJ/1EUEwOGl5MpN4HmUGvgwyh148WjW1R/eaAXj/Di0PBCr1+dkCvQy5Ar58RE8ZhhtDrMFG1POJVS1wnHSGolr8YXi2l3r8wgV6HQFbscY8SQK+jLkCvHxFsoKADZpI+xAR6/coQev1KVEx+84oJrpN+IygmvxteTKTevzODXr8zhF4/WTS2RfWbA3odgxd/BCv0OuaAXn+4AL2OISaMPxlCrz+JquVxr1riOuk4QbX8y/BqKfX+iwn0+gNkxR73BAH0OuEC9PoJwQYKOmAm6T+YQK+/GUKvv4mKyT9eMcF10j8ExeSk4cVE6n2SGfQ6yRB6HbRobIvqNwf0OgUvTgcr9DrlgF6nXYBepzATRig/6KXL7Avw0OXNFXr+3KuWgY4Zetag2OOGhJpdLaXeIaHoPiKBXjJZhYTijxuKPEHlJJRjUkOvgwg2UNABM0mfZgK9cofi2c+tYpKbqJiEecUE10lhBMUk3PBiIvUOJyom6qC0qS/Awy3o9bNFY1tUvzmgVx6IiwgtPoIKekkD6NBLGoIaeuVBTBiRDKFXJFG1jPKqJa6TogiqZbTh1VLqHc0EekWArNjjxhBArxgXoNfPCDZQ0AEzSUeE4saROrD9npch9MpLVEzyecUE10n5CIpJfsOLidQ7PzPolZ8h9Dpk0dgW1W8O6FUA4qJgsEKvAg7oVdAF6FUAMWEUYgi9ChFVy8JetcR1UmGCalnE8Gop9S7CBHoVBFmxxy1KAL2KugC9DiHYQEEHzCRdkAn0KsYQehUjKibFvWKC66TiBMWkhOHFROpdghn0KsEQeh22aGyL6jcH9CoJcVEqWKFXSQf0KuUC9CqJmDBKM4RepYmqZRmvWuI6qQxBtSxreLWUepdlAr1KgazY45YjgF7lXIBehxFsoKADZpIuxQR6lWcIvcoTFZMKXjHBdVIFgmJS0fBiIvWuyAx6VWQIvY5YNLZF9ZsDelWCuKgcrNCrkgN6VXYBelVCTBhVGEKvKkTVsqpXLXGdVJWgWlYzvFpKvasxgV6VQVbscasTQK/qLkCvIwg2UNABM0lXZgK9ajCEXjWIiklNr5jgOqkmQTGpZXgxkXrXYga9ajGEXr9YNLZF9ZsDetWGuKgTrNCrtgN61XEBetVGTBh1GUKvukTVsp5XLXGdVI+gWtY3vFpKveszgV51QFbscX0E0MvnAvT6BcEGCjpgJuk6iPYMsbImEuz4b4s3lq8CjCMrS6ygOEHxghoIaigoQVCioCRBVwi6UlAjQY0FXSWoibSboKaCmglqLqiFoJaCWgm6WlBrQW0EtRXUTlB7QR0EdRTUSVBnyMYqDm0o8Op1rON1nON1vON1A8frho7XCY7XiY7XSY7XVzheX+l43cjxurHj9VWO100cr5Mdr5s6XjdzvG7ueN3C8bql43Urx+urHa9bO163cbxu63jdzvG6veN1B8frjo7XnRyvO/tp6LDzjj5nAs0VNmLeaZ+fBpE47Rdoro1FWvKR5otDtF8H4+13Zmg7PnCdY0FnuwGi/TqabL/4c3LaDQPT2afpbCcg2q+TqfaLzSKnnZhznX0One0kRPt1NtB+DTOzyWlfkTOdE/3obF+JaL8uptkv0a+cdqN/r3PCBXS2GyPar6tJ9ku4oJz2Vf9O59iL6Gw3QbRfN1Psl3BROe3ky9c57RI6200R7dfdBPslXFJOu9nl6ey7DJ3t5oj26/Ff2893WXLaLS6tc4PL1NluiWi/nv+l/eIvW0671UV1js/8FzrbVyPar9d/Zb+EfyWn3frCOif+S53tNoj26/0f2C8p81/Labf1r7MvBzrb7RDt18dt+/lyJKfdPrvOdg51tjsg2u8aN+2XnmM57Y5ZdY4LQGe7E6L9rnXJfrGZAclpd8Zb37f1NbtA7dfXJfv5AjtsxHU2uyOi/foxsR/iOpHdGdF+1zGxH+I6h90V0X7XM7EfIk63uyParz8T+yHiTLsnov1SmNgPESfZvRHtl8rEfoh9vn0Nov3SmNgPsU+1+yLaL52J/RD7LPs6RPtlMLEfYp9g90e0XyYT+yHWOTsV0X4DmNgPMU/b6Yj2G8jEfoh5xs5EtN8gJvZDnCc2YszYmPbLBXarAOOpfW1qv5vaB6f2x6l9c2o/ndpnp/bfqX15ar+e2sen9vepfX9qP6DaJ6j2D6p9hWq/odqHqPYnqn2Laj+j2ueo9j+qfZFqv6TaR6n2V6p9l2o/ptqnqfZvKjt0Ea+7CuomqLugHoJ6CuolqLegPoKuEXStoL6C+gm6TtD1gvoLShGUKihNULqgDEGZggYIGihokKDBgm4QNETQUEHDBA0XNCL07D5DXZ728LoD8I7AOwHvDLwL8K7AuwHvDrwH8J7AewHvDbwP8GuAXwu8L/B+wK8Dfj3w/sBTgKcCTwOeDjwDeCbwAcAHAh8EfDDwGxx2GAKvhwIfBnw48BHARwK/Efgo4KOBjwE+Fvg44OOB3wR8AvCJwG8GfgvwW4FPAj4Z+BTgU4FPA34b8NuBTwd+B/A7gc8Afhfwu4Engx2OwetTwPPkOssLAC8JvBLw2sDjgTcG3gp4J+C9gacAHwx8FPCbgd8OfDbwB4AvBL4E+CvAVwFfD3wL8O3AvwV+APhR4CeAh4ac5THAiwIvB7w6cB/wJODNgLcD3h14P+CZwIcDHw98CvC7gM8F/gjwxcBfBL4C+DvANwLfBnwn8L3ADwH/A7h6DrN6KJj6hXr1c4nqtzvq+MlTZ+Y78G7AuwPvAbwn8F7AewPvA/wa4NcC7wu8H/DrgF8PvD/wFOCpwNOApwPPAJ4JfADwgcAHAR8M/AbgQ4APBT4M+HDgI4CPVEUfDuzvLYxEvO8UarnzRbiSFm5/oI4bNVt7X4QLcMySYFDscUchBiyV3qNC0X2UBQiEOMYO1A6YNh0dimfLUOv8pNMPkxMKpZwlmMhZ3MJP0JLnhfMxIijGChonaLygmwRNEDRR0M2CbhF0q6BJgiYLmqIFUX7g8kuVziQfqcWb/hV7vQjII1w7T0bSk6Co+ORPEkRoelgOffOBLuG4102X1wqzsh7O4pXsx55nGns4zxg2ckzGmIzOY1KHDEprNWZY2uhBw4c1TxkyRA8IdREVGKF+lHS+n1szSB44D9PeU3+XR+O5sGeIzJKlrOzW8AV4aEOif715KkKVOPvVtcxMt1rFqaH4mUge07xWEddJ0whaxdsMbxWl3rcRt4qUNvUFeEjVnaWVQuZxoTS2RfZbrG6L2yEupmvxEVS/MCQNcFJTdnpo9ouGIF/7dsSEcYc2lp0YFxubECc/l5jus+PT02ITY2PTU+N9ab6UtNiMpHg7KTM+Nj4uLT0tVYyZYmf6MlPSkjITz8rlVrW8g6ha3ulVS1wn3UlQLWcYXi2l3jOIqiV2qzwdZMUe9y7kCSonoRzTWYVDkX03DhE6YCbp6USdAbbf72YIve4mKiYzvWKC66SZBMVkluHFROo9ixn0msUQeo1nCL1mQ1zMCVboNdsBvea4AL1mIyaMexhCr3uIquW9XrXEddK9BNXyPsOrpdT7PibQaw7Iij3uXALoNdcF6DUeETpgJuk5TKDXPIbQax5RMZnvFRNcJ80nKCb3G15MpN73M4Ne9zOEXjcxhF4PQFwsCFbo9YADei1wAXo9gJgwHmQIvR4kqpYPedUS10kPEVTLhw2vllLvh5lArwUgK/a4jxBAr0dcgF43IUIHzCS9gAn0epQh9HqUqJg85hUTXCc9RlBMHje8mEi9H2cGvR5nCL1uZQi9FkJcLApW6LXQAb0WuQC9FiImjCcYQq8niKrlk161xHXSkwTV8inDq6XU+ykm0GsRyIo97mIC6LXYBeh1KyJ0wEzSi5hAr6cZQq+niYrJM14xwXXSMwTF5FnDi4nU+1lm0OtZhtBrEkPotQTiYmmwQq8lDui11AXotQQxYTzHEHo9R1Qtn/eqJa6Tnieoli8YXi2l3i8wgV5LQVbscV8kgF4vugC9JiFCB8wkvZQJ9HqJIfR6iaiYvOwVE1wnvUxQTJYZXkyk3suYQa9lDKHXZIbQ6xWIi1eDFXq94oBer7oAvV5BTBivMYRerxFVy+VetcR10nKCavm64dVS6v06E+j1KsiKPe4KAui1wgXoNRkROmAm6VdDaePIF9hhy19iHE0QR28Yrrf8rc03CPS+M7/ZeUP+fiyF3jOIHvyC3YAh+seekd/sGC9BFOMzDY/xsUQxPotJjCP6x55leIwXJ4rxewyP8SlEMX4vkxhH9I99r+Exvgh8beGOSyLrUkayvuqirIHOSzl/KOb7PMNjfwJRnpvPJM8h+seeb7ivJxL5eoFLvjYIO9oLkB8kKRdO1cKq7K/lw+mmA58DfAHwKEErxfmb4Ev5t+qREhPgMxOB3wz8FuCLgC8F/irwgoJWifO3Qq0sB3asvM3kVvlqJnKuCcWPQxUCb0NsrAa+Bri8o/SOOH+XOFbWMvHBOiZyrieMlbUQG+uAr9di5T1x/j5xrGxg4oMPmMi5kTBWNkBsfAB8oxYrm8T5h8SxspmJD7YwkfMjwljZDLGxBfhHWqx8LM4/IY6VrUx8sI2JnJ8SxspWiI1twD/VYuUzcf45caxsZ+KDL5jI+SVhrGyH2PgC+JdarOwQ518Rx8pOJj74momcuwhjZSfExtfAd2mx8o04/5Y4Vr5j4oPdTOT8njBWvoPY2A38ey1W9ojzvcSx8gMTH+xjIud+wlj5AWJjH/D9WqwcEOc/EsfKT0x8cJCJnD8TxspPEBsHgf+sxcohcX6YOFaOMPHBL0zkPEoYK0cgNn4BflSLlV/F+W/EsfI7Ex8cYyLnH4Sx8jvExjHgf2ix8qc4P04cK38x8cEJJnL+TRgrf0FsnAD+txYr/4jzk8SxcoqJD04zkVPecKaKlVMQG6eBy2upWMklzkNyW6SxEpqbhw9yM5EzjDBWQiE2cgMP02IlXJznIY6VCCY+iGQiZxRhrESo2AAepcVKtDiPIY6VvEx8kI/AB2o/Vl6weT7gEYLyi/MCxLYvyMT2hQhtXxBsXkizfWFxXoTY9kWZ2L4Yoe2Lgs2LabYvLs5LENu+JBPblyK0fUmweSnN9qXFeRli25dlYvtyhLYvCzYvp9m+vDivQGz7ikxsX4nQ9hXB5pU021cW51WIbV+Vie2rEdq+Kti8mmb76uK8BrHtazKxfS1C29cEm9fSbF9bnNchtn1dJravR2j7umDzeprt64tzH7HtbSa2jyW0vQ02j9VsHyfO44lt34CJ7RsS2r4B2LyhZvsEcZ5IbPskJra/gtD2SWDzKzTbXynOGxHbvjET219FaPvGYPOrNNs3kdcjtn1TJrZvRmj7pmDzZprtm4vzFsS2b8nE9q0Ibd8SbN5Ks/3V4rw1se3bMLF9W0LbtwGbt9Vs306ctye2fQcmtu/IRM5OTOTszETOLkzk7MpEzm5M5OzORM4eTOTsyUTOXkzk7M1Ezj5M5LyGiZzXMpGzLxM5+zGR8zomcl7PRM7+TORMYSJnKhM505jImc5EzgwmcmYykXMAEzkHMpFzEBM5BzOR8wYmcg5hIudQJnIOYyLncCZyjmAi50gmct7IRM5RTOQczUTOMUzkHMtEznFM5BzPRM6bmMg5gYmcE5nIeTMTOW9hIuetTOScxETOyUzknEKw56UXjLcKvgs/BXgH2PvSEXgn4J2BvwOfew/4JuAfA/8M+A7g3wDfA/wA8EPAfwX+J/B/gOeC64UDjwaeH3hh4MWBlwZeHnhl4NWB1wZeH3gc8ATgVwJvArw58KuBtwPeBXhX4N2AdwfeA3hP4L2A9wbeB/g1wK8F3hd4P+DXAb8eeH/gKcBTgacBTweeATwT+ADgA4EPAj4Y+A3AhwAfCnwY8OHARwAfCfxG4KOAjwY+BvhY4OOAjwd+E/AJwCcCvxn4LcBvBT4J+GTgU5Q/BU0V59Nyn51v+vexx0AMrQQ+Ff6mkKDbxPntua0sh9r/lQw84O8cIo41HW/un3ngr+PnUM4cznzlC+w485xFpLFInzpegomcxS3c/K9knALnd4gYu1PQDEF3Cbpb0ExBswTNFjRH0D2C7hV0n6C5guYJmi/ofkEPCFog6EFBDwl6WNAjgh4V9JigxwUtFLRI0BOCnhT0lKDFgp4W9IygZwUtEbRU0HOCnhf0gqAXBb0k6GVBywS9IuhVQa8JWi7odUErBL0haKWgNwWtEvSWoLcFrRa0RtA7gt4VtFbQOkHrBb0n6H1BGwR9IGijoE2CPhS0WdAWQR8J+ljQJ4K2Ctom6FNBnwn6XNB2QV8I+lLQDkFfCdop6GtBuwR9I+hbQd8J2i3oe0F7BO0V9IOgfYL2Czog6EdBPwk6KOhnQYcEHRZ0RNAvgo4K+lXQb4J+F3RM0B+C/hR0XNBfgk4I+lvQP4JOyrwn6LTMd2HC54JCBIUKyi0oTFC4oDxh52M3P3D52xUqTYZo74U6YjzSyv6c33DtPBkpbgke4u2TakdoelgOffOBLuGo1020I8+6I8uRy/E62Y89z/yuApynpQwZ0vnGQWNTRme0GjMsbfSg4cP0qa2GV1M81I96zvdza6ZQj+4J095Tf5dH47mwc518LvH03Nnt4AvwsLQD/bd6wgIfSz2HOtTKHgv+ZPYFdti6zL4AD13eSC2wnflDHirgCOazbTmu47RjPj/voV6cwknSoNjjRoXhBT+V3lFh6D4ibdKiECeUDF5nUaWQeUZuGtsi+y1Wt0U0xEWMFh9hmn3UZ2XyOe3Hdrm08xD4TMhFPpPrAuNcqGEgSzBKOWmAk5qyMWHZLxqCfO1oxISRVxvLToyLjU2Ik59LTPfZ8elpsYmxsemp8b40X0pabEZSvJ2UGR8bH5eWnpYqxkyxM32ZKWlJmYln5XKrWuYlqpb5vGqJ66R8BNUyv+HVUuqdn6haYrfKMSAr9rgFkCeonIRyTGcVDkX2nV6BA4UOmEk6Jgw3jtSB7feCDKFXQaJiUsgrJrhOKkRQTAobXkyk3oWZQa/CDKHXXQyhVxGIi6LBCr2KOKBXURegVxHEhFGMIfQqRlQti3vVEtdJxQmqZQnDq6XUuwQT6FUUZMUetyQB9CrpAvS6CxF6YSbpokygVymG0KsUUTEp7RUTXCeVJigmZQwvJlLvMsygVxmG0OtuhtCrLMRFuWCFXmUd0KucC9CrLGLCKM8QepUnqpYVvGqJ66QKBNWyouHVUupdkQn0KgeyYo9biQB6VXIBet2NCL0wk3Q5JtCrMkPoVZmomFTxigmuk6oQFJOqhhcTqXdVZtCrKkPodQ9D6FUN4qJ6sEKvag7oVd0F6FUNMWHUYAi9ahBVy5petcR1Uk2CalnL8Gop9a7FBHpVB1mxx61NAL1quwC97kGEXphJujoT6FWHIfSqQ1RM6nrFBNdJdQmKST3Di4nUux4z6FWPIfS6lyH0qg9x4QtW6FXfAb18LkCv+ogJw2YIvWyiahnrVUtcJ8USVMs4w6ul1DuOCfTygazY48YTQK94F6DXvYjQCzNJ+5hArwYMoVcDomLS0CsmuE5qSFBMEgwvJlLvBGbQK4Eh9LqPIfRKhLhIClboleiAXkkuQK9ExIRxBUPodQVRtbzSq5a4TrqSoFo2MrxaSr0bMYFeSSAr9riNCaBXYxeg132I0AszSScxgV5XMYReVxEVkyZeMcF1UhOCYpJseDE5E5zMoFcyQ+iVhyjBIvstC/RqCnHRLFihV1MH9GrmAvRqipgwmjOEXs2JqmULr1riOqkFQbVsaXi1lHq3ZAK9moGs2OO2IoBerVyAXnkQoQNmkm4WRhtHvsCOcz+Ejx1HVxuut3x4zNUE8+eh/GbnDfkQFgq9H0bWWx3YDRiif+yH85sd4yWIYvwxw2P8TqIYf5xJjCP6x37c8BgvThTjTxge43OJYvxJJjGO6B/7ScNjXPaQV7uES3yBHXZ1RrL6GMma5KKsgeYQOdcpctPThs/TmUQ5+RkmORnRP/Yzhvt6FpGvl7rka4Nwro2ps/SHXORVi8ASC8iH8sonTUheFHg54FGCWovzNuBL+bfqyYMz4W9nAZ8NfA7w6jCGD3gS8IKC2orzdtqY6uGKp+FvLfhsLuAhwEOB5wYeI6i9OO+gjTUCxmoLn5kLY84DPh/4/cAfAL4A+IPAHwL+MPBHgD8K/DHgjwNfCHwR8CeAPwn8KeCLgT8N/BngzwJfAnwp8OeAPw/8BeAvAn8J+MvAlwF/BfirwF8Dvhz468BXAH8D+ErgbwJfBfwt4G8DXw18DfB3gL8LfC3wdcDXA38P+PvANwD/APhG4JuAfwh8M/AtwD8C/jHwT4BvBb4N+KfAPwP+OfDtwL8A/iXwHcC/Ar4T+NfAdwH/Bvi3wL8Dvhv498D3AN8L/Afg+4DvB34A+I/AfwJ+EPjPwA8BPwz8CPBfgB8F/ivw34D/DvwY8D+A/wn8OPC/gJ8A/jfwf4CfBH4KeHuYZ2HAw4HXEtRRnHfS5qZa174D/rY1fLYjcPlw8M7ivAv0cth1Sa7ldiaoS10NX8+VD0O/jWAduxvybgQ3brKWtXDrqTq6ezdZcZ3UneAmaw/Db7JKvXsQb0nCbnYxbdoTL6Gc2bWhP1pbHSYnFEo5yzCRs7SFn6AlzwvnvUSM9RbUR9A1gq4V1FdQP0HXCbpeUH9BKYJSBaVp8zE/cLkty5nkI7V407dv6UVAHuHaeTKSngRF5czvPURoelgOffNZWcEb0nXT5bU0k2exp9Nuuj2lrCXhPGPYyDEZYzI6j0kdMiit1ZhhaaMHDR/WPGXIED0g1EVUYIT6UdL5fm7NIAoJh2nvqb/Lo/Fc2DNEZslyVnZr+AI8tCHRW8V0hrvX04n242V4rSKukzIIWsVMw1tFqXcms93rmQx3r/dhuHt9AMTFwGDdvT7AsXt9oAu71wcgJoxBDHevDyKqloO9aonrpMEE1fIGw6ul1PsGJjsEBoKs2OMOIdi9PsSF3et9EKEDZpIeSNQZYPt9KEPoNZSomAzzigmuk4YRFJPhhhcTqfdwZtBrOEPodQ1D6DUC4mJksEKvEQ7oNdIF6DUCMWHcyBB63UhULUd51RLXSaMIquVow6ul1Hs0E+g1EmTFHncMAfQa4wL0ugYROmAm6ZFMoNdYhtBrLFExGecVE1wnjSMoJuMNLyZS7/HMoNd4htDrWobQ6yaIiwnBCr1uckCvCS5Ar5sQE8ZEhtBrIlG1vNmrlrhOupmgWt5ieLWUet/CBHpNAFmxx72VAHrd6gL0uhYROmAm6QlMoNckhtBrElExmewVE1wnTSYoJlMMLyZS7ynMoNcUhtCrP0PoNRXiYlqwQq+pDug1zQXoNRUxYdzGEHrdRlQtb/eqJa6TbieoltMNr5ZS7+lMoNc0kBV73DsIoNcdLkCv/ojQATNJT2MCve5kCL3uJComM7xiguukGQTF5C7Di4nU+y5m0OsuhtArhSH0uhviYmawQq+7HdBrpgvQ627EhDGLIfSaRVQtZ3vVEtdJswmq5RzDq6XUew4T6DUTZMUe9x4C6HWPC9ArBRE6YCbpmUyg170Mode9RMXkPq+Y4DrpPoJiMtfwYiL1nssMes1lCL1SGUKveRAX84MVes1zQK/5LkCveYgJ436G0Ot+omr5gFctcZ30AEG1XGB4tZR6L2ACveaDrNjjPkgAvR50AXqlIkIHzCQ9P4w2jnyBHbb8JcaeBHH0kOF6y9+9fYhA7+cNf7iY/P1YCr1fYPIgG0T/2C8Y/iCbMkQx/rLhMd6bKMaXMYlxRP/YywyP8dJEMf6a4TGeRhTjy5nEOKJ/7OWGx/g08LWFOy7Ng/IYyTrfRVkxHrxIMd/fMDz2+xLluZVM8hyif+yVhvu6H5Gv32Ly4EVMbPIW4YMXZX8tH3g2EPhI4BOAywcvPizOHwFf6g9e7Auf6Qf8OuDXA58GfCbw+cDlgxcfFeePhVlZDuxYeZzJrfKFTORcFIYfh2rt8HGIjYXAFwGXd5SeEOdPEsfKU0x8sJiJnE8TxspTEBuLgT+txcoz4vxZ4lhZwsQHS5nI+RxhrCyB2FgK/DktVp4X5y8Qx8qLTHzwEhM5XyaMlRchNl4C/rIWK8vE+SvEsfIqEx+8xkTO5YSx8irExmvAl2ux8ro4X0EcK28w8cFKJnK+SRgrb0BsrAT+phYrq8T5W8Sx8jYTH6xmIucawlh5G2JjNfA1Wqy8I87fJY6VtUx8sI6JnOsJY2UtxMY64Ou1WHlPnL9PHCsbmPjgAyZybiSMlQ0QGx8A36jFyiZx/iFxrGxm4oMtTOT8iDBWNkNsbAH+kRYrH4vzT4hjZSsTH2xjIuenhLGyFWJjG/BPtVj5TJx/Thwr25n44Asmcn5JGCvbITa+AP6lFis7xPlXxLGyk4kPvmYi5y7CWNkJsfE18F1arHwjzr8ljpXvmPhgNxM5vyeMle8gNnYD/16LlT3ifC9xrPzAxAf7mMi5nzBWfoDY2Ad8vxYrB8T5j8Sx8hMTHxxkIufPhLHyE8TGQeA/a7FySJwfJo6VI0x88AuBD9R+rCNg81+ARwg6Ks5/Jbb9b0xs/zuh7X8Dm/+u2f6YOP+D2PZ/MrH9cULb/wk2P67Z/i9xfoLY9n8zsf0/hLb/G2z+j2b7k/Kc2PanmdheGovK9qfB5vJNZftc4jwknNb2oeE8bJ87nM72oWDz3Jrtw8R5OLHt8zCxfQSh7fMom2u2jxTnUcS2j2Zi+xhC20eDzWM02+cV5/mIbZ+fie0LENo+P9i8gGb7guK8ELHtCzOxfRFC2xcGmxfRbF9UnBcjtn1xJrYvQWj74mDzEprtS4rzUsS2L83E9mUIbV8abF5Gs31ZcV6O2Pblmdi+AqHty4PNK2i2ryjOKxHbvjIT21chtH1lsHkVzfZVxXk1YttXZ2L7GoS2rw42r6HZvqY4r0Vs+9pMbF+H0Pa1weZ1NNvXFef1iG1fn4ntfUzktJnIGctEzjgmcsYzkbMBEzkbMpEzgYmciUzkTGIi5xVM5LySiZyNmMjZmImcVzGRswkTOZOZyNmUiZzNmMjZnImcLZjI2ZKJnK2YyHk1EzlbM5GzDRM52zKRsx0TOdszkbMDEzk7MpGzExM5OzORswsTObsykbMbEzm7M5GzBxM5ezKRsxcTOXszkbMPEzmvYSLntUzk7MtEzn5M5LyOiZzXM5GzPxM5U5jImcpEzjSCPS+9YLxH4Xs0acDrw94XH3AbeCzwJ+BzzwB/Hvgy4K8DXwX8HeDvAd8E/GPgnwHfAfwb4HuAHwB+CPhR4MeA/wX8JPBcIGcY8EjgeYEXBF4UeEngZYFXBF4VeE3gdYHHAY8H3gB4Q+AJwBOBJwG/AviVwBsBbwz8KuBNgCcDbwq8GfDmwFsAbwm8FfCrgbcG3gZ4W+DtgLcH3gF4R+CdgHcG3gV4V+DdgHcH3gN4T+C9gPcG3gf4NcCvBd4XeD/g1wG/Hnh/4CnAU4GnAa8tKF2cZ4SfnW8yptX3sXtBLDwMPB3+ppCgTHE+gHg/18DwHI/lc4zl2kN6ByLnGHUM0mztPaQ3wDGlkwaF4487OBwv+Kn0HhyO7iPSR9oPRpxQzkfaY8s6WlyglEVr3wDHtp1v6Pa4AWJjiBYjYZqt1Gf/bx9rLw2wWlN2iBZ8ToGwrn0DYtIYepGxEhMyUjMT4uNSfPGZqWKchpkZcSmxSXZmYpwYPi7eTk3J8KXHpyY0jG+YmJngc6tiDiWqmMO8ionrpGEEFXO44RVT6j2cqGJit8tDQFbscVcTPQIu0MfYO+XEjKUReEnJXo38ODmZxKR8TWFM7JiXHYzsZLDj6B2X4ihQqIhZkIcgxhGV/bD9PJIhbB9J1ITc6DUhuE66kaAJGWV4EyL1HuVSE+IL7LDlM2gpZHVCd3Vgyx9Iws7MeqT5EZcEto8Ge4+5DNjezI/tnLC9mXVp2O5vnEvCdopgQxrrXGc1Ovy8siFg1KZW1iPQzpVQD3sMYjIbizcZMpU9xxJ2rtKOQwgQ0Frih38H2iVJvUcT6L3OLL2zySf1HkOg93pDEa+zwGDmDT3GA7Xfe4baz3HYiPFtI8aMTWW/EOR5Mhqx1oxDRMpyDIraMi6cJodh+prinla3MHy9x4fTxDi2nDcxkXMCEzknIsopQU6qdX5lRcaU9Je0xUTizSk3M7H3LYh5VdpbolpVR6QNbiG2862INcat1cRbiVYTJ3mribhOmkSwmjjZ8NVEqfdkRquJFLJ6G4Gyy6zbYwrYfOplrChWtLLb0bmiWNG69Iqiv3H+L1YUpTEraIabGp49U5q8ojgVMaFNC8e377TwrIGEaUeqe+G3hdMmXgxUOoUA7W5isKI4lUDvD4n19gV2nMkXtxHovZnJSiBiXNqIvrY3M9nzcTtDlHY7EUqb7qE0XCdNJ0BpdxiO0qTedzBCaXd4KO3cYfk5sGTW7XEn2HyGh9JyfihD3elAaTOYobQZiAntLgKUdhdDlHY3A5R2J0HX/gkDlDaDQO+tDFDa3QR6b2OC0hDj0kb0tY1pP1ms/e0cxfYPdmzOCDdfxplE92zRJ+QsxJu2XANqFoOAmo0tI7aAcg13NkHF2M6kYsxE7IrnIE7K7Qw6jTkEcXNPOG6lTLWyH5h2pbDtPQwS271UlTIEOaB0CB3oWPcx2IJKMSnnhpufjDIJ9P7S8CQsJ+F9BHrvMPOL2NnknIc4HxF9be/Iz6aInbshhB2bcxkUsXlcilg5xLHmI04aOaFDrewHtqPKWjSOwpazDBM5SyPKqa/ZT4Hz+0WMPSBogaAHBT0k6GFBjwh6VNBjgh4XtFDQIkFPCHpS0FOCFgt6WtAzgp4VtETQUkHPCXpe0AuCXhT0kqCXBS0T9IqgVwW9Jmi5oNcFrRD0hqCVgt4UtErQW4LeFrRa0BpB7wh6V9BaQesErRf0nqD3BW0Q9IGgjYI2CfpQ0GZBWwR9JOhjQZ8I2ipom6BPBX0m6HNB2wV9IehLQTsEfSVop6CvBe0S9I2gbwV9J2i3oO8F7RG0V9APgvYJ2i/ogKAfBf0k6KCgnwUdEnRY0BFBvwg6KuhXQb8J+l3QMUF/CPpT0HFBfwk6IehvQf8IOinolKDTgqw8wm+CQgSFCsotKExQuKA8giIERQqKEhQtKEZQXkH5BOUXVEBQQUGFBBUWVERQUUHF8pyP3fzA5U1A526HSC1/6DcLQ6ysR7h2nowUt+H48+rM900iND0sh775QJdw1Osm2vJaYVbWw3lvMtmPPaWsheE8LWXIkM43DhqbMjqj1ZhhaaMHDR+mT201vJrioX7Uc76fWzOFiogw7T31d3k0ngs71/UUV5wfnt0OvgAPSzuwG/DieQIfKwO+BOzWbildZl+Ahy5vCS2XeLulAhxTOkkaFHvcknnwgp9K75J50H1E2qSVRJxQbv06zgIqRIUrZ6xui1IQF6W1+AiqH7WVBjipKVs6T/aLhiBfuxRiwiijjWUnxsXGJsTJzyWm++z49LTYxNjY9NR4X5ovJS02IyneTsqMj42PS0tPSxVjptiZvsyUtKTMxLNyuVUtyxBVy7JetcR1UlmCalnO8Gop9S5HVC2xW+XSICv2uOWRJ6ichHJMZxXGvqGtV+BAoQNmki6dBzeO1IHt9woMoVcFomJS0SsmuE6qSFBMKhleTKTelZhBr0oModeDDKFXZYiLKsEKvSo7oFcVF6BXZcSEUZUh9KpKVC2redUS10nVCKpldcOrpdS7OhPoVQVkxR63BgH0quEC9HoQEXphJukqTKBXTYbQqyZRManlFRNcJ9UiKCa1DS8mUu/azKBXbYbQ6yGG0KsOxEXdYIVedRzQq64L0KsOYsKoxxB61SOqlvW9aonrpPoE1dJneLWUevuYQK+6ICv2uDYB9LJdgF4PIUIvzCRdlwn0imUIvWKJikmcV0xwnRRHUEziDS8mUu94ZtArniH0epwh9GoAcdEwWKFXAwf0augC9GqAmDASGEKvBKJqmehVS1wnJRJUyyTDq6XUO4kJ9GoIsmKPewUB9LrCBej1OCL0wkzSDZlArysZQq8riYpJI6+Y4DqpEUExaWx4MZF6N2YGvRozhF4LGUKvqyAumgQr9LrKAb2auAC9rkJMGMkMoVcyUbVs6lVLXCc1JaiWzQyvllLvZkygVxOQFXvc5gTQq7kL0GshIvTCTNJNmECvFgyhVwuiYtLSKya4TmpJUExaGV5MpN6tmEGvVgyh1yKG0OtqiIvWwQq9rnZAr9YuQK+rERNGG4bQqw1RtWzrVUtcJ7UlqJbtDK+WUu92TKBXa5AVe9z2BNCrvQvQaxEi9MJM0q2ZQK8ODKFXB6Ji0tErJrhO6khQTDoZXkyk3p2YQa9ODKFXMaIEi+y3LNCrM8RFl2CFXp0d0KuLC9CrM2LC6MoQenUlqpbdvGqJ66RuBNWyu+HVUurdnQn06gKyYo/bgwB69XABehVDhA6YSbpLHto48gV2nPshfOw46mm43vLhMT0J5s/Xhj8EWz6EhULvXURPB8NuwBD9Y+8y/ElwZYhi/DvDY/wBohjfzSTGEf1j7zY8xksTxfhew2P8CaIY/4FJjCP6x/7B8BiXPWRPl3CJL7DDbshI1iaMZG3toqyB5hA51yly0wHD5+nDRDn5RyY5GdE/9o+G+/oRIl//7JKvDcK5NqbO0h9ykVctAksscMo6+/giyasArws8SlAvcd4bfAnPvzxzPAx/+wjwR4E/BrwhjNEEeGvgBQX1EefXaGOqZw3mg8/kB15A/Q3wQsALA48RdK0476uNNQLG6gOfeQLkeRL4U8AXA38a+DPAnwW+BPhS4M8Bfx74C8BfBP4S8JeBLwP+CvBXgb8GfDnw14GvAP4G8JXA3wS+CvhbwN8Gvhr4GuDvAH8X+Frg64CvB/4e8PeBbwD+AfCNwDcB/xD4ZuBbgH8E/GPgnwDfCnwb8E+Bfwb8c+DbgX8B/EvgO4B/BXwn8K+B7wL+DfBvgX8HfDfw74HvAb4X+A/A9wHfD/wA8B+B/wT8IPCfgR8Cfhj4EeC/AD8K/FfgvwH/Hfgx4H8A/xP4ceB/AT8B/G/g/wA/CfwU8NPALYj7XMBDgIcCzw08DHg48DzAI4BHqhwAPFrNOeB5gV8LvAjwosBrCeonzq/T5qZa174fZO0Fn+2n5reg68V5f62Xkwd2HUnJ+Rq2zzGWazcHU4huDqZ6NwdxnZRKcHMwzfCbg1LvNGZbadIIt9JgyzpaXGB6blr7Bji27XxDt0c6xEZGsG6nkQZYrSmboQWfUyCsa6cjJo3Mi4yVmJCRmpkQH5fii89MFeM0zMyIS4lNsjMT48TwcfF2akqGLz0+NaFhfMPEzASfWxUzk6hiDvAqJq6TBhBUzIGGV0yp90AmS5YZICv2uIeJlnMC3T7jlBMzlgbhJSX7MPLSkExiUr6mMCZVF4MdR7+4FEeBQkXMgpyBGEdU9sP282CGsH0wURNyg9eE4DrpBoImZIjhTYjUewiTe7w9iWR161swgSTszKxHmh9xSWD7ULD3sMuA7c382M4J25tZl4bt/sa5JGynCDaksc51VkPznFc2BIza1Mp6YG/8RtTDHoaYzIbjTYZMZc/hhJ2rtGMGAQL61ayNdNm6JKn3UAK9fzN8A6HUexiB3r8binidBQYzb+gxHqj9jhlqP8dhI8a3jRgz9jEmG2iGItaaEYixLMegqC0j8tDkMExfU6wGdQ3D13tkHpoYx5bzRiZyjmIi52hEOSXIGWydX1mRMSX9JW0xmnhzyhgm9h6LmFelvW+wztcRaYOxxHYeh1hj3FpNHEe0mjjeW03EddJ4gtXEmwxfTZR638RoNZFCVm8jUHaZdXtMAJtPvIwVxYpWdjs6VxQrWpdeUfQ3zv/FiqI0ZgXNcBPzZM+UJq8oTkRMaDcT2PfmPFkDCdOOVPfCbyFGfRiodAIB2j3BYEVxIoHefxv+VTCp9y0Eev/DZCUQMS5tRF/b/zDZ83ErQ5R2KxFKm+ShNFwnTSJAaZMNR2lS78mMUNpkD6WdOyw/B5bMuj2mgM2neigt54cy1BQHSpvKDKVNRUxo0wjsO40hSruNAUqbQtC1WwXM13sqgd65iPX2BXacyRe3Eegdgqy3OrDzJWJc2oi+tjHtJ4v1DVb2A9s/2LE5NY/5Mt5OdM8WfUJOR2wMuAbUdAYBdQe2jNgCyjXcOwgqRjiTinE7Yld8J+KkDGfQadxJEDcz8uBWysFW9gPTrhS2ncEgsd1FVSlDkAOqJ+IEv5vBFlSKSTnT8C2oUu/rCfSOMDwJy0l4N4HekS4V70DlnIU4HxF9bUcWYFPEzt0Qwo7NmQyK2CwucG82k73Ec5D3Eg+xzjcE0gZziPcS38PwLvU9RHep7/XuUuM66V6Cu9T3GX6XWup9H5e71GE0sl7olwkobEI0dpa7ynPBRvOC7q5yGP5dz7mOu8rz3LirjKeHPQ8xAc0nuKs8/yJ3lQNeWgg76z/scWNMv7saljVOscbNSwQ7nUtKvsAOG9E/NpXO2L65n2FnfD9RZ/yA1xnjOukBgs54geGdsdR7AaPOeIHXGfs7snTGD4KNHvI645wfylAPOjrjh5h1xg8hJqCHCTrjh4k74wcJOsQCDDrjhwj0LsikM0b0j10Q+SbKECv7gW1T7Lz6EIObKI9wuYnyKPKeOY4B9SiDgHrM9D1zcs3nMYIsX4TJnrlHEDubxxEnZRHi7sAX2HGmu3ycIG4Wenvm7IUMEtsi0xMb1U/5PcFk+8KTDBc5nyRa5HzKW+TEddJTBIuciw1f5JR6L2a0yLmY7yKnTTm2Lv/TYKNnvEXOnB/KUE87FjmfYbbI+QxiAnqWYJHzWeJFzqcJ2vliDBY5nyHQuzgT+Is5fxB9bRdnspVgCcMuewlRl73U67JxnbSUoMt+zvAuW+r9HKMu+zmvy/Y7ti7/82CjF7wuO+eHMtTzji77BWZd9guICehFgi77ReIu+3mCbrMUgy77BQK9Swdhl43oa7u0ty0hSz7yBXhQyfgSl20JL3vbEuyXGQTUMtPv3sm1qGUEFaMck4rxEmKX9AripCzHYFvCKwRx86q3LcF+lUFie41LpVzOcOFwOdHC4evewiGuk14nWDhcYfjCodR7BaOFwxV8Fw5jCcfOsnD4BthopbdwmPNDGeoNx8LhSmYLhysRE9CbBAuHbxIvHL5B0NZWYLBwuJJA74o8YGAs5vxB9LVdkcnt+VUMu+xVRF32W16Xjeuktwi67LcN77Kl3m8z6rLf9rpsf0eWLns12GiN12Xn/FCGWu3ostcw67LXICagdwi67HeIu+zVBN1mFQZd9hoCvasGYZeN6Gu7qnd7Pks+8gV4UMn4LpebDmu92/P2WgYBtc702/NyLWodQcWoweT2/LuIXdJ6xElZg8Ht+fUEcfOed3vefo9BYnufS6XcwHDhcAPRwuEH3sIhrpM+IFg43Gj4wqHUeyOjhcONfBcO4wjHzrJwuAls9KG3cJjzQxlqk2Ph8ENmC4cfIiagzQQLh5uJFw43EbS1tRgsHH5IoHdtHjAwDnP+IPrars3k9vwWhl32FqIu+yOvy8Z10kcEXfbHhnfZUu+PGXXZH3tdtr8jS5f9Cdhoq9dl5/xQhvrE0WVvZdZlb0VMQNsIuuxtxF32JwTdZj0GXfZWAr3rB2GXjehru753ez5LPvIFeFDJ+CmXmw6febfn7c8YBNTnpt+el2tRnxNUjFgmt+c/ReyStiNOylgGt+e3E8TNF97tefsLBontS9MTm/xR/+m58QN0Rx6zJyaV3l8hJjdLO7Dl3EnUwmHL+TWiPeUaz1Dr/FqLtMHXeSyLUv5dDBfkdxEtyH/jLcjjOukbggX5bw1fkJd6f8toQZ5C1v+3J+N+Bzba7S3I5/xQhvrOsSC/m9mC/G7EBPQ9wYL898QL8t8RwMV4Bgvyuwn0bsDkybiI/rEbMNmqsodhZ7yHqDPe63XGuE7aS9AZ/2B4Zyz1/oFRZ/yD1xn7O7J0xvvARvu9zjjnhzLUPkdnvJ9ZZ7wfMQEdIOiMDxB3xvsIOsREBp3xfgK9k5h0xoj+sTF1lgl3qJX9wLYpdl7dz+Cm2Y9ctpf8hLy9hGNA/cQgoA6afhdWrvkcJMjyjZhsL/kRsbP5GXFSNiLuDnyBHWe6y58J4uYQ8vaSVCv7gWlXCtseYpDYDnPYXtItDD9AjzDZvvALw0XOX4gWOY96i5y4TjpKsMj5q+GLnFLvXxktcv7Kd5HTtafZ/gY2+t1b5Mz5oQz1m2OR83dmi5y/IyagYwSLnMeIFzl/I2jnr2KwyPk7gd5NgvBptoi+tpsw2UrwB8Mu+w+iLvtPr8vGddKfBF32ccO7bKn3cUZd9nGvy/Y7ti7/X2CjE16XnfNDGeovR5d9glmXfQIxAf1N0GX/Tdxl/0XQbTZj0GWfINC7eRB22Yi+tpt72xKy5CNfgAeVjP9w2ZZw0tuWYJ9kEFCnTL97J9eiThFUjFZMKsY/iF3SacRJ2YrBtoTTBHFjRXjbEjBtQCVjrgiLR6UMieC3cBiCaFxd3tCI8+fewmGAY0onSYNij5sbMWCp9M4dge4jsipFIev/29Nsw8BG4ZqtvIXDf3koQ0ljVtAMFx7Ba+EwHDEB5YnAt2+eCNqFw7AI/HFbM1g4DCfQu00QPs0W0dd2Gya35yMYdtkRRF12pNdl4zopkqDLjjK8y5Z6RzHqsqO8LtvfkaXLjgYbxXhdds4PZahoR5cdw6zLjkFMQHkJuuy8xF12NEG32Z5Blx1DoHeHIOyyEX1td/Buz2fJR74ADyoZ83G56ZAfT1C2t+fzMwioAtgyYgso16IKEFSMzkxuz+dD7JIKIk7KzgxuzxckiJtC3u15uxCDxFaYS6UswnDhsAjRwmFRb+EQ10lFCRYOixm+cCj1LsZo4bAY34VD155mWxxsVMJbOMz5oQxV3LFwWILZwmEJxARUkmDhsCTxwmFxgra2K4OFwxIEencLwqfZIvra7sbk9nwphl12KaIuu7TXZeM6qTRBl13G8C5b6l2GUZddxuuy/R1ZuuyyYKNyXped80MZqqyjyy7HrMsuh5iAyhN02eWJu+yyBN1mTwZddjkCvXsFYZeN6Gu7l3d7Pks+8gV4UMlYgctNh4re7Xm7IoOAqmT67Xm5FlWJoGJcw+T2fAXELqky4qS8hsHt+coEcVPFuz1vV2GQ2KqanthKiTHkD/tjB2g1xEnOSe/qEWYnpHJijCcIfs6jr+GJeL5Y5V1EoHc/lwp4oHLWQJyPiL62+zGIm9cI4qam4XlC6v0+gd61GOj9JYHetRnUhR0EevdnML+/ItA7hUldqINYFxB9bacYHjdyvhwmiJt0BvPlCIHeGUzmS13E+YLoazuDwXzJRbAQUo9BXS1MoHd9BnpXJdDbx0DvagR6D2RQF6oT6D2ISV2wEesCoq9tTPu5tSGwIt5YWTYExnobAnGdFEuwITDO8A2BUu84og2B6ghxjB2oHTBtGo+Y6EKt85NOP0xOKJRyVmAiZ3kLP0FLnhfOG4gYaygoQVCioCRBVwi6UlAjQY0FXSWoiYxFQU21+ZgfuNxc6UzykVq86Zsw9SIgj3DtPBlJT4Ki4pObViM0PSyHvvlAl3Dc66bLa4VZWQ9n8Ur2Y08pa0k4zxg2ckzGmIzOY1KHDEprNWZY2uhBw4c1TxkyRA8IdREVGKF+lHS+n1sziHo8Vpj2nvq7PBrPhT1DZJasZGW3hi/AQxsSvdVuhlAlMjLPHm61is2IvjvS3GsVcZ3UnKBVbGF4qyj1bkHcKlLa1BfgcaHvjWDLnEC1HRVXzljdFi0hLlpdxndQTvuxnfM7KKetS38Hxd84l/wOCrIRbKWcNMBJTdlWfr43EoJ87ZaICeNqbSw7MS42NiFOfi4xXRT/9LTYxNjY9NR4X5ovJS02IyneTsqMj42PS0tPSxVjptiZvsyUtKTMxLNyuVUtryaqlq29aonrpNYE1bKN4dVS6t3GpW9aBvzQM5AVe9y2BF8gk2M6qzD29vAEROiAmaRbEXUG2H5vxxB6tSMqJu29YoLrpPYExaSD4cVE6t2BGfTqwBB6JTKEXh0hLjoFK/Tq6IBenVyAXh0RE0ZnhtCrM1G17OJVS1wndSGoll0Nr5ZS765MoFcnkBV73G4E0KubC9ArERE6YCbpTkygV3eG0Ks7UTHp4RUTXCf1ICgmPQ0vJlLvnsygV0+G0CuJIfTqBXHRO1ihVy8H9OrtAvTqhZgw+jCEXn2IquU1XrXEddI1BNXyWsOrpdT7WibQqzfIij1uXwLo1dcF6JWECB0wk3RvJtCrH0Po1Y+omFznFRNcJ11HUEyuN7yYSL2vZwa9rmcIva5iCL36Q1ykBCv06u+AXikuQK/+iAkjlSH0SiWqlmletcR1UhpBtUw3vFpKvdOZQK8UkBV73AwC6JXhAvS6ChE6YCbpFCbQK5Mh9MokKiYDvGKC66QBBMVkoOHFROo9kBn0GsgQejVhCL0GQVwMDlboNcgBvQa7AL0GISaMGxhCrxuIquUQr1riOmkIQbUcani1lHoPZQK9BoOs2OMOI4Bew1yAXk0QoQNmkh7MBHoNZwi9hhMVkxFeMcF10giCYjLS8GIi9R7JDHqNZAi9khlCrxshLkYFK/S60QG9RrkAvW5ETBijGUKv0UTVcoxXLXGdNIagWo41vFpKvccygV6jQFbscccRQK9xLkCvZETogJmkR0XQxpEvsMOuJMaIJ4ij8YbrXVGMMZ5A7yEFzM4b8vdjKfQeSvRj9NgNGKJ/7KEFzI7xCkQxPsLwGG9IFOMjmcQ4on/skYbHeHmiGB9teIw3JYrxMUxiHNE/9hjDYzwFfG3hjksi62BGso5yUdZA56WcPxTzfbzhsX8FUZ67iUmeQ/SPfZPhvr6SyNc3u+Rrg7Cjjamz9IdcOFULq7K/PmWd/V1qyTsB7w08StBN4nwC+FL+rXqkxBXwmSuBNwLeGHgK8MHARwEvKGiiOL85wspyYMfKLUxuld/KRM5JEfhxqNYOb4HYuBX4JODyjtJkcT6FOFamMvHBNCZy3kYYK1MhNqYBv02LldvF+XTiWLmDiQ/uZCLnDMJYuQNi407gM7RYuUuc300cKzOZ+GAWEzlnE8bKTIiNWcBna7EyR5zfQxwr9zLxwX1M5JxLGCv3QmzcB3yuFivzxPl84li5n4kPHmAi5wLCWLkfYuMB4Au0WHlQnD9EHCsPM/HBI0zkfJQwVh6G2HgE+KNarDwmzh8njpWFTHywiImcTxDGykKIjUXAn9Bi5Ulx/hRxrCxm4oOnmcj5DGGsLIbYeBr4M1qsPCvOlxDHylImPniOiZzPE8bKUoiN54A/r8XKC+L8ReJYeYmJD15mIucywlh5CWLjZeDLtFh5RZy/ShwrrzHxwXImcr5OGCuvQWwsB/66FisrxPkbxLGykokP3mQi5yrCWFkJsfEm8FVarLwlzt8mjpXVTHywhomc7xDGymqIjTXA39Fi5V1xvpY4VtYx8cF6JnK+Rxgr6yA21gN/T4uV98X5BuJY+YCJDzYykXMTYax8ALGxEfgmLVY+FOebiWNlCxMffETgA7UfawvY/CPg0uQfi38+Ibb9Via230Zo+61g822a7T8V/3xGbPvPmdh+O6HtPwebb9ds/4X450ti2+9gYvuvCG2/A2z+lWb7neKfr4ltv4uJ7b8htP0usPk3mu2/Ff98R2z73Uxs/z2h7XeDzb/XbL9H/LOX2PY/MLH9PkLb/wA236fZfr/45wCx7X9kYvufCG3/I9j8J832B8U/PxPb/hAT2x8mtP0hsPlhzfZHxD+/ENv+KBPb/0po+6Ng81812/8m/vmd2PbHmNj+D0LbHwOb/6HZ/k/xz3Fi2//FxPYnCG3/F9j8hGb7v8U//xDb/iQT258itP1JsPkpzfan5T+RtLbPFcnD9iGRdLaXNpA2D4k8b/tQcZ6b2PZhTGwfTmj7MLB5uGb7POI8gtj2kUxsH0Vo+0iweZRm+2hxHkNs+7xMbJ+PiZz5mchZgImcBZnIWYiJnIWZyFmEiZxFmchZjImcxZnIWYKJnCWZyFmKiZylmchZhomcZZnIWY6JnOWZyFmBiZwVmchZiYmclZnIWYWJnFWZyFmNiZzVmchZg4mcNZnIWYuJnLWZyFmHiZx1mchZj4mc9ZnI6WMip81EzlgmcsYxkTOeiZwNmMjZkImcCUzkTGQiZxITOa9gIueVTORsxETOxkzkvIqJnE2YyJnMRM6mBHteesF4E2F/XVPgeWHvSz7g+YEXAD4ZPnc78LuAzwE+D/iDwB8D/iTwZ4G/APwV4CuAvwX8XeDvA/8Q+MfAPwX+BfCdwL8Fvgf4fuAHgR8B/hvwP4H/Dfw08FDQNw/waOAFgRcCXhh4EeBFgRcDXhx4CeAlgZcCXhp4GeBlgZcDXh54BeAVgVcCXhl4FeBVgVcDXh14DeA1gdcCXht4HeB1gdcDXh+4D7gNPBZ4HPB44A2ANwSeADwReBLwK4BfCbwR8MbArwLeBHgy8KZKbkHNxHnzyLPzTf8+dgPw4U3AmymfCWohzlsS7+dqFZnjsXyOsVx7SG8r5Byjjqs1W3sP6Q1wTOmkqyPxx20diRf8VHq3jkT30UWLti+wI4tNfQEezkfahyDL2iNMFAq8zfx2TzGeHUHrrwDHtp1v6PZtA7HWVou5MC1O1GdlQvP3ePtc2nkIfCbkIp/JdYFx9Dql/p40aSnlpAFWa8q21YLZKRDWtdsgJqF2FxkrMSEjNTMhPi7FF5+ZKsZpmJkRlxKbZGcmxonh4+Lt1JQMX3p8akLD+IaJmQk+typwO6IK3N6rwLhOak9QgTsYXoGl3h2IKjB2+90WZMUe99YCNJUsNECbOuXEjKWOeEnJxrSfKkxSvqYwJnbMq64IO44mG/5IRtW9Yes9xaX5EyjkxmxE2iKONdXQ/OM4bMT4thFjxqayH/Y86cRw+agTUfPa2WtecZ3UmaB57WJ48yr17uJS8+oL7LDls5ApZHUuIakDW/62ASSCzKxHmh9xSZZ7uoK9u13Gck8zP7ZzLvc0sy693ONvnEsu91AEG9JY5zryrpHnlQ0Boza1sh7YHQeiHnY3xGTWHW8yZCp7didEPNKObQmQ83RixBNolyT17kqg9x1m6Z1NPql3NwK97zQUqTgLDGbe0GM8UPvNYIL0EOPbRowZm8p+IcjzpCtiremBuFInx6CoLT0iaXIYpq8pVhGP5MHXezaDVcS6BKuIc8xcRcwmZ0/E+Yjoa3sOg7ipRxA3vSLN17s+gd69GejtI9C7D6LecjFgrnV+BVLObRlP0rZ9iDcTXhNJk++w5bwWMd9Je8+zzvdb0gbXEtu5L2Iv5taqe1+iVfd+3qo7rpP6Eay6X2f4qrvU+zpGq+4UsnobN88elp8DS2bdvteDD/tfxkp+Re3vLrSSX9G69Eq+v3H+L1bypTEraIbrH5k985q8kt8fMUGmROLbN+Uy7Bmo3KmIXZmh+zrIVsavJ1ituo+B3v0J9J5r+KqD1DuVQO95TFbyEePSRvS1TWU/bD+nMUSPaUToMd1Dj7hOSidAjxmGo0epdwYj9JjhoUf26DETfDjAQ485P5ShMh3ocQAz9DgAMUEOJECPA11Aj4M89JhjFJVJgCYWMNB7AIHeDzJAj4MI9H6ICXpEjEsb0dc2pv1k0Z9nZT+w/YMdmwMizZdxMNE9bvQJeQNiQeQaUDcwCKgh2DJiCyjXlocQVIzHmFSMwYjd9VDESfkYg05jKEHcDIvErZRzrewHpl0pbDuMQWIbTlUpQ5ADSofigY41gsHWdopJOdLwrZtS7xYEei80PAnLSTiCQO9FTLa234g4HxF9bS8qwKaInbtRhR2bIxkUsRu5FLFKiGONQpw0ckKHWtkPbEdVtGgchS1nBSZylkeUU7+JNAXOR4sYGyNorKBxgsYLuknQBEETBd0s6BZBtwqaJGiyoCmCpgqaJug2QbcLmi7oDkF3Cpoh6C5BdwuaKWiWoNmC5gi6R9C9gu4TNFfQPEHzBd0v6AFBCwQ9KOghQQ8LekTQo4IeE/S4oIWCFgl6QtCTgp4StFjQ04KeEfSsoCWClgp6TtDzgl4Q9KKglwS9LGiZoFcEvSroNUHLBb0uaIWgNwStFPSmoFWC3hL0tqDVgtYIekfQu4LWClonaL2g9wS9L2iDoA8EbRS0SdCHgjYL2iLoI0EfC/pE0FZB2wR9KugzQZ8L2i7oC0FfCtoh6CtBOwV9LWiXoG8EfSvoO0G7BX0vaI+gvYJ+ELRP0H5BBwT9KOgnQQcF/SzokKDDgo4I+kXQUUG/CvpN0O+R52M3P3D5lnMXRqSWP/SbjiFW1iNcO09GiluCXR9nvp8ToelhOfTNB7qEo143Uf4W+rkbxJbDnk676faUshaG87SUIUM63zhobMrojFZjhqWNHjR8mD611fBqiof6Uc/5fm7NFHngPEx7T/1dHo3nws518ULJUZHZ7eAL8LC0A7sBPxYZ+FgZ8OMCbu3i0mX2BXjo8v6h+c7bxRXgmNJJ0qDY4/4ZiRf8VHr/6XIS8AV2ZLGpL8DDrV/dGhtJY1tkv8XqtjgOcfGXFh9B9SPr0gAnNWX/isx+0RDkax9HTBgntLHsxLjY2IQ4+bnEdFH809NiE2Nj01PjfWm+lLTYjKR4OykzPjY+Li09LVWMmWJn+jJT0pIyE8/K5Va1PEFULf/2qiWuk/4mqJb/GF4tpd7/EFVL7Fb5L5AVe9yTyBNUTkI5prMKY9/QHosIHTCT9F9EnQG2308xhF6niIrJaa+Y4DrpNEExsaLMLiZSbykjso9IoZduU1+Ah1vQaxxD6JUL4iJEi4+ggl7SADr0koaghl65EBNGaBQ/6BUaRVMtc2tB7FXLAMeUTsodhT9umOHVUuodRlQtsVvlEJAVe9xw5AkqJ6Eckxp6jUOEDphJOiQKN47Uge33PFF49nOrmOQhKiYRXjHBdVIEQTGJNLyYSL0jmUGvSIbQazxD6BUFcREdrNArygG9ol2AXlGICSOGIfSKIaqWeb1qieukvATVMp/h1VLqnY8J9IoGWbHHzU8AvfK7AL3GI0IvzCQdzQR6FWAIvQoQFZOCXjHBdVJBgmJSyPBiIvUuxAx6FWIIvW5hCL0KQ1wUCVboVdgBvYq4AL0KIyaMogyhV1GialnMq5a4TipGUC2LG14tpd7FmUCvIiAr9rglCKBXCReg1y2I0AszSRdhAr1KMoReJYmKSSmvmOA6qRRBMSlteDGRepdmBr1KM4RetzKEXmUgLsoGK/Qq44BeZV2AXmUQE0Y5htCrHFG1LO9VS1wnlSeolhUMr5ZS7wpMoFdZkBV73IoE0KuiC9DrVkTohZmkyzKBXpUYQq9KRMWksldMcJ1UmaCYVDG8mEi9qzCDXlUYQq9JDKFXVYiLasEKvao6oFc1F6BXVcSEUZ0h9KpOVC1reNUS10k1CKplTcOrpdS7JhPoVQ1kxR63FgH0quUC9JqECL0wk3Q1JtCrNkPoVZuomNTxigmuk+oQFJO6hhcTqXddZtCrLkPo9TtD6FUP4qJ+sEKveg7oVd8F6FUPMWH4GEIvH1G1tL1qieskm6BaxhpeLaXesUygV32QFXvcOALoFecC9PodEXphJun6UbRx5AvsOPdD+NhxFG+43hXFGPEE8+epAmbnDfkQFgq9FxM9HQy7AUP0j724gNkxXoEoxp81PMbHEMX4EiYxjugfe4nhMV6eKMafNzzGJxPF+AtMYhzRP/YLhse47CHjXcIlvsAOuwgjWcsykrWai7IG/NOCFk1uetnweXoTUU5exiQnI/rHXma4rycQ+fo1l3xtEM61MXWW/pCLvGoRWGKBU9bZxxdJLn/2VPJo4DKlNhD/NARfyr9VTx68Cf5mAvCJwG8GXgTGKAu8GvCCghLEeaI2pnq44s/wt4eAHwZ+BPgvwI8CjxGUJMa5QhtrBIyVANebDJ+dAnwq8GnAbwN+O/DpwO8AfifwGcDvAn438JnAZwGfDXwO8HuA3wv8PuBzgc8DPh/4/cAfAL4A+IPAHwL+MPBHgD8K/DHgjwNfCHwR8CeAPwn8KeCLgT8N/BngzwJfAnwp8OeAPw/8BeAvAn8J+MvAlwF/BfirwF8Dvhz468BXAH8D+ErgbwJfBfwt4G8DXw18DfB3gL8LfC3wdcDXA38P+PvANwD/APhG4JuAfwh8M/AtwD8C/jHwT4BvBb4N+KfAPwP+OfDtwL8A/iXwHcC/Ar4T+NfAdwH/Bvi3wL8Dvhv498D3AN8L/Afg+4DvB34A+I/AfwJ+EHgSzLNf4fVvwGsJulL8XyNtbqp17dHwmQbwt1cCLySosTi/Suvl5IFdR5rkfA3b5xjLtZuDTYhuDiZ7NweRnURwc7Cp4TcHpd5NmW2laUq4lQYbPPQIEwUgD954PcV4dSJo/RXg2LbzDd2+zSDWmgfr9hxpgNWass21YHYKhHXtZohJqMVFxkpMyEjNTIiPS/HFZ6aKcRpmZsSlxCbZmYlxYvi4eDs1JcOXHp+a0DC+YWJmgs+tCtyCqAK39CowrpNaElTgVoZXYKl3KyZLoM1BVuxxXydaHgp0O45TTsxYuhovKdmvIy81ySQm5WsKY2LHvOqKsOPoDcOXV1X3hq33SpfmT6CQG7MRaY441puG5h/HYSPGt40YMzaV/bDnSWuGy0etiZrXNl7ziuukNgTNa1vDm1epd1smew3iiWR169tYzQNIBJlZjzQ/4pIs97QDe7e/jOWeZn5s51zuaWZdernH3ziXXO6hCDaksc515O2izisbAkZtamU9sDsORD3s9ojJrAPeZMhU9uxAiHikHZsTIOfVZm3ozNYlSb3bEei9xvCNrFLv9gR6v2MoUnEWGMy8ocd4oPZ7lwnSQ4xvGzFmbCr7hSDPk3aItaYjYizLMShqS8comhyG6WuKVcQnCFYR32ewiliDYBVxg5mriNnk7IQ4HxF9bW9gEDc1CeKms+F5Qupdi0DvLgz0rk2gd1dEveViwMPW+RVIObdlPEnbdiXeTNgtiibfYcvZHTHfSXs/Yp3vt6QNuhPbuQdiL+bWqnsPolX3nt6qO66TehKsuvcyfNVd6t2L0ao7hazexs2zh+XnwJJZt29v8GGfy1jJr6j93YVW8ital17J9zfO/8VKvjRmBc1wfaKyZ16TV/L7ICbIawjse81l2DNQua9FtKeh+zrIVsZ7E6xWbWKgdx8CvT80fNVB6n0tgd6bmazkI8aljehrm8p+2H7uyxA99iVCj/089IjrpH4E6PE6w9Gj1Ps6RujxOg89skeP14MP+3voMeeHMtT1DvTYnxl67I+YIFMI7JviAnpM9dBjjlHU9QRo4hMGevcn0HsrA/SYSqD3NiboETEubURf25j2k0X/ESv7ge0f7NjsH2W+jGlE97jRJ2Q6YkHkGlDpDAIqA1tGbAHl2nIGQcXYzqRipCF215mIk3I7g04jkyBuBkThVsqHrewHpl0pbDuAQWIbSFUpQ5ADKh5xgg9isLWdYlIONnzrptS7MYHeXxqehOUkHESg9w4mW9tvQJyPiL62dxRgU8TO3ajCjs3BDIrYDVzg3hAme6+HIu+9ftQ63xBIGwwl3ns9jOHd82FEd8+He3fPcZ00nODu+QjD755LvUdwuXseQSPrhX7xhMImRGNnuTs9Emx0Y9DdnY7Av3s60nF3+kY37k7j6WHfiJiARhHcnR4VlTWQdDsGvLQQcdZ/2ON+bfrd1YiscYo17i4mjzhC9I9NpTO2b0Yz7IxHE3XGY7zOGNdJYwg647GGd8ZS77GMOuOxXmfs78jSGY8DG433OuOcH8pQ4xyd8XhmnfF4xAR0E0FnfBNxZzyOoEP8jkFnPJ5A791MOmNE/9i7kW+iPGplP7Btip1XxzO4iTKBy02Uich75jgG1EQGAXWz6Xvm5JrPzQRZfi+TPXMTEDubWxAn5V7i7sAX2HGmu7yFIG5u9fbM2bcySGyTqCol9r6ayYiT0uSfjLyQowO13xSGi6VTiBZLp3qLpbhOmkqwWDrN8MVSqfc0Roul0/gultqUY+vy3wY2ut1bLM35oQx1m2Ox9HZmi6W3Iyag6QSLpdOJF0tvI4AF+xgslt5OoPd+JjAac/4g+trez6TLvoNhl30HUZd9p9dl4zrpToIue4bhXbbUW8qI7COyLnuG12X7HVuX/y6w0d1el53zQxnqLkeXfTezLvtuxAQ0k6DLnkncZd9F0G3+xKDLvptA74NB2GUj+to+6G1vyJKPfAEeVDLO4rK9Yba3vcGezSCg5pi+vUGuRc0hqBiHmVSMWYhd0j2Ik/IwcafhC+w4U2nvIYibe73tDfa9DBLbfaYnNqonOs5l8usM8xgumM4jWjCd7y2Y4jppPsGC6f2GL5hKve9ntGB6P98F01jCsbMsmD4ANlrgLZjm/FCGesCxYLqA2YLpAsQE9CDBgumDxAumDxC0878wWDBdQKD3UR7wNxZz/iD62j7KZFvCQwy77IeIuuyHvS4b10kPE3TZjxjeZUu9H2HUZT/iddn+jixd9qNgo8e8LjvnhzLUo44u+zFmXfZjiAnocYIu+3HiLvtRgm7zdwZd9mMEeh8Lwi4b0df2MW9bQpZ85AvwoJJxIZdtCYu8bQn2IgYB9YTpd+/kWtQTBBXjOJNtCQsRu6QnESflcQbbEp4kiJunvG0J9lMMEttiDtsSahFsS3iaybaEZxgumD5DtGD6rLdgiuukZwkWTJcYvmAq9V7CaMF0Cd8F0zjCsbMsmC4FGz3nLZjm/FCGWupYMH2O2YLpc4gJ6HmCBdPniRdMlxK08ycYLJg+R6D33zzgbxzm/EH0tf03k20JLzDssl8g6rJf9LpsXCe9SNBlv2R4ly31folRl/2S12X7O7J02S+DjZZ5XXbOD2Wolx1d9jJmXfYyxAT0CkGX/Qpxl/0yQbd5ikGXvYxA79NB2GUj+to+7W1LyJKPfAEeVDK+ymVbwmvetgT7NQYBtdz0u3dyLWo5QcUIKciiYmSZ8YHq/DripMS2H0XH/TpB3KzwtiXYKxgktjc4bEuoTbAtYWWUO4ktUDnfRExGbyC2wisL8LDfqv9/+2VZzMWeJ28x2b7zNqKf5VrbY9b5NS9pg7ejLItS/tUMb4ysJroxssa7MYLrpDUEN0beMfzGiNT7HUY3Rihk/X97svW7YKO13o2RnB/KUO86boysZXZjZC1iAlpHcGNkHfGNkXcJYHtu4uUKDL3XEugdRrTMFYI8fxD9Y1PpjO2b9Qw74/VEnfF7XmeM66T3CDrj9w3vjKXe7zPqjN/3OmN/R5bOeAPY6AOvM875oQy1wdEZf8CsM/4AMQFtJOiMNxJ3xhsIOsQIBp3xBwR6RzLpjBH9Y2PqLBPuY1b2A9um2Hn1AwY3Lzdx2ebzIfI2H44B9SGDgNps+t1wueazmSDLxzDZ5rMJsbPZgjgpYxhs89lCEDcfIW/zmWtlPzDtSmHbjxgkto+pKiX2do1PECflbMQtFnOYfL9yK8PF0q1Ei6XbvMVSXCdtI1gs/dTwxVKp96eMFks/5btY6trTqD8DG33uLZbm/FCG+syxWPo5s8XSzxET0HaCxdLtxIulnxHAgnwMFks/J9A7PxMYjTl/EH1t52eyJeELhl32F0Rd9pdel43rpC8JuuwdhnfZUu8djLrsHV6X7XdsXf6vwEY7vS4754cy1FeOLnsnsy57J2IC+pqgy/6auMv+iqDbLMSgy95JoHfhIOyyEX1tF/a2N2TJR74ADyoZd3HZ3vCNt73B/oZBQH1r+vYGuRb1LUHFKMakYuxC7JK+Q5yUxRhsb/iOIG52e9sb7N0MEtv3HH7FpB7Br5jsYfLrDHsZLpjuJVow/cFbMMV10g8EC6b7DF8wlXrvY7Rguo/vgqlrT6PeDzY64C2Y5vxQhtrvWDA9wGzB9ABiAvqRYMH0R+IF0/0E7XwJBgumBwj0LskD/qI+jRrR13ZJJtsSfmLYZf9E1GUf9LpsXCcdJOiyfza8y5Z6/8yoy/7Z67L9HVm67ENgo8Nel53zQxnqkKPLPsysyz6MmICOEHTZR4i77EME3WYZBl32YQK9ywZhl43oa7usty0hSz7yBXhQyfgLl20JR71tCfZRBgH1q+l37+Ra1K8EFaMCk20JvyB2Sb8hTsoKDLYl/EYQN7972xLs3xkktmMctiXUJ9iW8AeTbQl/Mlww/ZNowfS4t2CK66TjBAumfxm+YCr1/ovRgulffBdMXXsa9Qmw0d/egmnOD2WoE44F07+ZLZj+jZiA/iFYMP2HeMH0BEE7X4nBgunfBHpX5gF/UZ9GjehruzKTbQknGXbZJ4m67FNel43rpFMEXfZpw7tsqfdpRl32aa/L9ndk6bKt6LMsV/T5t7wu+18e5wwVnbXLlkbl1GVLedVYAT/BPRrfviHRtF22FY0/bjUGXXYuAr2rB2GXjehru7q3LSFLPvIFeFDJGBpNE+foEzI3nqBstyXkZhBQYdgyYgso16LCCCpGLSbbEkIRu6RwxElZi8G2hHCCuMkTjVspOW5LyMMgsUWYntjktgQfwbaEyGh3ElugckYhJqPJBfDGmoI4FqX9ov//7UdSGCqJMSYT3OipY3hBHCUWvSYR6F23II98E4M4XxB9bdc1PG7kfJlLEDc+BvPlPgK9bSbzJS/ifEH0tW0zmC9PE8RNPIP5sphA7wZM5ks+xPmC6Gu7AYP5spIgbhIZzJc3CPROYjJf8iPOF0Rf20kM5subBHHTiMF8WUWgd2Mm86UA4nxB9LXdmMF8+ZggbpIZzJdPCPRuymS+FEScL4i+tpsymC/fE8RNCwbzZQ+B3i2ZzJdCiPMF0dd2Swbz5RhB3LRmMF/+INC7DZP5UhhxviD62m7DYL5EENyYb89gvkQS6N2ByXwpgjhfEH1td2AwX6II4qYzg/kSTaB3FybzpSjifEH0tY1pP7e+6FYVb6wsX3Qrpn2PxfuiW4BjVgWDYo9bHHEHJZXexaPRfZQlOYU4xg7UDpg2LYGY6EKt85NOP0xOKJRyVmEiZ2ULP0FLnhfOS4oYKyWotKAygsoKKieovPwOnaCKgioJqiyoiqCq2nzMD1x+adCZ5CO1eNO/XKgXAXmEa+fJSHoSFBWf/DJmhKaH5dA3H+gSjnvddHmtMCvr4SxeyX7sKWUtCecZw0aOyRiT0XlM6pBBaa3GDEsbPWj4sOYpQ4boAaEuogIj1I+SzvdzawbJA+dh2nvq7/JoPBf2DJFZspqV3Rq+AA9tSPxvIyJUiYzMs4dbrWK1aPxMJI/qXquI66TqBK1iDcNbRal3DeJWkdKmvgCPC/0eArbMpam+ZokrZ6xui5oQF7Uu47cVTvuxnfO3FU5bl/5tBX/jXPK3FZCNYCvlpAFOasrW8vN7CCHI166JmDBqa2PZiXGxsQlx8nOJ6T47Pj0tNjE2Nj013pfmS0mLzUiKt5My42Pj49LS01LFmCl2pi8zJS0pM/GsXG5Vy9pE1bKOVy1xnVSHoFrWNbxaSr3rElVL9K8jg6zY49Yj+GEUOaazCmN/7bk0InTATNK1iDoDbL/XZwi96hMVE59XTHCd5CMoJrbhxUTqbTODXjZD6FWGIfSKhbiIC1boFeuAXnEuQK9YxIQRzxB6xRNVywZetcR1UgOCatnQ8Gop9W7IBHrFgazY4yYQQK8EF6BXGUTogJmk45hAr0SG0CuRqJgkecUE10lJBMXkCsOLidT7CmbQ6wqG0KssQ+h1JcRFo2CFXlc6oFcjF6DXlYgJozFD6NWYqFpe5VVLXCddRVAtmxheLaXeTZhAr0YgK/a4yQTQK9kF6FUWETpgJulGTKBXU4bQqylRMWnmFRNcJzUjKCbNDS8mUu/mzKBXc4bQqxJD6NUC4qJlsEKvFg7o1dIF6NUCMWG0Ygi9WhFVy6u9aonrpKsJqmVrw6ul1Ls1E+jVEmTFHrcNAfRq4wL0qoQIHTCTdEsm0KstQ+jVlqiYtPOKCa6T2hEUk/aGFxOpd3tm0Ks9Q+hVmSH06gBx0TFYoVcHB/Tq6AL06oCYMDoxhF6diKplZ69a4jqpM0G17GJ4tZR6d2ECvTqCrNjjdiWAXl1dgF6VEaEDZpLuyAR6dWMIvboRFZPuXjHBdVJ3gmLSw/BiIvXuwQx69WAIvaowhF49IS56BSv06umAXr1cgF49ERNGb4bQqzdRtezjVUtcJ/UhqJbXGF4tpd7XMIFevUBW7HGvJYBe17oAvaogQgfMJN0rmjaOfIEdtvwlxhIEcdTXcL3l7972JdC7e0Gz84b8/VgKvXsQ/Rg9dgOG6B+7h+EPHqhCFOO9DY/xUkQx3odJjCP6x+5jeIxXJorxvobHeFWiGO/HJMYR/WP3MzzGW4KvLdxxSWTtyEjWXi7KGui8lPOHYr73Nzz2yxHluRQmeQ7RP3aK4b4uT+TrdJd8bRB2tDF1lv6QC6dqYVX216ess79LLXkc8EbAowT1E+fXgS/l36pHSpSDz5QHXgF4ReAtgXcE3gu4UMe6Xpz3j7ayHOh5gcmt8lQmcqZF48ehWjtMgdhIBZ4GXN5RShfnGcSxksnEBwOYyDmQMFYyITYGAB+oxcogcT6YOFZuYOKDIUzkHEoYKzdAbAwBPlSLlWHifDhxrIxg4oORTOS8kTBWRkBsjAR+oxYro8T5aOJYGcPEB2OZyDmOMFbGQGyMBT5Oi5Xx4vwm4liZwMQHE5nIeTNhrEyA2JgI/GYtVm4R57cSx8okJj6YzETOKYSxMgliYzLwKVqsTBXn04hj5TYmPridiZzTCWPlNoiN24FP12LlDnF+J3GszGDig7uYyHk3YazMgNi4C/jdWqzMFOeziGNlNhMfzGEi5z2EsTIbYmMO8Hu0WLlXnN9HHCtzmfhgHhM55xPGylyIjXnA52uxcr84f4A4VhYw8cGDTOR8iDBWFkBsPAj8IS1WHhbnjxDHyqNMfPAYEzkfJ4yVRyE2HgP+uBYrC8X5IuJYeYKJD55kIudThLHyBMTGk8Cf0mJlsTh/mjhWnmHig2eZyLmEMFaegdh4FvgSLVaWivPniGPleSY+eIGJnC8SxsrzEBsvAH9Ri5WXxPnLxLGyjIkPXiHwgdqPtQxs/grwCEGvivPXiG2/nIntXye0/XKw+eua7VeI8zeIbb+Sie3fJLT9SrD5m5rtV4nzt4ht/zYT268mtP3bYPPVmu3XiPN3iG3/LhPbryW0/btg87Wa7deJ8/XEtn+Pie3fJ7T9e2Dz9zXbbxDnHxDbfiMT228itP1GsPkmzfYfivPNxLbfwsT2HxHafgvY/CPN9h+L80+Ibb+Vie23Edp+K9h8m2b7T8X5Z8S2/5yJ7bcT2v5zsPl2zfZfiPMviW2/g4ntvyK0/Q6w+Vea7XeK86+Jbb+Lie2/IbT9LrD5N5rtvxXn3xHbfjcT239PaPvdYPPvNdvvEed7iW3/AxPb7yO0/Q9g832a7feL8wPEtv+Rie1/IrT9j2DznzTbHxTnPxPb/hAT2x8mtP0hsPlhzfZHxPkvxLY/ysT2vzKR8zcmcv7ORM5jTOT8g4mcfzKR8zgTOf9iIucJJnL+zUTOf5jIeZKJnKeYyHmaiZxWDA85czGRM4SJnKFM5MzNRM4wJnKGM5EzDxM5I5jIGclEzigmckYzkTOGiZx5mciZj4mc+ZnIWYCJnAWZyFmIiZyFmchZhImcRZnIWYyJnMWZyFmCiZwlmchZiomcpZnIWYaJnGWZyFmOiZzlmchZgYmcFZnIWYmJnJWZyFmFiZxVEeVUe156wXjXw16XqsCPAv8V+G/AfweeDnwQ8GHARwEfD/wW4FOB3wF8JvB7gd8P/GHgC4EvBr4U+EvAXwW+Avgq4GuArwO+AfiHwD8G/inwL4DvBP4t8D3A9wM/CPwI8GPA/wD+J/DjwP8CfgL438D/AX4S+Cngp4HLe0WS5wIeAjwUeG7gYcDDgecBHgE8EngU8GjgMcDzAs8HPD/wAsALAi8EvDDwIsCLAi8GvDjwEsBLAi8FvDTwMsDLAi8HvDzwCsArAq8EvDLwKsCrAq8tqJo4rx5zdr7p38cuCTbtB7ya0klQDXFeM8bKcmDP11oxOR7L5xjLtYf01kLOMeqordnae0hvgGNKJ9WOwR+3Tgxe8FPpXScG3Uekj7SvgzihnI+0D0GWNS5CFAq8TRV2vBivaDStvwIc23a+odu3LsRaPS3mwrQ4UZ+VCc3f4+1zaech8JmQi3wm1wXGidTeU39PmrSUctIAqzVl62nB7BQI69p1EZNQ/YuMlZiQkZqZEB+X4ovPTBXjNMzMiEuJTbIzE+PE8HHxdmpKhi89PjWhYXzDxMwEn1sVuD5RBfZ5FRjXST6CCmwbXoGl3jZRBcZuv+uBrNjjZhI9Ui40QJs65cSMpVi8pGRnIj+eTiYxKV9TGBM75lVXhB1HAw1/JKPq3rD1HuTS/AkUcmM2IvUQxxpsaP5xHDZifNuIMWNT2Q97nsQxXD6KI2pe473mFddJ8QTNawPDm1epdwOXmldfYIctn4VMIatzCUkd2PLXCyARZGY90vyIS7Lc0xDsnXAZyz3N/NjOudzTzLr0co+/cS653EMRbEhjnevIG8acVzYEjNrUynpgdxyIetgJiMksEW8yZCp7JhIiHmnHegTIeRgx4gm0S5J6NyTQe7hZemeTT+qdQKD3CEORirPAYOYNPcYDtd9IJkgPMb5txJixqewXgjxPGiLWmiTElTo5BkVtSYqhyWGYvqZYRfwkCl/vsQxWEQsSrCKOM3MVMZucVyDOR0Rf2+MMjxs5X/YQzJcJDOZLIYL5MpHJfLkScb4g+tqeyGC+/EEwX25lMF8KE8yXSUzmSyPE+YLoa3sSg/kSSRA3UxnMlyIEek9jMl8aI84XRF/bmPaTi9brrfN3ymQPKuuqzBWNiTe9XxVDEwfYcjZBjANp7/es8+sC0gZNiO2cjLhm4Nbd4WSiu8NNvbvDuE5qSnB3uJnhd4el3s0Y3R2mkNX7gsHZw/JzYMms27c5+LDFZdxxrqj93YXuOFe0Ln3H2d84/xd3nKUxK2iGaxGTPfOafMe5BWKCbBmDb9+Wl2HPQOVuhdiVGbr/kOwObnOCuyrTGejdgkDvOwxH8VLvVgR638nkjjNiXNqIvrap7Ift56sZoseridBjaw894jqpNQF6bGM4epR6t2GEHtt46JE9emwLPmznocecH8pQbR3osR0z9NgOMUG2J0CP7V1Ajx089JhjFNWWAE3MZKB3OwK9ZzFAjx0I9J7NBD0ixqWN6Gsb036y6L9nZT+w/YMdm+1izJexI9E9bvQJ2QmxIHINqE4MAqoztozYAsq15c4EFeM+JhWjI2J33QVxUt7HoNPoQhA3XWNwK+V6K/uBaVcK23ZlkNi6UVXKEOSA0qF4oGN1Z/AVLIpJ2SPG/GRUg0DveYYnYTkJuxPoPZ/Jlt+eiPMR0df2/IJsiti5G1XYsdmDQRHryaWIVUMcqxfipJETOtTKfmA7qqpF4yhsOaswkbMyopz6TaQpcN5bxFgfQdcIulZQX0H9BF0n6HpB/QWlCEoVlCYoXVCGoExBAwQNFDRI0GBBNwgaImiooGGChgsaIWikoBsFjRI0WtAYQWMFjRM0XtBNgiYImijoZkG3CLpV0CRBkwVNETRV0DRBtwm6XdB0QXcIulPQDEF3Cbpb0ExBswTNFjRH0D2C7hV0n6C5guYJmi/ofkEPCFog6EFBDwl6WNAjgh4V9JigxwUtFLRI0BOCnhT0lKDFgp4W9IygZwUtEbRU0HOCnhf0gqAXBb0k6GVBywS9IuhVQa8JWi7odUErBL0haKWgNwWtEvSWoLcFrRa0RtA7gt4VtFbQOkHrBb0n6H1BGwR9IGijoE2CPhS0WdAWQR8J+ljQJ4K2Ctom6FNBnwn6XNB2QV8I+jLmfOzmBy5vJjp3YURq+UO/6RhiZT3CtfNkpLgl2PVx5vs5EZoelkPffKBLOOp1E215rTAr6+G8J5fsx55S1sJwnpYyZEjnGweNTRmd0WrMsLTRg4YP06e2Gl5N8VA/6jnfz62ZIg+ch2nvqb/Lo/Fc2LmuhAAHvWKy28EX4GFpB3YDviMm8LEy4Edw3NrFpcvsC/DQ5f1K8523iyvAMaWTpEGxx90Zgxf8VHrvdDkJ+AI7stjUF+Dh1q9DXhNDY1tkv8Xqtvga4mKXFh9B9TAQaYCTmrK7YrJfNAT52l8jJoxvtLHsxLjY2IQ4+bnEdJ8dn54Wmxgbm54a70vzpaTFZiTF20mZ8bHxcWnpaalizBQ705eZkpaUmXhWLreq5TdE1fJbr1riOulbgmr5neHVUur9HVG1xG6Vd4Gs2OPuRp6gchLKMZ1VGPuG9jWI0AEzSe8i6gyw/f49Q+j1PVEx2eMVE1wn7SEoJnsNLyZS773MoNdehtDrWobQ6weIi33BCr1+cECvfS5Arx8QE8Z+htBrP1G1POBVS1wnHSColj8aXi2l3j8ygV77QFbscX8igF4/uQC9rkWEDphJeh8T6HWQIfQ6SFRMfvaKCa6TfiYoJocMLyZS70PMoNchhtCrL0PodRji4kiwQq/DDuh1xAXodRgxYfzCEHr9QlQtj3rVEtdJRwmq5a+GV0up969MoNcRkBV73N8IoNdvLkCvvojQATNJH2ECvX5nCL1+Jyomx7xiguukYwTF5A/Di4nU+w9m0OsPhtArhSH0+hPi4niwQq8/HdDruAvQ60/EhPEXQ+j1F1G1POFVS1wnnSColn8bXi2l3n8zgV7HQVbscf8hgF7/uAC9UhChA2aSPs4Eep1kCL1OEhWTU14xwXXSKYJictrwYiL1Ps0Mep1mCL1SGUIvKy/YIu/5t4IKekkD6NBLGoIaeslrqrECTRgheflBL11mX4CHLm+oFsRetQxwTOmk0Lz44+ZGDH4qvXPnRfcRCfTKBbJijxuGPEHlJJRjUkOvVETogJmkc+XFjSN1YPs9PC+e/dwqJuFExSSPV0xwnZSHoJhEGF5MpN4RRMVEHZQ29QV4uAW90hhCr0iIi6hghV6RDugV5QL0ikRMGNEMoVc0UbWM8aolrpNiCKplXsOrpdQ7LxPoFQWyYo+bjwB65XMBeqUhQi/MJB3FBHrlZwi98hMVkwJeMcF1UgGCYlLQ8GIi9S7IDHoVZAi9vmQIvQpBXBQOVuhVyAG9CrsAvQohJowiDKFXEaJqWdSrlrhOKkpQLYsZXi2l3sWYQK/CICv2uMUJoFdxF6DXl4jQCzNJF85LG0e+wI5zP4SPHUclDNdbPjymBMH8WWD4Q7DlQ1go9H6Q6Olg2A0Yon/sBwuaHeNViGL8EcNjvA9RjD/KJMYR/WM/aniMVyaK8YWGx3g6UYwvYhLjiP6xFxke47KHLOESLvEFdtjHY/jImouRXaNclDXg7dgWTW56yvB52o8oJy9mkpMR/WMvNtzX1xH5+lmXfG0QzrUxdZb+kIu8ahFYYoFT1tnHF0m+D/gR4FGCSgo/lgJfyr9VTx7sB5+5Dvj1wPsDPw5c1pEzYwEX6lilxXkZbUz1cMVP4G+2At8G/FPgnwH/HLj8ylpZMU45bawRMFZpuF46fDYDeCbwAcAHAh8EfDDwG4APAT4U+DDgw4GPAD4S+I3ARwEfDXwM8LHAxwEfD/wm4BOATwR+M/BbgN8KfBLwycCnAJ8KfBrw24DfDnw68DuA3wl8BvC7gN8NfCbwWcBnA58D/B7g9wK/D/hc4POAzwd+P/AHgC8A/iDwh4A/DPwR4I8Cfwz448AXAl8E/AngTwJ/Cvhi4E8Dfwb4s8CXAF8K/DngzwN/AfiLwF8C/jLwZcBfAf4q8NeALwf+OvAVwN8AvhL4m8BXAX8L+NvAVwNfA/wd4O8CXwt8HfD1wN8D/j7wDcA/AL4R+CbgHwLfDHwL8I+Afwy8LMyz7fD6C+C1BJUX/1dBm5tqXbs3fKYk/G154IUEVRTnlbReTh7YdaRyztewfY6xXLs5WJno5mAV7+YgrpOqENwcrGr4zUGpd1VmW2mqEm6lwQYPcRGiMEThjRcvxisQTeuvAMe2nW/o9q0GsVY9WLfnSAOs1pStrgWzUyCsa1dDTEI1LjJWYkJGamZCfFyKLz4zVYzTMDMjLiU2yc5MjBPDx8XbqSkZvvT41ISG8Q0TMxN8blXgGkQVuKZXgXGdVJOgAtcyvAJLvWsxWQKtDrJij7uUaHko0O04TjkxY6k2XlKylyIvNckkJuVrCmNix7zqirDj6HnDl1dV94at9wsuzZ9AITdmI1IdcawXDc0/jsNGjG8bMWZsKvthz5M6DJeP6hA1r3W95hXXSXUJmtd6hjevUu96TPYalCCS1a1vY1UPIBFkZj3S/IhLstxTH+ztu4zlnmZ+bOdc7mlmXXq5x984l1zuoQg2pLHOdeT1855XNgSM2tTKemB3HIh62D7EZGbjTYZMZU+bEPFIO1YnQM6vmLWhM1uXJPWuT6D3q4ZvZJV6+wj0fs1QpOIsMJh5Q4/xQO23nAnSQ4xvGzFm7OVMNnLVR6w1sYixLMegqC2xeWlyGKavKVYRJxOsIr7JYBUxhmAVcZWZq4jZ5IxDnI+IvrZXGR43cr7MJZgvqxnMl7wE82UNk/kSjzhfEH1tr2EwX54mmC9rGcyXfATzZR2T+dIAcb4g+tpex2C+rCSYL+8zmC/5CebLBibzpSHifEH0tY1pP7lovdk6f6dM9qCyrspc0ZB403tCXpo4wJYzETEOpL23WOfXBaQNEontnIS4ZuDW3eEkorvDV3h3h3GddAXB3eErDb87LPW+ktHdYQpZvS8YnD0sPweWzLp9G4EPG1/GHeeK2t9d6I5zRevSd5z9jfN/ccdZGrOCZrjGebNnXpPvODdGTJBXEdj3qsuwZ6ByN0G0p6H7D8nu4DYiuKuyiYHejQn0/tBwFC/1bkKg92Ymd5wR49JG9LVNZT9sPyczRI/JROixqYcecZ3UlAA9NjMcPUq9mzFCj8089MgePTYHH7bw0GPOD2Wo5g702IIZemyBmCBbEti3pQvosZWHHnOMopoToIlPGOjdgkDvrQzQYysCvbcxQY+IcWkj+trGtJ8s+lus7Ae2f7Bjs0Ve82W8mugeN/qEbI1YELkGVGsGAdUGW0ZsAeXachuCirGdScW4GrG7bos4Kbcz6DTaEsRNu7y4lXKzlf3AtCuFbdsxSGztqSplCHJAlUCc4B0YfAWLYlJ2NPwrWFLvigR6f2l4EpaTsAOB3juYbPnthDgfEX1t7yjIpoidu1GFHZsdGRSxTlRFDHtCdmay97oL8t7rj6zzDYG0QRfivdddGd4970p097ybd/cc10ndCO6edzf87rnUuzuXu+fRNLJe6Je5KGxCNHaWu9M9wEY9g+7udDT+3dMejrvTPd24O42nh90TMQH1Irg73Stv1kDS7Rjw0kL0Wf9hj/u16XdXo7PGKda4u5g8ig/RP/YuJvtKezPsjHsTdcZ9vM4Y10l9CDrjawzvjKXe1zDqjK/xOmN/R5bO+FqwUV+vM875oQx1raMz7susM+6LmID6EXTG/Yg742sJOsTvGHTGfQn03s2kM0b0j70b+SbKR1b2A9um2Hm1L4ObKNdxuYlyPfKeOY4BdT2DgOpv+p45uebTnyDL72WyZ+46xM4mBXFS7jV9z5zoDlII4ibV2zNnpzJIbGlUlRJ7X0064qQ0+aeNL+ToQO2XwXCxNINosTTTWyzFdVImwWLpAMMXS6XeAxgtlg7gu1hqU46tyz8QbDTIWyzN+aEMNdCxWDqI2WLpIMQENJhgsXQw8WLpQAJYsI/BYukgAr33M4HRmPMH0df2fiZd9g0Mu+wbiLrsIV6XjeukIQRd9lDDu2yp91BGXfZQr8v2O7Yu/zCw0XCvy875oQw1zNFlD2fWZQ9HTEAjCLrsEcRd9jCCbvMnBl32cAK9DwZhl43oa/ugt70hSz7yBXhQyTiSy/aGG73tDfaNDAJqlOnbG+Ra1CiCinGYScUYidgljUaclIcZbG8YTRA3Y7ztDfYYBoltLJftDeMQJ6XJT6K9kKMDtd94hguv44kWXm/yFl5xnXQTwcLrBMMXXqXeExgtvE7gu/AaSzh2loXXiWCjm72F15wfylATHQuvNzNbeL0ZMQHdQrDwegvxwutEAljwC4OF15sJ9D7KA0bHYs4fRF/bR5l02bcy7LJvJeqyJ3ldNq6TJhF02ZMN77Kl3pMZddmTvS7b35Gly54CNprqddk5P5Shpji67KnMuuypiAloGkGXPY24y55C0G3+zqDLnkqg97Eg7LIRfW0f87Y3ZMlHvgAPKhlv47K94XZve4N9O4OAmm769ga5FjWdoGIcZ7K94TbELukOxEl5nMH2hjsI4uZOb3uDfSeDxDaDy/aGuxAn5VrElnAdk4XXuxkuvN5NtPA601t4xXXSTIKF11mGL7xKvWcxWnidxXfhNY5w7CwLr7PBRnO8hdecH8pQsx0Lr3OYLbzOQUxA9xAsvN5DvPA6mwAWnGCw8DqHQO+/ecDoOMz5g+hr+28mXfa9DLvse4m67Pu8LhvXSfcRdNlzDe+ypd5zGXXZc70u29+RpcueBzaa73XZOT+UoeY5uuz5zLrs+YgJ6H6CLvt+4i57HkG3eYpBlz2fQO/TQdhlI/raPu1tb8iSj3wBHlQyPsBle8MCb3uDvYBBQD1o+vYGuRb1IEHFCCnEomJkmfGB6vwQ4qTEth9Fx/0QQdw87G1vsB9mkNge4bK94VHESfk+Yku4gcnC62N5ecj5OKKf5ZrJx9b5tQtpg8fzWhal/AsZLnAvJFrgXuQtcOM6aRHBAvcThi9wS72fYLTATSHr/9sTk58EGz3lLXDn/FCGetKxwP0UswXupxAT0GKCBe7FxAvcTxLAr9zEsBND76cI9A4jWq4IQZ4/iP6xqXTG9s3TDDvjp4k642e8zhjXSc8QdMbPGt4ZS72fZdQZP+t1xv6OLJ3xErDRUq8zzvmhDLXE0RkvZdYZL0VMQM8RdMbPEXfGSwg6xAgGnfFSAr0jmXTGiP6xMXWWCfdjK/uBbVPsvLqUwU2o57ls13gBebsGx4B6gUFAvWj6dg255vMiQZaPYbJd43nEzuYlxEkZw2C7xksEcfMy8naN9Vb2A9OuFLZ9mUFiW8Zlu8YriJNyLOJ2jXFMtmu8ynCx9FWixdLXvMVSXCe9RrBYutzwxVKp93JGi6XL+S6WuvaU49fBRiu8xdKcH8pQrzsWS1cwWyxdgZiA3iBYLH2DeLH0dQJYkI/BYukKAr3zM4HRmPMH0dd2fiZbElYy7LJXEnXZb3pdNq6T3iToslcZ3mVLvVcx6rJXeV2237F1+d8CG73tddk5P5Sh3nJ02W8z67LfRkxAqwm67NXEXfZbBN1mIQZd9tsEehcOwi4b0dd2YW97Q5Z85AvwoJJxDZftDe942xvsdxgE1Lumb2+Qa1HvElSMYkwqxhrELmkt4qQsxmB7w1qCuFnnbW+w1zFIbOu5bG94D3FSTkDc3jCRyfaG9xkuvL5PtPC6wVt4xXXSBoKF1w8MX3iVen/AaOH1A74Lr6495Xgj2GiTt/Ca80MZaqNj4XUTs4XXTYgJ6EOChdcPiRdeNxLAghIMFl43EehdkgeMRn3KMaKv7ZJMtjdsZthlbybqsrd4XTauk7YQdNkfGd5lS70/YtRlf+R12f6OLF32x2CjT7wuO+eHMtTHji77E2Zd9ieICWgrQZe9lbjL/pig2yzDoMv+hEDvskHYZSP62i7rbW/Iko98AR5UMm7jsr3hU297g/0pg4D6zPTtDXIt6jOCilGByfaGbYhd0ueIk7ICg+0NnxPEzXZve4O9nUFi+4LL9oYvESflrYjbGyYx2d6wg+HC6w6ihdevvIVXXCd9RbDwutPwhVep905GC687+S68uvaU46/BRru8hdecH8pQXzsWXncxW3jdhZiAviFYeP2GeOH1awJYUInBwusuAr0r84DRqE85RvS1XZnJ9oZvGXbZ3xJ12d95XTauk74j6LJ3G95lS713M+qyd3tdtr8jS5f9Pdhoj9dl5/xQhvre0WXvYdZl70FMQHsJuuy9xF329wTdZjUGXfYeAr2rB2GXjehru7q3vSFLPvIFeFDJ+AOX7Q37vO0N9j4GAbXf9O0Nci1qP0HFqMVke8MPiF3SAcRJWYvB9oYDBHHzo7e9wf6RQWL7icv2hoOIk3Iq4vaGaQXNnuDVxBjpBBO8juGJrVeMZaUR6F3XpYIYqJw/I84XRF/bdQ2PGzlfxhHEjY/BfBlLoLfNZL4cQpwviL62bQbz5S6CuIlnMF9mEOjdgMl8OYw4XxB9bTdgMF8eJYibRAbz5RECvZOYzJcjiPMF0dd2EoP5sowgbhoxmC+vEOjdmMl8+QVxviD62m7MYL6sJ4ibZAbz5T0CvZsymS9HEecLoq/tpgzmyxcEcdOCwXz5kkDvlkzmy6+I8wXR13ZLBvPlJ4K4ac1gvhwk0LsNk/nyG+J8QfS1TWU/bD//npeHnMeYyPkHEzn/zGt2XrtHjHE/gd7tDc/nD4kxXibQuwOTfH4cMZ8j+truwCSf/8Uk/5xgIuffTOT8h4mcJ5nIeYqJnKeZyCm/oMNBzlxM5AxhImcoEzlzM5EzjImc4UzkzMNEzggmckYykTOKiZzRTOSMYSJnXiZy5mMiZ34mchZgImdBJnIWYiJnYSZyFmEiZ1EmchZjImdxJnKWYCJnSSZylmIiZ2kmcpZhImdZJnKWYyJneSZyVmAiZ0UmclZiImdlJnJWYSJnVSZyVmMiZ3UmctZgImdNJnLWYiJnbSZy1mEiZ10mctZjImd9JnL6mMhpM5EzlomccUzkjGciZwMmcjZkImcCEzkTmciZxETOK5jIeSUTORsxkbMxEzmvYiJnEyZyJjORsykTOZsxkbM5EzlbMJGzJRM5WzGR82pkObG/D1Y8muZ3Mjsz+AHgnwn07sLke3Ct8eLSRvS13cXwuJHzheJ3MrszmC+HCPTuwWS+tEGcL4i+tnswmC8Uv5PZm8F8OUygdx8m86Ut4nxB9LXdh8F8ofidzL4M5ssRAr37MZkv7RDnC6Kv7X4M5gvF70X2ZzBffiHQO4XJfGmPOF8QfW2nMJgvFL8Xmc5gvhwl0DuDyXzpgDhfEH1tZzCYLxS/FzmQwXz5lUDvQUzmS0fE+YLoa3sQg/lC8XuRQxjMl98I9B7KZL50QpwviL62hzL5XbXOTO5ndWEiZ1cmcnZjImd3JnL2YCJnTyZy9iKSM8Qhpy+ww86FqHNvJjqHIOrch4nOoYg6X8NE59yIOl/LROcwRJ37MtE5HFHnfkx0zoOo83VMdG6NqPP1THT+HfFB9f2Z6HwMUecUJjr/gahzKhOd/0TUOY2JzscRdU5novNfiDpnMNH5BKLOmUx0/htR5wFMdP4HUeeBTHQ+iajzICY6n0LUeTATnU8j6nwDE5315yEEfO+Nyxogos5DuawBIuo8jMsaIKLOw7msASLqPILLGiCiziO5rAEi6nwjlzVARJ1HMdE5AlHn0Ux0jkTUeQwTnaMQdR7LROdoRJ3HMdE5BlHn8Ux0zouo801MdM6HqPMEJjrnR9R5IhOdCyDqfDMTnQsi6nwLE50LIep8KxOdCyPqPImJzkUQdZ7MROeiiDpPYaJzMUSdpzLRuTiiztOY6FwCUefbmOhcElHn25noXApR5+lMdC6NqPMdTHQug6jznUx0Louo8wwmOpdD1PkuJjqXR9T5biY6V0DUeSYTnSsi6jyLic6VEHWezUTnyog6z2GicxVEne9honNVRJ3vZaJzNUSd72Oic3VEnecy0bkGos7zmOhcE1Hn+Ux0roWo8/1MdK6NqPMDTHSug6jzAiY610XU+UEmOtdD1PkhJjrXR9T5YSY6+xB1foSJzjaizo8y0TkWUefHmOgch6jz40x0jkfUeSETnRsg6ryIic4NEXV+gonOCYg6P8lE50REnZ9ionMSos6Lmeh8BaLOTzPR+UpEnZ9honMjRJ2fZaJzY0SdlzDR+SpEnZcy0bkJos7PMdE5GVHn55no3BRR5xeY6NwMUecXmejcHFHnl5jo3AJR55eZ6NwSUedlTHRuhajzK0x0vhpR51eZ6NwaUefXmOjcBlHn5Ux0bouo8+tMdG6HqPMKJjq3R9T5DSY6d0DUeSUTnTsi6vwmE507Ieq8ionOnRF1fouJzl0QdX6bic5dEXVezUTnbog6r2Gic3dEnd9honMPRJ3fZaJzT0Sd1zLRuReizuuY6Bxh4em8nonOkYg6v8dE5yhEnd9nonM0os4bmOgcg6jzB0x0zouo80YmOudD1HkTE53zI+r8IROdCyDqvJmJzgURdd7CROdCiDp/xETnwog6f8xE5yKIOn/CROeiiDpvZaJzMUSdtyHqXAzGyQU6y+dgyudCyuckyucGyufoSUwoMZLEDLKHlj2l7LFkzyFrsKxJMkfLnCXnsIxp6eNi8L48igsqIaikoFKCSgsqI6isoHKCyguqIKiioEqCKguqIqiqoGqCqguaCGPJ56jK54rK52zK507K5zDK5xLK5/TJ59bJ57jJ55rJ53zJ517J50DJ5yLJ5wTJ5+bI58jI56rI54zI527I51DI5zLI5xTI3+2Xv2Mvf9dd/s65/N1v+TvY8neh5e8ky98Nlr+jK39XVv7OqvzdUfk7nPJ3KeXvNMrfLZS/4yd/107+zpv83TP5O2Dyd7Hk70TJ302SvyMkf1dH/s6M/N0V+Tsk8nc55O9UyN9tkL9jIL/XL7/nLr/3Lb8HLb8XLL8nK783Kr9HKb9XKL9nJ793Jr+HJb+XJL+nI7+3Ir/HIb/XIPf5y33vch+43Bct9wnLfbNyH6ncVyn3Gcp9d3IfmtyXJfcpyX07ch+L3Nch9znI+/7yPri8Lyzvk8r7hvI+mryvJO+zyPsOch1erkvLdVq5binX8eS6llznkesech1A4mKJEyVukjhC9tWyz5R9l+xDZF2WdUrmbZnH5LyWcZ5bi88acP4UvFkYXrcZlp4xvsLwMaMrDM+skDp8zLD0UfrHq4f9q4/XCv9XH+986Y//D0Osff1DehAA", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - }, - { - "name": "is_valid", - "functionType": "secret", - "isInternal": false, - "parameters": [ - { - "name": "message_hash", - "type": { - "kind": "field" - }, - "visibility": "private" - } - ], - "returnTypes": [], - "bytecode": "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", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - }, - { - "name": "is_valid_public", - "functionType": "open", - "isInternal": false, - "parameters": [ - { - "name": "message_hash", - "type": { - "kind": "field" - }, - "visibility": "private" - } - ], - "returnTypes": [ - { - "kind": "struct", - "path": "aztec::abi::PublicCircuitPublicInputs", - "fields": [ - { - "name": "call_context", - "type": { - "kind": "struct", - "path": "aztec::abi::CallContext", - "fields": [ - { - "name": "msg_sender", - "type": { - "kind": "field" - } - }, - { - "name": "storage_contract_address", - "type": { - "kind": "field" - } - }, - { - "name": "portal_contract_address", - "type": { - "kind": "field" - } - }, - { - "name": "function_selector", - "type": { - "kind": "field" - } - }, - { - "name": "is_delegate_call", - "type": { - "kind": "boolean" - } - }, - { - "name": "is_static_call", - "type": { - "kind": "boolean" - } - }, - { - "name": "is_contract_deployment", - "type": { - "kind": "boolean" - } - } - ] - } - }, - { - "name": "args_hash", - "type": { - "kind": "field" - } - }, - { - "name": "return_values", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "field" - } - } - }, - { - "name": "contract_storage_update_requests", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "struct", - "path": "aztec::abi::ContractStorageUpdateRequest", - "fields": [ - { - "name": "storage_slot", - "type": { - "kind": "field" - } - }, - { - "name": "old_value", - "type": { - "kind": "field" - } - }, - { - "name": "new_value", - "type": { - "kind": "field" - } - } - ] - } - } - }, - { - "name": "contract_storage_read", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "struct", - "path": "aztec::abi::ContractStorageRead", - "fields": [ - { - "name": "storage_slot", - "type": { - "kind": "field" - } - }, - { - "name": "value", - "type": { - "kind": "field" - } - } - ] - } - } - }, - { - "name": "public_call_stack", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "field" - } - } - }, - { - "name": "new_commitments", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "field" - } - } - }, - { - "name": "new_nullifiers", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "field" - } - } - }, - { - "name": "new_l2_to_l1_msgs", - "type": { - "kind": "array", - "length": 2, - "type": { - "kind": "field" - } - } - }, - { - "name": "unencrypted_logs_hash", - "type": { - "kind": "array", - "length": 2, - "type": { - "kind": "field" - } - } - }, - { - "name": "unencrypted_log_preimages_length", - "type": { - "kind": "field" - } - }, - { - "name": "block_data", - "type": { - "kind": "struct", - "path": "aztec::abi::HistoricBlockData", - "fields": [ - { - "name": "private_data_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "nullifier_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "contract_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "l1_to_l2_messages_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "blocks_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "public_data_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "global_variables_hash", - "type": { - "kind": "field" - } - } - ] - } - }, - { - "name": "prover_address", - "type": { - "kind": "field" - } - } - ] - } - ], - "bytecode": "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", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - }, - { - "name": "set_is_valid_storage", - "functionType": "open", - "isInternal": true, - "parameters": [ - { - "name": "message_hash", - "type": { - "kind": "field" - }, - "visibility": "private" - }, - { - "name": "value", - "type": { - "kind": "boolean" - }, - "visibility": "private" - } - ], - "returnTypes": [ - { - "kind": "struct", - "path": "aztec::abi::PublicCircuitPublicInputs", - "fields": [ - { - "name": "call_context", - "type": { - "kind": "struct", - "path": "aztec::abi::CallContext", - "fields": [ - { - "name": "msg_sender", - "type": { - "kind": "field" - } - }, - { - "name": "storage_contract_address", - "type": { - "kind": "field" - } - }, - { - "name": "portal_contract_address", - "type": { - "kind": "field" - } - }, - { - "name": "function_selector", - "type": { - "kind": "field" - } - }, - { - "name": "is_delegate_call", - "type": { - "kind": "boolean" - } - }, - { - "name": "is_static_call", - "type": { - "kind": "boolean" - } - }, - { - "name": "is_contract_deployment", - "type": { - "kind": "boolean" - } - } - ] - } - }, - { - "name": "args_hash", - "type": { - "kind": "field" - } - }, - { - "name": "return_values", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "field" - } - } - }, - { - "name": "contract_storage_update_requests", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "struct", - "path": "aztec::abi::ContractStorageUpdateRequest", - "fields": [ - { - "name": "storage_slot", - "type": { - "kind": "field" - } - }, - { - "name": "old_value", - "type": { - "kind": "field" - } - }, - { - "name": "new_value", - "type": { - "kind": "field" - } - } - ] - } - } - }, - { - "name": "contract_storage_read", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "struct", - "path": "aztec::abi::ContractStorageRead", - "fields": [ - { - "name": "storage_slot", - "type": { - "kind": "field" - } - }, - { - "name": "value", - "type": { - "kind": "field" - } - } - ] - } - } - }, - { - "name": "public_call_stack", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "field" - } - } - }, - { - "name": "new_commitments", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "field" - } - } - }, - { - "name": "new_nullifiers", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "field" - } - } - }, - { - "name": "new_l2_to_l1_msgs", - "type": { - "kind": "array", - "length": 2, - "type": { - "kind": "field" - } - } - }, - { - "name": "unencrypted_logs_hash", - "type": { - "kind": "array", - "length": 2, - "type": { - "kind": "field" - } - } - }, - { - "name": "unencrypted_log_preimages_length", - "type": { - "kind": "field" - } - }, - { - "name": "block_data", - "type": { - "kind": "struct", - "path": "aztec::abi::HistoricBlockData", - "fields": [ - { - "name": "private_data_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "nullifier_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "contract_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "l1_to_l2_messages_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "blocks_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "public_data_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "global_variables_hash", - "type": { - "kind": "field" - } - } - ] - } - }, - { - "name": "prover_address", - "type": { - "kind": "field" - } - } - ] - } - ], - "bytecode": "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", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - } - ], - "events": [] -} diff --git a/yarn-project/aztec.js/src/artifacts/schnorr_account_contract.json b/yarn-project/aztec.js/src/artifacts/schnorr_account_contract.json deleted file mode 100644 index c3957122241..00000000000 --- a/yarn-project/aztec.js/src/artifacts/schnorr_account_contract.json +++ /dev/null @@ -1,687 +0,0 @@ -{ - "name": "SchnorrAccount", - "functions": [ - { - "name": "compute_note_hash_and_nullifier", - "functionType": "unconstrained", - "isInternal": false, - "parameters": [ - { - "name": "contract_address", - "type": { - "kind": "field" - }, - "visibility": "private" - }, - { - "name": "nonce", - "type": { - "kind": "field" - }, - "visibility": "private" - }, - { - "name": "storage_slot", - "type": { - "kind": "field" - }, - "visibility": "private" - }, - { - "name": "preimage", - "type": { - "kind": "array", - "length": 3, - "type": { - "kind": "field" - } - }, - "visibility": "private" - } - ], - "returnTypes": [ - { - "kind": "array", - "length": 4, - "type": { - "kind": "field" - } - } - ], - "bytecode": "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", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - }, - { - "name": "constructor", - "functionType": "secret", - "isInternal": false, - "parameters": [ - { - "name": "signing_pub_key_x", - "type": { - "kind": "field" - }, - "visibility": "public" - }, - { - "name": "signing_pub_key_y", - "type": { - "kind": "field" - }, - "visibility": "public" - } - ], - "returnTypes": [], - "bytecode": "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", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - }, - { - "name": "entrypoint", - "functionType": "secret", - "isInternal": false, - "parameters": [ - { - "name": "payload", - "type": { - "kind": "struct", - "path": "authwit::entrypoint::EntrypointPayload", - "fields": [ - { - "name": "function_calls", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "struct", - "path": "authwit::entrypoint::FunctionCall", - "fields": [ - { - "name": "args_hash", - "type": { - "kind": "field" - } - }, - { - "name": "function_selector", - "type": { - "kind": "field" - } - }, - { - "name": "target_address", - "type": { - "kind": "field" - } - }, - { - "name": "is_public", - "type": { - "kind": "boolean" - } - } - ] - } - } - }, - { - "name": "nonce", - "type": { - "kind": "field" - } - } - ] - }, - "visibility": "public" - } - ], - "returnTypes": [], - "bytecode": "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", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - }, - { - "name": "is_valid", - "functionType": "secret", - "isInternal": false, - "parameters": [ - { - "name": "message_hash", - "type": { - "kind": "field" - }, - "visibility": "private" - } - ], - "returnTypes": [], - "bytecode": "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", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - }, - { - "name": "is_valid_public", - "functionType": "open", - "isInternal": false, - "parameters": [ - { - "name": "message_hash", - "type": { - "kind": "field" - }, - "visibility": "private" - } - ], - "returnTypes": [ - { - "kind": "struct", - "path": "aztec::abi::PublicCircuitPublicInputs", - "fields": [ - { - "name": "call_context", - "type": { - "kind": "struct", - "path": "aztec::abi::CallContext", - "fields": [ - { - "name": "msg_sender", - "type": { - "kind": "field" - } - }, - { - "name": "storage_contract_address", - "type": { - "kind": "field" - } - }, - { - "name": "portal_contract_address", - "type": { - "kind": "field" - } - }, - { - "name": "function_selector", - "type": { - "kind": "field" - } - }, - { - "name": "is_delegate_call", - "type": { - "kind": "boolean" - } - }, - { - "name": "is_static_call", - "type": { - "kind": "boolean" - } - }, - { - "name": "is_contract_deployment", - "type": { - "kind": "boolean" - } - } - ] - } - }, - { - "name": "args_hash", - "type": { - "kind": "field" - } - }, - { - "name": "return_values", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "field" - } - } - }, - { - "name": "contract_storage_update_requests", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "struct", - "path": "aztec::abi::ContractStorageUpdateRequest", - "fields": [ - { - "name": "storage_slot", - "type": { - "kind": "field" - } - }, - { - "name": "old_value", - "type": { - "kind": "field" - } - }, - { - "name": "new_value", - "type": { - "kind": "field" - } - } - ] - } - } - }, - { - "name": "contract_storage_read", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "struct", - "path": "aztec::abi::ContractStorageRead", - "fields": [ - { - "name": "storage_slot", - "type": { - "kind": "field" - } - }, - { - "name": "value", - "type": { - "kind": "field" - } - } - ] - } - } - }, - { - "name": "public_call_stack", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "field" - } - } - }, - { - "name": "new_commitments", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "field" - } - } - }, - { - "name": "new_nullifiers", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "field" - } - } - }, - { - "name": "new_l2_to_l1_msgs", - "type": { - "kind": "array", - "length": 2, - "type": { - "kind": "field" - } - } - }, - { - "name": "unencrypted_logs_hash", - "type": { - "kind": "array", - "length": 2, - "type": { - "kind": "field" - } - } - }, - { - "name": "unencrypted_log_preimages_length", - "type": { - "kind": "field" - } - }, - { - "name": "block_data", - "type": { - "kind": "struct", - "path": "aztec::abi::HistoricBlockData", - "fields": [ - { - "name": "private_data_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "nullifier_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "contract_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "l1_to_l2_messages_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "blocks_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "public_data_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "global_variables_hash", - "type": { - "kind": "field" - } - } - ] - } - }, - { - "name": "prover_address", - "type": { - "kind": "field" - } - } - ] - } - ], - "bytecode": "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", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - }, - { - "name": "set_is_valid_storage", - "functionType": "open", - "isInternal": true, - "parameters": [ - { - "name": "message_hash", - "type": { - "kind": "field" - }, - "visibility": "private" - }, - { - "name": "value", - "type": { - "kind": "boolean" - }, - "visibility": "private" - } - ], - "returnTypes": [ - { - "kind": "struct", - "path": "aztec::abi::PublicCircuitPublicInputs", - "fields": [ - { - "name": "call_context", - "type": { - "kind": "struct", - "path": "aztec::abi::CallContext", - "fields": [ - { - "name": "msg_sender", - "type": { - "kind": "field" - } - }, - { - "name": "storage_contract_address", - "type": { - "kind": "field" - } - }, - { - "name": "portal_contract_address", - "type": { - "kind": "field" - } - }, - { - "name": "function_selector", - "type": { - "kind": "field" - } - }, - { - "name": "is_delegate_call", - "type": { - "kind": "boolean" - } - }, - { - "name": "is_static_call", - "type": { - "kind": "boolean" - } - }, - { - "name": "is_contract_deployment", - "type": { - "kind": "boolean" - } - } - ] - } - }, - { - "name": "args_hash", - "type": { - "kind": "field" - } - }, - { - "name": "return_values", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "field" - } - } - }, - { - "name": "contract_storage_update_requests", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "struct", - "path": "aztec::abi::ContractStorageUpdateRequest", - "fields": [ - { - "name": "storage_slot", - "type": { - "kind": "field" - } - }, - { - "name": "old_value", - "type": { - "kind": "field" - } - }, - { - "name": "new_value", - "type": { - "kind": "field" - } - } - ] - } - } - }, - { - "name": "contract_storage_read", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "struct", - "path": "aztec::abi::ContractStorageRead", - "fields": [ - { - "name": "storage_slot", - "type": { - "kind": "field" - } - }, - { - "name": "value", - "type": { - "kind": "field" - } - } - ] - } - } - }, - { - "name": "public_call_stack", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "field" - } - } - }, - { - "name": "new_commitments", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "field" - } - } - }, - { - "name": "new_nullifiers", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "field" - } - } - }, - { - "name": "new_l2_to_l1_msgs", - "type": { - "kind": "array", - "length": 2, - "type": { - "kind": "field" - } - } - }, - { - "name": "unencrypted_logs_hash", - "type": { - "kind": "array", - "length": 2, - "type": { - "kind": "field" - } - } - }, - { - "name": "unencrypted_log_preimages_length", - "type": { - "kind": "field" - } - }, - { - "name": "block_data", - "type": { - "kind": "struct", - "path": "aztec::abi::HistoricBlockData", - "fields": [ - { - "name": "private_data_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "nullifier_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "contract_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "l1_to_l2_messages_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "blocks_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "public_data_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "global_variables_hash", - "type": { - "kind": "field" - } - } - ] - } - }, - { - "name": "prover_address", - "type": { - "kind": "field" - } - } - ] - } - ], - "bytecode": "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", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - } - ], - "events": [] -} diff --git a/yarn-project/aztec.js/src/artifacts/schnorr_single_key_account_contract.json b/yarn-project/aztec.js/src/artifacts/schnorr_single_key_account_contract.json deleted file mode 100644 index cf5457aae8f..00000000000 --- a/yarn-project/aztec.js/src/artifacts/schnorr_single_key_account_contract.json +++ /dev/null @@ -1,622 +0,0 @@ -{ - "name": "SchnorrSingleKeyAccount", - "functions": [ - { - "name": "constructor", - "functionType": "secret", - "isInternal": false, - "parameters": [], - "returnTypes": [], - "bytecode": "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", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - }, - { - "name": "entrypoint", - "functionType": "secret", - "isInternal": false, - "parameters": [ - { - "name": "payload", - "type": { - "kind": "struct", - "path": "authwit::entrypoint::EntrypointPayload", - "fields": [ - { - "name": "function_calls", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "struct", - "path": "authwit::entrypoint::FunctionCall", - "fields": [ - { - "name": "args_hash", - "type": { - "kind": "field" - } - }, - { - "name": "function_selector", - "type": { - "kind": "field" - } - }, - { - "name": "target_address", - "type": { - "kind": "field" - } - }, - { - "name": "is_public", - "type": { - "kind": "boolean" - } - } - ] - } - } - }, - { - "name": "nonce", - "type": { - "kind": "field" - } - } - ] - }, - "visibility": "public" - } - ], - "returnTypes": [], - "bytecode": "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", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - }, - { - "name": "is_valid", - "functionType": "secret", - "isInternal": false, - "parameters": [ - { - "name": "message_hash", - "type": { - "kind": "field" - }, - "visibility": "private" - } - ], - "returnTypes": [], - "bytecode": "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", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - }, - { - "name": "is_valid_public", - "functionType": "open", - "isInternal": false, - "parameters": [ - { - "name": "message_hash", - "type": { - "kind": "field" - }, - "visibility": "private" - } - ], - "returnTypes": [ - { - "kind": "struct", - "path": "aztec::abi::PublicCircuitPublicInputs", - "fields": [ - { - "name": "call_context", - "type": { - "kind": "struct", - "path": "aztec::abi::CallContext", - "fields": [ - { - "name": "msg_sender", - "type": { - "kind": "field" - } - }, - { - "name": "storage_contract_address", - "type": { - "kind": "field" - } - }, - { - "name": "portal_contract_address", - "type": { - "kind": "field" - } - }, - { - "name": "function_selector", - "type": { - "kind": "field" - } - }, - { - "name": "is_delegate_call", - "type": { - "kind": "boolean" - } - }, - { - "name": "is_static_call", - "type": { - "kind": "boolean" - } - }, - { - "name": "is_contract_deployment", - "type": { - "kind": "boolean" - } - } - ] - } - }, - { - "name": "args_hash", - "type": { - "kind": "field" - } - }, - { - "name": "return_values", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "field" - } - } - }, - { - "name": "contract_storage_update_requests", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "struct", - "path": "aztec::abi::ContractStorageUpdateRequest", - "fields": [ - { - "name": "storage_slot", - "type": { - "kind": "field" - } - }, - { - "name": "old_value", - "type": { - "kind": "field" - } - }, - { - "name": "new_value", - "type": { - "kind": "field" - } - } - ] - } - } - }, - { - "name": "contract_storage_read", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "struct", - "path": "aztec::abi::ContractStorageRead", - "fields": [ - { - "name": "storage_slot", - "type": { - "kind": "field" - } - }, - { - "name": "value", - "type": { - "kind": "field" - } - } - ] - } - } - }, - { - "name": "public_call_stack", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "field" - } - } - }, - { - "name": "new_commitments", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "field" - } - } - }, - { - "name": "new_nullifiers", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "field" - } - } - }, - { - "name": "new_l2_to_l1_msgs", - "type": { - "kind": "array", - "length": 2, - "type": { - "kind": "field" - } - } - }, - { - "name": "unencrypted_logs_hash", - "type": { - "kind": "array", - "length": 2, - "type": { - "kind": "field" - } - } - }, - { - "name": "unencrypted_log_preimages_length", - "type": { - "kind": "field" - } - }, - { - "name": "block_data", - "type": { - "kind": "struct", - "path": "aztec::abi::HistoricBlockData", - "fields": [ - { - "name": "private_data_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "nullifier_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "contract_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "l1_to_l2_messages_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "blocks_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "public_data_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "global_variables_hash", - "type": { - "kind": "field" - } - } - ] - } - }, - { - "name": "prover_address", - "type": { - "kind": "field" - } - } - ] - } - ], - "bytecode": "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", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - }, - { - "name": "set_is_valid_storage", - "functionType": "open", - "isInternal": true, - "parameters": [ - { - "name": "message_hash", - "type": { - "kind": "field" - }, - "visibility": "private" - }, - { - "name": "value", - "type": { - "kind": "boolean" - }, - "visibility": "private" - } - ], - "returnTypes": [ - { - "kind": "struct", - "path": "aztec::abi::PublicCircuitPublicInputs", - "fields": [ - { - "name": "call_context", - "type": { - "kind": "struct", - "path": "aztec::abi::CallContext", - "fields": [ - { - "name": "msg_sender", - "type": { - "kind": "field" - } - }, - { - "name": "storage_contract_address", - "type": { - "kind": "field" - } - }, - { - "name": "portal_contract_address", - "type": { - "kind": "field" - } - }, - { - "name": "function_selector", - "type": { - "kind": "field" - } - }, - { - "name": "is_delegate_call", - "type": { - "kind": "boolean" - } - }, - { - "name": "is_static_call", - "type": { - "kind": "boolean" - } - }, - { - "name": "is_contract_deployment", - "type": { - "kind": "boolean" - } - } - ] - } - }, - { - "name": "args_hash", - "type": { - "kind": "field" - } - }, - { - "name": "return_values", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "field" - } - } - }, - { - "name": "contract_storage_update_requests", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "struct", - "path": "aztec::abi::ContractStorageUpdateRequest", - "fields": [ - { - "name": "storage_slot", - "type": { - "kind": "field" - } - }, - { - "name": "old_value", - "type": { - "kind": "field" - } - }, - { - "name": "new_value", - "type": { - "kind": "field" - } - } - ] - } - } - }, - { - "name": "contract_storage_read", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "struct", - "path": "aztec::abi::ContractStorageRead", - "fields": [ - { - "name": "storage_slot", - "type": { - "kind": "field" - } - }, - { - "name": "value", - "type": { - "kind": "field" - } - } - ] - } - } - }, - { - "name": "public_call_stack", - "type": { - "kind": "array", - "length": 4, - "type": { - "kind": "field" - } - } - }, - { - "name": "new_commitments", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "field" - } - } - }, - { - "name": "new_nullifiers", - "type": { - "kind": "array", - "length": 16, - "type": { - "kind": "field" - } - } - }, - { - "name": "new_l2_to_l1_msgs", - "type": { - "kind": "array", - "length": 2, - "type": { - "kind": "field" - } - } - }, - { - "name": "unencrypted_logs_hash", - "type": { - "kind": "array", - "length": 2, - "type": { - "kind": "field" - } - } - }, - { - "name": "unencrypted_log_preimages_length", - "type": { - "kind": "field" - } - }, - { - "name": "block_data", - "type": { - "kind": "struct", - "path": "aztec::abi::HistoricBlockData", - "fields": [ - { - "name": "private_data_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "nullifier_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "contract_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "l1_to_l2_messages_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "blocks_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "public_data_tree_root", - "type": { - "kind": "field" - } - }, - { - "name": "global_variables_hash", - "type": { - "kind": "field" - } - } - ] - } - }, - { - "name": "prover_address", - "type": { - "kind": "field" - } - } - ] - } - ], - "bytecode": "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", - "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" - } - ], - "events": [] -} From f6dc990a51f0759e44787055e596557f5c1c4b76 Mon Sep 17 00:00:00 2001 From: ludamad Date: Mon, 16 Oct 2023 20:29:39 +0000 Subject: [PATCH 3/6] fix: msgpack formatting --- .../src/msgpack-c/include/msgpack/assert.hpp | 7 +- .../src/msgpack-c/include/msgpack/type.hpp | 12 +- .../v1/adaptor/boost/msgpack_variant.hpp | 698 +++-- .../msgpack/v1/adaptor/cpp11/chrono.hpp | 562 ++-- .../msgpack/v1/adaptor/cpp17/variant.hpp | 194 +- .../include/msgpack/v1/detail/cpp03_zone.hpp | 1336 ++++---- .../include/msgpack/v1/detail/cpp11_zone.hpp | 525 ++-- .../include/msgpack/v1/object_fwd.hpp | 378 +-- .../src/msgpack-c/include/msgpack/v1/pack.hpp | 2716 +++++++++-------- .../include/msgpack/v2/object_fwd.hpp | 143 +- .../include/msgpack/v3/object_fwd.hpp | 62 +- .../include/msgpack/version_master.hpp | 4 +- .../cpp/src/msgpack-c/test/boost_variant.cpp | 94 +- .../cpp/src/msgpack-c/test/msgpack_cpp11.cpp | 786 +++-- .../cpp/src/msgpack-c/test/msgpack_cpp17.cpp | 138 +- 15 files changed, 3876 insertions(+), 3779 deletions(-) diff --git a/barretenberg/cpp/src/msgpack-c/include/msgpack/assert.hpp b/barretenberg/cpp/src/msgpack-c/include/msgpack/assert.hpp index 77feae6ec98..0b2d0bcd0c1 100644 --- a/barretenberg/cpp/src/msgpack-c/include/msgpack/assert.hpp +++ b/barretenberg/cpp/src/msgpack-c/include/msgpack/assert.hpp @@ -16,7 +16,7 @@ #include #define MSGPACK_ASSERT assert -#else // defined(MSGPACK_NO_BOOST) +#else // defined(MSGPACK_NO_BOOST) #include #define MSGPACK_ASSERT BOOST_ASSERT @@ -25,8 +25,7 @@ #ifdef __wasm__ struct AbortStream { - void operator<< [[noreturn]] (const auto& error) - { + void operator<< [[noreturn]] (const auto& error) { info(error.what()); std::abort(); } @@ -34,7 +33,7 @@ struct AbortStream { #define THROW AbortStream() << #define try if (true) #define catch(...) if (false) -#define RETHROW +#define RETHROW #else #define THROW throw #define RETHROW THROW diff --git a/barretenberg/cpp/src/msgpack-c/include/msgpack/type.hpp b/barretenberg/cpp/src/msgpack-c/include/msgpack/type.hpp index 0e9aa221bd2..1ab49745fb1 100644 --- a/barretenberg/cpp/src/msgpack-c/include/msgpack/type.hpp +++ b/barretenberg/cpp/src/msgpack-c/include/msgpack/type.hpp @@ -1,37 +1,37 @@ +#include "cpp_config.hpp" #include "adaptor/array_ref.hpp" #include "adaptor/bool.hpp" #include "adaptor/carray.hpp" #include "adaptor/char_ptr.hpp" -#include "adaptor/complex.hpp" -#include "adaptor/define.hpp" #include "adaptor/deque.hpp" #include "adaptor/ext.hpp" #include "adaptor/fixint.hpp" #include "adaptor/float.hpp" #include "adaptor/int.hpp" +#include "adaptor/complex.hpp" #include "adaptor/list.hpp" #include "adaptor/map.hpp" -#include "adaptor/msgpack_tuple.hpp" #include "adaptor/nil.hpp" #include "adaptor/pair.hpp" #include "adaptor/raw.hpp" +#include "adaptor/v4raw.hpp" #include "adaptor/set.hpp" #include "adaptor/size_equal_only.hpp" #include "adaptor/string.hpp" -#include "adaptor/v4raw.hpp" #include "adaptor/vector.hpp" #include "adaptor/vector_bool.hpp" #include "adaptor/vector_char.hpp" #include "adaptor/vector_unsigned_char.hpp" #include "adaptor/wstring.hpp" -#include "cpp_config.hpp" +#include "adaptor/msgpack_tuple.hpp" +#include "adaptor/define.hpp" #if defined(MSGPACK_USE_CPP03) #include "adaptor/tr1/unordered_map.hpp" #include "adaptor/tr1/unordered_set.hpp" -#else // defined(MSGPACK_USE_CPP03) +#else // defined(MSGPACK_USE_CPP03) #include "adaptor/cpp11/array.hpp" #include "adaptor/cpp11/array_char.hpp" diff --git a/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/adaptor/boost/msgpack_variant.hpp b/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/adaptor/boost/msgpack_variant.hpp index 531ea3c1d2c..509183ff8b0 100644 --- a/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/adaptor/boost/msgpack_variant.hpp +++ b/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/adaptor/boost/msgpack_variant.hpp @@ -12,19 +12,20 @@ #include "msgpack/v1/adaptor/boost/msgpack_variant_decl.hpp" -#include "msgpack/adaptor/boost/string_ref.hpp" #include "msgpack/adaptor/check_container_size.hpp" +#include "msgpack/adaptor/boost/string_ref.hpp" +#include "msgpack/adaptor/nil.hpp" #include "msgpack/adaptor/bool.hpp" -#include "msgpack/adaptor/ext.hpp" -#include "msgpack/adaptor/float.hpp" #include "msgpack/adaptor/int.hpp" -#include "msgpack/adaptor/map.hpp" -#include "msgpack/adaptor/nil.hpp" -#include "msgpack/adaptor/raw.hpp" +#include "msgpack/adaptor/float.hpp" #include "msgpack/adaptor/string.hpp" -#include "msgpack/adaptor/vector.hpp" #include "msgpack/adaptor/vector_char.hpp" +#include "msgpack/adaptor/raw.hpp" +#include "msgpack/adaptor/ext.hpp" +#include "msgpack/adaptor/vector.hpp" +#include "msgpack/adaptor/map.hpp" + #if defined(__GNUC__) #pragma GCC diagnostic push @@ -42,359 +43,404 @@ namespace msgpack { /// @cond -MSGPACK_API_VERSION_NAMESPACE(v1) -{ - /// @endcond - - namespace type { - - template - struct basic_variant - : boost::variant< - nil_t, // NIL - bool, // BOOL - int64_t, // NEGATIVE_INTEGER - uint64_t, // POSITIVE_INTEGER - double, // FLOAT32, FLOAT64 - std::string, // STR +MSGPACK_API_VERSION_NAMESPACE(v1) { +/// @endcond + +namespace type { + + +template +struct basic_variant : + boost::variant< + nil_t, // NIL + bool, // BOOL + int64_t, // NEGATIVE_INTEGER + uint64_t, // POSITIVE_INTEGER + double, // FLOAT32, FLOAT64 + std::string, // STR #if (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53 - boost::string_ref, // STR -#endif // (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53 - std::vector, // BIN - msgpack::type::raw_ref, // BIN - msgpack::type::ext, // EXT - msgpack::type::ext_ref, // EXT - boost::recursive_wrapper>>, // ARRAY - boost::recursive_wrapper, basic_variant>>, // MAP - boost::recursive_wrapper, basic_variant>> // MAP - >, - private boost::totally_ordered> { - typedef boost::variant< - nil_t, // NIL - bool, // BOOL - int64_t, // NEGATIVE_INTEGER - uint64_t, // POSITIVE_INTEGER - double, // FLOAT32, FLOAT64 - std::string, // STR + boost::string_ref, // STR +#endif // (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53 + std::vector, // BIN + msgpack::type::raw_ref, // BIN + msgpack::type::ext, // EXT + msgpack::type::ext_ref, // EXT + boost::recursive_wrapper > >, // ARRAY + boost::recursive_wrapper, basic_variant > >, // MAP + boost::recursive_wrapper, basic_variant > >// MAP + >, + private boost::totally_ordered > { + typedef boost::variant< + nil_t, // NIL + bool, // BOOL + int64_t, // NEGATIVE_INTEGER + uint64_t, // POSITIVE_INTEGER + double, // FLOAT32, FLOAT64 + std::string, // STR #if (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53 - boost::string_ref, // STR -#endif // (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53 - std::vector, // BIN - msgpack::type::raw_ref, // BIN - msgpack::type::ext, // EXT - msgpack::type::ext_ref, // EXT - boost::recursive_wrapper>>, // ARRAY - boost::recursive_wrapper, basic_variant>>, // MAP - boost::recursive_wrapper, basic_variant>> // MAP - > - base; - basic_variant() {} - template - basic_variant(T const& t) - : base(t) - {} + boost::string_ref, // STR +#endif // (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53 + std::vector, // BIN + msgpack::type::raw_ref, // BIN + msgpack::type::ext, // EXT + msgpack::type::ext_ref, // EXT + boost::recursive_wrapper > >, // ARRAY + boost::recursive_wrapper, basic_variant > >, // MAP + boost::recursive_wrapper, basic_variant > >// MAP + > base; + basic_variant() {} + template + basic_variant(T const& t):base(t) {} #if defined(_MSC_VER) && _MSC_VER < 1700 - // The following redundant functions are required to avoid MSVC - // See https://svn.boost.org/trac/boost/ticket/592 - basic_variant(basic_variant const& other) - : base(static_cast(other)) - {} - basic_variant& operator=(basic_variant const& other) - { - *static_cast(this) = static_cast(other); - return *this; - } + // The following redundant functions are required to avoid MSVC + // See https://svn.boost.org/trac/boost/ticket/592 + basic_variant(basic_variant const& other):base(static_cast(other)) {} + basic_variant& operator=(basic_variant const& other) { + *static_cast(this) = static_cast(other); + return *this; + } #endif // defined(_MSC_VER) && _MSC_VER < 1700 - basic_variant(char const* p) - : base(std::string(p)) - {} - basic_variant(char v) { int_init(v); } - basic_variant(signed char v) { int_init(v); } - basic_variant(unsigned char v) - : base(uint64_t(v)) - {} - basic_variant(signed int v) { int_init(v); } - basic_variant(unsigned int v) - : base(uint64_t(v)) - {} - basic_variant(signed long v) { int_init(v); } - basic_variant(unsigned long v) - : base(uint64_t(v)) - {} - basic_variant(signed long long v) { int_init(v); } - basic_variant(unsigned long long v) - : base(uint64_t(v)) - {} - basic_variant(float v) { double_init(v); } - basic_variant(double v) { double_init(v); } - - bool is_nil() const { return boost::get(this) != MSGPACK_NULLPTR; } - bool is_bool() const { return boost::get(this) != MSGPACK_NULLPTR; } - bool is_int64_t() const { return boost::get(this) != MSGPACK_NULLPTR; } - bool is_uint64_t() const { return boost::get(this) != MSGPACK_NULLPTR; } - bool is_double() const { return boost::get(this) != MSGPACK_NULLPTR; } - bool is_string() const { return boost::get(this) != MSGPACK_NULLPTR; } + basic_variant(char const* p):base(std::string(p)) {} + basic_variant(char v) { + int_init(v); + } + basic_variant(signed char v) { + int_init(v); + } + basic_variant(unsigned char v):base(uint64_t(v)) {} + basic_variant(signed int v) { + int_init(v); + } + basic_variant(unsigned int v):base(uint64_t(v)) {} + basic_variant(signed long v) { + int_init(v); + } + basic_variant(unsigned long v):base(uint64_t(v)) {} + basic_variant(signed long long v) { + int_init(v); + } + basic_variant(unsigned long long v):base(uint64_t(v)) {} + basic_variant(float v) { + double_init(v); + } + basic_variant(double v) { + double_init(v); + } + + bool is_nil() const { + return boost::get(this) != MSGPACK_NULLPTR; + } + bool is_bool() const { + return boost::get(this) != MSGPACK_NULLPTR; + } + bool is_int64_t() const { + return boost::get(this) != MSGPACK_NULLPTR; + } + bool is_uint64_t() const { + return boost::get(this) != MSGPACK_NULLPTR; + } + bool is_double() const { + return boost::get(this) != MSGPACK_NULLPTR; + } + bool is_string() const { + return boost::get(this) != MSGPACK_NULLPTR; + } #if (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53 - bool is_boost_string_ref() const { return boost::get(this) != MSGPACK_NULLPTR; } + bool is_boost_string_ref() const { + return boost::get(this) != MSGPACK_NULLPTR; + } #endif // (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53 - bool is_vector_char() const { return boost::get>(this) != MSGPACK_NULLPTR; } - bool is_vector_char() { return boost::get>(this) != MSGPACK_NULLPTR; } - bool is_raw_ref() const { return boost::get(this) != MSGPACK_NULLPTR; } - bool is_ext() const { return boost::get(this) != MSGPACK_NULLPTR; } - bool is_ext_ref() const { return boost::get(this) != MSGPACK_NULLPTR; } - bool is_vector() const - { - return boost::get>>(this) != MSGPACK_NULLPTR; + bool is_vector_char() const { + return boost::get >(this) != MSGPACK_NULLPTR; + } + bool is_vector_char() { + return boost::get >(this) != MSGPACK_NULLPTR; + } + bool is_raw_ref() const { + return boost::get(this) != MSGPACK_NULLPTR; + } + bool is_ext() const { + return boost::get(this) != MSGPACK_NULLPTR; + } + bool is_ext_ref() const { + return boost::get(this) != MSGPACK_NULLPTR; + } + bool is_vector() const { + return boost::get > >(this) != MSGPACK_NULLPTR; + } + bool is_map() const { + return boost::get, basic_variant > >(this) != MSGPACK_NULLPTR; + } + bool is_multimap() const { + return boost::get, basic_variant > >(this) != MSGPACK_NULLPTR; + } + + bool as_bool() const { + return boost::get(*this); + } + int64_t as_int64_t() const { + return boost::get(*this); + } + uint64_t as_uint64_t() const { + return boost::get(*this); + } + double as_double() const { + if (is_double()) { + return boost::get(*this); } - bool is_map() const - { - return boost::get, basic_variant>>(this) != - MSGPACK_NULLPTR; + if (is_int64_t()) { + return static_cast(boost::get(*this)); } - bool is_multimap() const - { - return boost::get, basic_variant>>(this) != - MSGPACK_NULLPTR; + if (is_uint64_t()) { + return static_cast(boost::get(*this)); } - - bool as_bool() const { return boost::get(*this); } - int64_t as_int64_t() const { return boost::get(*this); } - uint64_t as_uint64_t() const { return boost::get(*this); } - double as_double() const - { - if (is_double()) { - return boost::get(*this); - } - if (is_int64_t()) { - return static_cast(boost::get(*this)); - } - if (is_uint64_t()) { - return static_cast(boost::get(*this)); - } - throw msgpack::type_error(); - } - std::string const& as_string() const { return boost::get(*this); } + THROW msgpack::type_error(); + } + std::string const& as_string() const { + return boost::get(*this); + } #if (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53 - boost::string_ref const& as_boost_string_ref() const { return boost::get(*this); } + boost::string_ref const& as_boost_string_ref() const { + return boost::get(*this); + } #endif // (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53 - std::vector const& as_vector_char() const { return boost::get>(*this); } - raw_ref const& as_raw_ref() const { return boost::get(*this); } - ext const& as_ext() const { return boost::get(*this); } - ext_ref const& as_ext_ref() const { return boost::get(*this); } - std::vector> const& as_vector() const - { - return boost::get>>(*this); - } - std::map, basic_variant> const& as_map() const - { - return boost::get, basic_variant>>(*this); + std::vector const& as_vector_char() const { + return boost::get >(*this); + } + raw_ref const& as_raw_ref() const { + return boost::get(*this); + } + ext const& as_ext() const { + return boost::get(*this); + } + ext_ref const& as_ext_ref() const { + return boost::get(*this); + } + std::vector > const& as_vector() const { + return boost::get > >(*this); + } + std::map, basic_variant > const& as_map() const { + return boost::get, basic_variant > >(*this); + } + std::multimap, basic_variant > const& as_multimap() const { + return boost::get, basic_variant > >(*this); + } +private: + template + void int_init(T v) { + if (v < 0) { + static_cast(*this) = int64_t(v); } - std::multimap, basic_variant> const& as_multimap() const - { - return boost::get, basic_variant>>(*this); + else { + static_cast(*this) = uint64_t(v); } - - private: - template void int_init(T v) - { - if (v < 0) { - static_cast(*this) = int64_t(v); - } else { + } + void double_init(double v) { + if (v == v) { // check for nan + if (v >= 0 && v <= double(std::numeric_limits::max()) && v == double(uint64_t(v))) { static_cast(*this) = uint64_t(v); + return; } - } - void double_init(double v) - { - if (v == v) { // check for nan - if (v >= 0 && v <= double(std::numeric_limits::max()) && v == double(uint64_t(v))) { - static_cast(*this) = uint64_t(v); - return; - } else if (v < 0 && v >= double(std::numeric_limits::min()) && v == double(int64_t(v))) { - static_cast(*this) = int64_t(v); - return; - } + else if (v < 0 && v >= double(std::numeric_limits::min()) && v == double(int64_t(v))) { + static_cast(*this) = int64_t(v); + return; } - static_cast(*this) = v; } - }; - - template - inline bool operator<(basic_variant const& lhs, basic_variant const& rhs) - { - return static_cast::base const&>(lhs) < - static_cast::base const&>(rhs); - } - - template - inline bool operator==(basic_variant const& lhs, basic_variant const& rhs) - { - return static_cast::base const&>(lhs) == - static_cast::base const&>(rhs); + static_cast(*this) = v; } - - typedef basic_variant, ext> variant; - typedef basic_variant< +}; + +template +inline bool operator<(basic_variant const& lhs, basic_variant const& rhs) { + return + static_cast::base const&>(lhs) < + static_cast::base const&>(rhs); +} + +template +inline bool operator==(basic_variant const& lhs, basic_variant const& rhs) { + return + static_cast::base const&>(lhs) == + static_cast::base const&>(rhs); +} + +typedef basic_variant, ext> variant; +typedef basic_variant< #if (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53 - boost::string_ref, + boost::string_ref, #else // (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53 - std::string, + std::string, #endif // (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53 - raw_ref, - ext_ref> - variant_ref; - - } // namespace type - - namespace adaptor { - -#if !defined(MSGPACK_USE_CPP03) - - template struct as> { - type::basic_variant operator()(msgpack::object const& o) const - { - switch (o.type) { - case type::NIL: - return o.as(); - case type::BOOLEAN: - return o.as(); - case type::POSITIVE_INTEGER: - return o.as(); - case type::NEGATIVE_INTEGER: - return o.as(); - case type::FLOAT32: - case type::FLOAT64: - return o.as(); - case type::STR: - return o.as(); - case type::BIN: - return o.as(); - case type::EXT: - return o.as(); - case type::ARRAY: - return o.as>>(); - case type::MAP: - return o.as, type::basic_variant>>(); - default: - break; - } - return type::basic_variant(); + raw_ref, ext_ref> variant_ref; + +} // namespace type + +namespace adaptor { + +#if !defined (MSGPACK_USE_CPP03) + +template +struct as > { + type::basic_variant operator()(msgpack::object const& o) const { + switch(o.type) { + case type::NIL: + return o.as(); + case type::BOOLEAN: + return o.as(); + case type::POSITIVE_INTEGER: + return o.as(); + case type::NEGATIVE_INTEGER: + return o.as(); + case type::FLOAT32: + case type::FLOAT64: + return o.as(); + case type::STR: + return o.as(); + case type::BIN: + return o.as(); + case type::EXT: + return o.as(); + case type::ARRAY: + return o.as > >(); + case type::MAP: + return o.as, type::basic_variant > >(); + default: + break; } - }; + return type::basic_variant(); + } +}; #endif // !defined (MSGPACK_USE_CPP03) - template struct convert> { - msgpack::object const& operator()(msgpack::object const& o, type::basic_variant& v) const - { - switch (o.type) { - case type::NIL: - v = o.as(); - break; - case type::BOOLEAN: - v = o.as(); - break; - case type::POSITIVE_INTEGER: - v = o.as(); - break; - case type::NEGATIVE_INTEGER: - v = o.as(); - break; - case type::FLOAT32: - case type::FLOAT64: - v = o.as(); - break; - case type::STR: - v = o.as(); - break; - case type::BIN: - v = o.as(); - break; - case type::EXT: - v = o.as(); - break; - case type::ARRAY: - v = o.as>>(); - break; - case type::MAP: - v = o.as, type::basic_variant>>(); - break; - default: - break; - } - return o; - } - }; - - namespace detail { - - template struct pack_imp : boost::static_visitor { - template void operator()(T const& value) const { pack()(o_, value); } - pack_imp(packer& o) - : o_(o) - {} - packer& o_; - }; - - } // namespace detail - - template struct pack> { - template - msgpack::packer& operator()(msgpack::packer& o, - const type::basic_variant& v) const - { - boost::apply_visitor(detail::pack_imp(o), v); - return o; - } - }; - - namespace detail { - - struct object_imp : boost::static_visitor { - void operator()(msgpack::type::nil_t const& v) const { object()(o_, v); } - void operator()(bool const& v) const { object()(o_, v); } - void operator()(uint64_t const& v) const { object()(o_, v); } - void operator()(int64_t const& v) const { object()(o_, v); } - void operator()(double const& v) const { object()(o_, v); } - template void operator()(T const&) const { THROW msgpack::type_error(); } - object_imp(msgpack::object& o) - : o_(o) - {} - msgpack::object& o_; - }; - - } // namespace detail - - template struct object> { - void operator()(msgpack::object& o, const type::basic_variant& v) const - { - boost::apply_visitor(detail::object_imp(o), v); + +template +struct convert > { + msgpack::object const& operator()( + msgpack::object const& o, + type::basic_variant& v) const { + switch(o.type) { + case type::NIL: + v = o.as(); + break; + case type::BOOLEAN: + v = o.as(); + break; + case type::POSITIVE_INTEGER: + v = o.as(); + break; + case type::NEGATIVE_INTEGER: + v = o.as(); + break; + case type::FLOAT32: + case type::FLOAT64: + v = o.as(); + break; + case type::STR: + v = o.as(); + break; + case type::BIN: + v = o.as(); + break; + case type::EXT: + v = o.as(); + break; + case type::ARRAY: + v = o.as > >(); + break; + case type::MAP: + v = o.as, type::basic_variant > >(); + break; + default: + break; } - }; + return o; + } +}; - namespace detail { +namespace detail { - struct object_with_zone_imp : boost::static_visitor { - template void operator()(T const& v) const { object_with_zone()(o_, v); } - object_with_zone_imp(msgpack::object::with_zone& o) - : o_(o) - {} - msgpack::object::with_zone& o_; - }; +template +struct pack_imp : boost::static_visitor { + template + void operator()(T const& value) const { + pack()(o_, value); + } + pack_imp(packer& o):o_(o) {} + packer& o_; +}; + +} // namespace detail + +template +struct pack > { + template + msgpack::packer& operator()(msgpack::packer& o, const type::basic_variant& v) const { + boost::apply_visitor(detail::pack_imp(o), v); + return o; + } +}; - } // namespace detail +namespace detail { - template struct object_with_zone> { - void operator()(msgpack::object::with_zone& o, const type::basic_variant& v) const - { - boost::apply_visitor(detail::object_with_zone_imp(o), v); - } - }; +struct object_imp : boost::static_visitor { + void operator()(msgpack::type::nil_t const& v) const { + object()(o_, v); + } + void operator()(bool const& v) const { + object()(o_, v); + } + void operator()(uint64_t const& v) const { + object()(o_, v); + } + void operator()(int64_t const& v) const { + object()(o_, v); + } + void operator()(double const& v) const { + object()(o_, v); + } + template + void operator()(T const&) const { + THROW msgpack::type_error(); + } + object_imp(msgpack::object& o):o_(o) {} + msgpack::object& o_; +}; + +} // namespace detail + +template +struct object > { + void operator()(msgpack::object& o, const type::basic_variant& v) const { + boost::apply_visitor(detail::object_imp(o), v); + } +}; + +namespace detail { - } // namespace adaptor +struct object_with_zone_imp : boost::static_visitor { + template + void operator()(T const& v) const { + object_with_zone()(o_, v); + } + object_with_zone_imp(msgpack::object::with_zone& o):o_(o) {} + msgpack::object::with_zone& o_; +}; + +} // namespace detail + +template +struct object_with_zone > { + void operator()(msgpack::object::with_zone& o, const type::basic_variant& v) const { + boost::apply_visitor(detail::object_with_zone_imp(o), v); + } +}; + +} // namespace adaptor - /// @cond +/// @cond } // MSGPACK_API_VERSION_NAMESPACE(v1) /// @endcond diff --git a/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/adaptor/cpp11/chrono.hpp b/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/adaptor/cpp11/chrono.hpp index fdbb44c4c96..e543c0ac99b 100644 --- a/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/adaptor/cpp11/chrono.hpp +++ b/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/adaptor/cpp11/chrono.hpp @@ -11,318 +11,344 @@ #ifndef MSGPACK_V1_TYPE_CPP11_CHRONO_HPP #define MSGPACK_V1_TYPE_CPP11_CHRONO_HPP +#include "msgpack/versioning.hpp" #include "msgpack/adaptor/adaptor_base.hpp" -#include "msgpack/adaptor/check_container_size.hpp" #include "msgpack/object.hpp" -#include "msgpack/versioning.hpp" +#include "msgpack/adaptor/check_container_size.hpp" -#include #include +#include namespace msgpack { /// @cond -MSGPACK_API_VERSION_NAMESPACE(v1) -{ - /// @endcond - - namespace adaptor { +MSGPACK_API_VERSION_NAMESPACE(v1) { +/// @endcond - namespace detail { - template ::value, - bool source_is_signed = std::is_signed::value, - typename = - typename std::enable_if::value && std::is_integral::value>::type> - struct would_underflow { - // The default case includes the cases that Source being unsigned, and since Source - // is unsigned, no underflow can happen - would_underflow(Source) - : value{ false } - {} - bool value; - }; +namespace adaptor { - template struct would_underflow { - // When Source is signed and Target is unsigned, we only need to compare with 0 to - // detect underflow, this works correctly and also avoids warnings from the compiler - would_underflow(Source source) - : value{ source < 0 } - {} - bool value; - }; - template struct would_underflow { - // When Source and Target are signed, the promotion rules apply sensibly so we do - // not need to do anything - would_underflow(Source source) - : value{ source < std::numeric_limits::min() } - {} - bool value; - }; +namespace detail { +template < + typename Target, + typename Source, + bool target_is_signed = std::is_signed::value, + bool source_is_signed = std::is_signed::value, + typename = typename std::enable_if< + std::is_integral::value && + std::is_integral::value + >::type +> +struct would_underflow { + // The default case includes the cases that Source being unsigned, and since Source + // is unsigned, no underflow can happen + would_underflow(Source) : value{false} {} + bool value; +}; - template ::value, - bool source_is_signed = std::is_signed::value, - typename = - typename std::enable_if::value && std::is_integral::value>::type> - struct would_overflow { - // The default case is Source and Target having the same signedness, the promotion - // rule also apply sensibly here so nothing special needs to be done - would_overflow(Source source) - : value{ source > std::numeric_limits::max() } - {} - bool value; - }; - template struct would_overflow { - // When Target is unsigned and Source is signed, we cannot rely on the promotion - // rule. - would_overflow(Source source) - : value{ sizeof(Target) >= sizeof(Source) - // Given Source is signed, Target being unsigned and having at least the - // same size makes impossible to overflow - ? false - // Source being larger than Target makes it safe to cast the maximum value - // of Target to Source - : source > static_cast(std::numeric_limits::max()) } - {} - bool value; - }; - template struct would_overflow { - // When Target is signed and Source is unsigned, we cannot rely on the promotion - // rule. - would_overflow(Source source) - : value{ sizeof(Target) > sizeof(Source) - // Target being larger than Source makes it impossible to overflow - ? false - // Source being unsigned and having at least the size of Target makes it - // safe to cast the maximum value of Target to Source - : source > static_cast(std::numeric_limits::max()) } - {} - bool value; - }; +template +struct would_underflow { + // When Source is signed and Target is unsigned, we only need to compare with 0 to + // detect underflow, this works correctly and also avoids warnings from the compiler + would_underflow(Source source) : value{source < 0} {} + bool value; +}; +template +struct would_underflow { + // When Source and Target are signed, the promotion rules apply sensibly so we do + // not need to do anything + would_underflow(Source source) + : value{source < std::numeric_limits::min()} {} + bool value; +}; - template < - typename Target, - typename Source, - typename = typename std::enable_if::value && std::is_integral::value>::type> - Target integral_cast(Source source) - { - if (would_underflow(source).value) { - THROW std::underflow_error{ "casting from Source to Target causes an underflow error" }; - } - if (would_overflow(source).value) { - THROW std::overflow_error{ "casting from Source to Target causes an overflow error" }; - } +template < + typename Target, + typename Source, + bool target_is_signed = std::is_signed::value, + bool source_is_signed = std::is_signed::value, + typename = typename std::enable_if< + std::is_integral::value && + std::is_integral::value + >::type +> +struct would_overflow { + // The default case is Source and Target having the same signedness, the promotion + // rule also apply sensibly here so nothing special needs to be done + would_overflow(Source source) + : value{source > std::numeric_limits::max()} {} + bool value; +}; +template +struct would_overflow { + // When Target is unsigned and Source is signed, we cannot rely on the promotion + // rule. + would_overflow(Source source) + : value{ + sizeof(Target) >= sizeof(Source) + // Given Source is signed, Target being unsigned and having at least the + // same size makes impossible to overflow + ? false + // Source being larger than Target makes it safe to cast the maximum value + // of Target to Source + : source > static_cast(std::numeric_limits::max()) + } {} + bool value; +}; +template +struct would_overflow { + // When Target is signed and Source is unsigned, we cannot rely on the promotion + // rule. + would_overflow(Source source) + : value{ + sizeof(Target) > sizeof(Source) + // Target being larger than Source makes it impossible to overflow + ? false + // Source being unsigned and having at least the size of Target makes it + // safe to cast the maximum value of Target to Source + : source > static_cast(std::numeric_limits::max()) + } {} + bool value; +}; - return static_cast(source); +template < + typename Target, + typename Source, + typename = typename std::enable_if< + std::is_integral::value && + std::is_integral::value + >::type +> +Target integral_cast(Source source) { + if (would_underflow(source).value) { + THROW std::underflow_error{ + "casting from Source to Target causes an underflow error" + }; + } + if(would_overflow(source).value) { + THROW std::overflow_error{ + "casting from Source to Target causes an overflow error" + }; } - } // namespace detail - template struct as> { - typename std::chrono::time_point operator()(msgpack::object const& o) const - { - if (o.type != msgpack::type::EXT) { - THROW msgpack::type_error(); - } - if (o.via.ext.type() != -1) { - THROW msgpack::type_error(); - } - std::chrono::time_point tp; - switch (o.via.ext.size) { - case 4: { - uint32_t sec; - _msgpack_load32(uint32_t, o.via.ext.data(), &sec); - tp += std::chrono::seconds(sec); - } break; - case 8: { - uint64_t value; - _msgpack_load64(uint64_t, o.via.ext.data(), &value); - uint32_t nanosec = detail::integral_cast(value >> 34); - uint64_t sec = value & 0x00000003ffffffffLL; - tp += std::chrono::duration_cast(std::chrono::nanoseconds(nanosec)); - tp += std::chrono::seconds(sec); - } break; - case 12: { - uint32_t nanosec; - _msgpack_load32(uint32_t, o.via.ext.data(), &nanosec); - int64_t sec; - _msgpack_load64(int64_t, o.via.ext.data() + 4, &sec); + return static_cast(source); +} +} // namespace detail - if (sec > 0) { +template +struct as> { + typename std::chrono::time_point operator()(msgpack::object const& o) const { + if(o.type != msgpack::type::EXT) { THROW msgpack::type_error(); } + if(o.via.ext.type() != -1) { THROW msgpack::type_error(); } + std::chrono::time_point tp; + switch(o.via.ext.size) { + case 4: { + uint32_t sec; + _msgpack_load32(uint32_t, o.via.ext.data(), &sec); + tp += std::chrono::seconds(sec); + } break; + case 8: { + uint64_t value; + _msgpack_load64(uint64_t, o.via.ext.data(), &value); + uint32_t nanosec = detail::integral_cast(value >> 34); + uint64_t sec = value & 0x00000003ffffffffLL; + tp += std::chrono::duration_cast( + std::chrono::nanoseconds(nanosec)); + tp += std::chrono::seconds(sec); + } break; + case 12: { + uint32_t nanosec; + _msgpack_load32(uint32_t, o.via.ext.data(), &nanosec); + int64_t sec; + _msgpack_load64(int64_t, o.via.ext.data() + 4, &sec); + + if (sec > 0) { + tp += std::chrono::seconds(sec); + tp += std::chrono::duration_cast( + std::chrono::nanoseconds(nanosec)); + } + else { + if (nanosec == 0) { tp += std::chrono::seconds(sec); - tp += std::chrono::duration_cast(std::chrono::nanoseconds(nanosec)); - } else { - if (nanosec == 0) { - tp += std::chrono::seconds(sec); - } else { - ++sec; - tp += std::chrono::seconds(sec); - int64_t ns = detail::integral_cast(nanosec) - 1000000000L; - tp += std::chrono::duration_cast(std::chrono::nanoseconds(ns)); - } } - } break; - default: - THROW msgpack::type_error(); + else { + ++sec; + tp += std::chrono::seconds(sec); + int64_t ns = detail::integral_cast(nanosec) - 1000000000L; + tp += std::chrono::duration_cast( + std::chrono::nanoseconds(ns)); + } } - return tp; + } break; + default: + THROW msgpack::type_error(); } - }; + return tp; + } +}; - template struct convert> { - msgpack::object const& operator()(msgpack::object const& o, std::chrono::time_point& v) const - { - if (o.type != msgpack::type::EXT) { - THROW msgpack::type_error(); - } - if (o.via.ext.type() != -1) { - THROW msgpack::type_error(); - } - std::chrono::time_point tp; - switch (o.via.ext.size) { - case 4: { - uint32_t sec; - _msgpack_load32(uint32_t, o.via.ext.data(), &sec); - tp += std::chrono::seconds(sec); - v = tp; - } break; - case 8: { - uint64_t value; - _msgpack_load64(uint64_t, o.via.ext.data(), &value); - uint32_t nanosec = detail::integral_cast(value >> 34); - uint64_t sec = value & 0x00000003ffffffffLL; - tp += std::chrono::duration_cast(std::chrono::nanoseconds(nanosec)); - tp += std::chrono::seconds(sec); - v = tp; - } break; - case 12: { - uint32_t nanosec; - _msgpack_load32(uint32_t, o.via.ext.data(), &nanosec); - int64_t sec; - _msgpack_load64(int64_t, o.via.ext.data() + 4, &sec); +template +struct convert> { + msgpack::object const& operator()(msgpack::object const& o, std::chrono::time_point& v) const { + if(o.type != msgpack::type::EXT) { THROW msgpack::type_error(); } + if(o.via.ext.type() != -1) { THROW msgpack::type_error(); } + std::chrono::time_point tp; + switch(o.via.ext.size) { + case 4: { + uint32_t sec; + _msgpack_load32(uint32_t, o.via.ext.data(), &sec); + tp += std::chrono::seconds(sec); + v = tp; + } break; + case 8: { + uint64_t value; + _msgpack_load64(uint64_t, o.via.ext.data(), &value); + uint32_t nanosec = detail::integral_cast(value >> 34); + uint64_t sec = value & 0x00000003ffffffffLL; + tp += std::chrono::duration_cast( + std::chrono::nanoseconds(nanosec)); + tp += std::chrono::seconds(sec); + v = tp; + } break; + case 12: { + uint32_t nanosec; + _msgpack_load32(uint32_t, o.via.ext.data(), &nanosec); + int64_t sec; + _msgpack_load64(int64_t, o.via.ext.data() + 4, &sec); - if (sec > 0) { + if (sec > 0) { + tp += std::chrono::seconds(sec); + tp += std::chrono::duration_cast( + std::chrono::nanoseconds(nanosec)); + } + else { + if (nanosec == 0) { tp += std::chrono::seconds(sec); - tp += std::chrono::duration_cast(std::chrono::nanoseconds(nanosec)); - } else { - if (nanosec == 0) { - tp += std::chrono::seconds(sec); - } else { - ++sec; - tp += std::chrono::seconds(sec); - int64_t ns = detail::integral_cast(nanosec) - 1000000000L; - tp += std::chrono::duration_cast(std::chrono::nanoseconds(ns)); - } } - - v = tp; - } break; - default: - THROW msgpack::type_error(); + else { + ++sec; + tp += std::chrono::seconds(sec); + int64_t ns = detail::integral_cast(nanosec) - 1000000000L; + tp += std::chrono::duration_cast( + std::chrono::nanoseconds(ns)); + } } - return o; + + v = tp; + } break; + default: + THROW msgpack::type_error(); } - }; + return o; + } +}; + +template +struct pack> { + template + msgpack::packer& operator()(msgpack::packer& o, std::chrono::time_point const& v) const { + int64_t count = detail::integral_cast(v.time_since_epoch().count()); + int64_t nano_num = + Duration::period::ratio::num * + (1000000000L / Duration::period::ratio::den); - template struct pack> { - template - msgpack::packer& operator()(msgpack::packer& o, - std::chrono::time_point const& v) const - { - int64_t count = detail::integral_cast(v.time_since_epoch().count()); - int64_t nano_num = Duration::period::ratio::num * (1000000000L / Duration::period::ratio::den); + int64_t nanosec = count % (1000000000L / nano_num) * nano_num; + int64_t sec = 0; + if (nanosec < 0) { + nanosec = 1000000000L + nanosec; + --sec; + } + sec += count + * Duration::period::ratio::num + / Duration::period::ratio::den; - int64_t nanosec = count % (1000000000L / nano_num) * nano_num; - int64_t sec = 0; - if (nanosec < 0) { - nanosec = 1000000000L + nanosec; - --sec; + if ((sec >> 34) == 0) { + uint64_t data64 = (detail::integral_cast(nanosec) << 34) | detail::integral_cast(sec); + if ((data64 & 0xffffffff00000000L) == 0) { + // timestamp 32 + o.pack_ext(4, -1); + uint32_t data32 = detail::integral_cast(data64); + char buf[4]; + _msgpack_store32(buf, data32); + o.pack_ext_body(buf, 4); + } + else { + // timestamp 64 + o.pack_ext(8, -1); + char buf[8]; + _msgpack_store64(buf, data64); + o.pack_ext_body(buf, 8); } - sec += count * Duration::period::ratio::num / Duration::period::ratio::den; + } + else { + // timestamp 96 + o.pack_ext(12, -1); + char buf[12]; - if ((sec >> 34) == 0) { - uint64_t data64 = - (detail::integral_cast(nanosec) << 34) | detail::integral_cast(sec); - if ((data64 & 0xffffffff00000000L) == 0) { - // timestamp 32 - o.pack_ext(4, -1); - uint32_t data32 = detail::integral_cast(data64); - char buf[4]; - _msgpack_store32(buf, data32); - o.pack_ext_body(buf, 4); - } else { - // timestamp 64 - o.pack_ext(8, -1); - char buf[8]; - _msgpack_store64(buf, data64); - o.pack_ext_body(buf, 8); - } - } else { - // timestamp 96 - o.pack_ext(12, -1); - char buf[12]; - _msgpack_store32(&buf[0], detail::integral_cast(nanosec)); - _msgpack_store64(&buf[4], sec); - o.pack_ext_body(buf, 12); - } - return o; + _msgpack_store32(&buf[0], detail::integral_cast(nanosec)); + _msgpack_store64(&buf[4], sec); + o.pack_ext_body(buf, 12); } - }; + return o; + } +}; - template struct object_with_zone> { - void operator()(msgpack::object::with_zone& o, const std::chrono::time_point& v) const - { - int64_t count = detail::integral_cast(v.time_since_epoch().count()); +template +struct object_with_zone> { + void operator()(msgpack::object::with_zone& o, const std::chrono::time_point& v) const { + int64_t count = detail::integral_cast(v.time_since_epoch().count()); - int64_t nano_num = Duration::period::ratio::num * (1000000000L / Duration::period::ratio::den); + int64_t nano_num = + Duration::period::ratio::num * + (1000000000L / Duration::period::ratio::den); - int64_t nanosec = count % (1000000000L / nano_num) * nano_num; - int64_t sec = 0; - if (nanosec < 0) { - nanosec = 1000000000L + nanosec; - --sec; + int64_t nanosec = count % (1000000000L / nano_num) * nano_num; + int64_t sec = 0; + if (nanosec < 0) { + nanosec = 1000000000L + nanosec; + --sec; + } + sec += count + * Duration::period::ratio::num + / Duration::period::ratio::den; + if ((sec >> 34) == 0) { + uint64_t data64 = (detail::integral_cast(nanosec) << 34) | detail::integral_cast(sec); + if ((data64 & 0xffffffff00000000L) == 0) { + // timestamp 32 + o.type = msgpack::type::EXT; + o.via.ext.size = 4; + char* p = static_cast(o.zone.allocate_no_align(o.via.ext.size + 1)); + p[0] = static_cast(-1); + uint32_t data32 = detail::integral_cast(data64); + _msgpack_store32(&p[1], data32); + o.via.ext.ptr = p; } - sec += count * Duration::period::ratio::num / Duration::period::ratio::den; - if ((sec >> 34) == 0) { - uint64_t data64 = - (detail::integral_cast(nanosec) << 34) | detail::integral_cast(sec); - if ((data64 & 0xffffffff00000000L) == 0) { - // timestamp 32 - o.type = msgpack::type::EXT; - o.via.ext.size = 4; - char* p = static_cast(o.zone.allocate_no_align(o.via.ext.size + 1)); - p[0] = static_cast(-1); - uint32_t data32 = detail::integral_cast(data64); - _msgpack_store32(&p[1], data32); - o.via.ext.ptr = p; - } else { - // timestamp 64 - o.type = msgpack::type::EXT; - o.via.ext.size = 8; - char* p = static_cast(o.zone.allocate_no_align(o.via.ext.size + 1)); - p[0] = static_cast(-1); - _msgpack_store64(&p[1], data64); - o.via.ext.ptr = p; - } - } else { - // timestamp 96 + else { + // timestamp 64 o.type = msgpack::type::EXT; - o.via.ext.size = 12; + o.via.ext.size = 8; char* p = static_cast(o.zone.allocate_no_align(o.via.ext.size + 1)); p[0] = static_cast(-1); - _msgpack_store32(&p[1], detail::integral_cast(nanosec)); - _msgpack_store64(&p[1 + 4], sec); + _msgpack_store64(&p[1], data64); o.via.ext.ptr = p; } } - }; + else { + // timestamp 96 + o.type = msgpack::type::EXT; + o.via.ext.size = 12; + char* p = static_cast(o.zone.allocate_no_align(o.via.ext.size + 1)); + p[0] = static_cast(-1); + _msgpack_store32(&p[1], detail::integral_cast(nanosec)); + _msgpack_store64(&p[1 + 4], sec); + o.via.ext.ptr = p; + } + } +}; - } // namespace adaptor +} // namespace adaptor - /// @cond +/// @cond } // MSGPACK_API_VERSION_NAMESPACE(v1) /// @endcond diff --git a/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/adaptor/cpp17/variant.hpp b/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/adaptor/cpp17/variant.hpp index d8bb33dc33a..7c1b595e2b8 100644 --- a/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/adaptor/cpp17/variant.hpp +++ b/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/adaptor/cpp17/variant.hpp @@ -24,93 +24,125 @@ #include namespace msgpack { -MSGPACK_API_VERSION_NAMESPACE(v1) -{ - namespace adaptor { - namespace detail { - template - Variant construct_variant(std::size_t index, - msgpack::object& object, - std::index_sequence) - { - if constexpr (sizeof...(Ts) == 0) { +MSGPACK_API_VERSION_NAMESPACE(v1) { +namespace adaptor { +namespace detail { +template < + typename Variant, + typename T, + typename... Ts, + std::size_t current_index, + std::size_t... indices +> +Variant construct_variant( + std::size_t index, + msgpack::object& object, + std::index_sequence +) { + if constexpr(sizeof...(Ts) == 0) { + return object.as(); + } + else { + if (index == current_index) { return object.as(); - } else { - if (index == current_index) { - return object.as(); - } - return construct_variant(index, object, std::index_sequence()); } + return construct_variant( + index, + object, + std::index_sequence() + ); } +} - struct object_variant_overload { - object_variant_overload(msgpack::object& obj, msgpack::zone& zone) - : obj{ obj } - , zone{ zone } - {} - - template void operator()(T const& value) { obj = msgpack::object(value, zone); } - - msgpack::object& obj; - msgpack::zone& zone; - }; - } // namespace detail - - template - struct as, typename std::enable_if<(msgpack::has_as::value && ...)>::type> { - std::variant operator()(msgpack::object const& o) const - { - if (o.type != msgpack::type::ARRAY || o.via.array.size != 2 || - o.via.array.ptr[0].type != msgpack::type::POSITIVE_INTEGER || - o.via.array.ptr[0].via.u64 >= sizeof...(Ts)) { - THROW msgpack::type_error{}; - } - - return detail::construct_variant, Ts...>( - o.via.array.ptr[0].as(), o.via.array.ptr[1], std::make_index_sequence()); - } - }; - - template struct convert> { - msgpack::object const& operator()(msgpack::object const& o, std::variant& v) const - { - if (o.type != msgpack::type::ARRAY || o.via.array.size != 2 || - o.via.array.ptr[0].type != msgpack::type::POSITIVE_INTEGER || - o.via.array.ptr[0].via.u64 >= sizeof...(Ts)) { - THROW msgpack::type_error{}; - } - - v = detail::construct_variant, Ts...>( - o.via.array.ptr[0].as(), o.via.array.ptr[1], std::make_index_sequence()); - return o; - } - }; - - template struct pack> { - template - msgpack::packer& operator()(msgpack::packer& o, std::variant const& v) const - { - o.pack_array(2); - o.pack_uint64(v.index()); - std::visit([&o](auto const& value) { o.pack(value); }, v); - return o; +struct object_variant_overload { + object_variant_overload(msgpack::object& obj, msgpack::zone& zone) + : obj{obj} + , zone{zone} {} + + template + void operator()(T const& value) { + obj = msgpack::object(value, zone); + } + + msgpack::object& obj; + msgpack::zone& zone; +}; +} // namespace detail + +template +struct as, typename std::enable_if<(msgpack::has_as::value && ...)>::type> { + std::variant operator()(msgpack::object const& o) const { + if ( o.type != msgpack::type::ARRAY + || o.via.array.size != 2 + || o.via.array.ptr[0].type != msgpack::type::POSITIVE_INTEGER + || o.via.array.ptr[0].via.u64 >= sizeof...(Ts)) { + THROW msgpack::type_error{}; } - }; - - template struct object_with_zone> { - void operator()(msgpack::object::with_zone& o, std::variant const& v) const - { - msgpack::object* p = static_cast( - o.zone.allocate_align(sizeof(msgpack::object) * 2, MSGPACK_ZONE_ALIGNOF(msgpack::object))); - - o.type = msgpack::type::ARRAY; - o.via.array.size = 2; - o.via.array.ptr = p; - o.via.array.ptr[0] = msgpack::object(v.index(), o.zone); - std::visit(detail::object_variant_overload(o.via.array.ptr[1], o.zone), v); + + return detail::construct_variant, Ts...>( + o.via.array.ptr[0].as(), + o.via.array.ptr[1], + std::make_index_sequence() + ); + } +}; + +template +struct convert> { + msgpack::object const& operator()(msgpack::object const& o, std::variant& v) const { + if ( o.type != msgpack::type::ARRAY + || o.via.array.size != 2 + || o.via.array.ptr[0].type != msgpack::type::POSITIVE_INTEGER + || o.via.array.ptr[0].via.u64 >= sizeof...(Ts)) { + THROW msgpack::type_error{}; } - }; - } // namespace adaptor + + v = detail::construct_variant, Ts...>( + o.via.array.ptr[0].as(), + o.via.array.ptr[1], + std::make_index_sequence() + ); + return o; + } +}; + +template +struct pack>{ + template + msgpack::packer& operator()( + msgpack::packer& o, + std::variant const& v + ) const { + o.pack_array(2); + o.pack_uint64(v.index()); + std::visit([&o](auto const& value){o.pack(value);}, v); + return o; + } +}; + + +template +struct object_with_zone> { + void operator()( + msgpack::object::with_zone& o, + std::variant const& v + ) const { + msgpack::object *p = + static_cast( + o.zone.allocate_align( + sizeof(msgpack::object) * 2, + MSGPACK_ZONE_ALIGNOF(msgpack::object) + ) + ); + + o.type = msgpack::type::ARRAY; + o.via.array.size = 2; + o.via.array.ptr = p; + o.via.array.ptr[0]= msgpack::object(v.index(), o.zone); + std::visit(detail::object_variant_overload(o.via.array.ptr[1], o.zone), v); + } +}; +} // namespace adaptor } } // namespace msgpack diff --git a/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/detail/cpp03_zone.hpp b/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/detail/cpp03_zone.hpp index 0a7246d5ac7..45a75a12cec 100644 --- a/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/detail/cpp03_zone.hpp +++ b/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/detail/cpp03_zone.hpp @@ -10,877 +10,653 @@ #ifndef MSGPACK_V1_CPP03_ZONE_HPP #define MSGPACK_V1_CPP03_ZONE_HPP -#include "msgpack/assert.hpp" -#include "msgpack/cpp_config.hpp" #include "msgpack/versioning.hpp" +#include "msgpack/cpp_config.hpp" #include "msgpack/zone_decl.hpp" +#include "msgpack/assert.hpp" +#include #include #include -#include #include + namespace msgpack { /// @cond -MSGPACK_API_VERSION_NAMESPACE(v1) -{ - /// @endcond +MSGPACK_API_VERSION_NAMESPACE(v1) { +/// @endcond - class zone { - struct finalizer { - finalizer(void (*func)(void*), void* data, finalizer* next) - : m_func(func) - , m_data(data) - , m_next(next) - {} - void operator()() { m_func(m_data); } - void (*m_func)(void*); - void* m_data; - finalizer* m_next; - }; - - struct finalizer_array { - finalizer_array() - : m_head(MSGPACK_NULLPTR) - {} - - ~finalizer_array() { clear(); } - - void clear() - { - finalizer* fin = m_head; - finalizer* tmp = MSGPACK_NULLPTR; - while (fin) { - (*fin)(); - tmp = fin; - fin = fin->m_next; - delete tmp; - } - m_head = MSGPACK_NULLPTR; - } +class zone { + struct finalizer { + finalizer(void (*func)(void*), void* data, finalizer* next): m_func(func), m_data(data), m_next(next) {} + void operator()() { m_func(m_data); } + void (*m_func)(void*); + void* m_data; + finalizer* m_next; + }; - void push(void (*func)(void* data), void* data) { m_head = new finalizer(func, data, m_head); } + struct finalizer_array { + finalizer_array(): m_head(MSGPACK_NULLPTR) {} - void pop() - { - finalizer* n = m_head->m_next; - delete m_head; - m_head = n; - } + ~finalizer_array() { + clear(); + } - finalizer* m_head; - - private: - finalizer_array(const finalizer_array&); - finalizer_array& operator=(const finalizer_array&); - }; - - struct chunk { - chunk* m_next; - }; - - struct chunk_list { - chunk_list(size_t chunk_size, char* ptr) - : m_free(chunk_size) - , m_ptr(ptr) - , m_head(MSGPACK_NULLPTR) - {} - ~chunk_list() - { - chunk* c = m_head; - while (c) { - chunk* n = c->m_next; - ::free(c); - c = n; - } - m_head = MSGPACK_NULLPTR; + void clear() { + finalizer* fin = m_head; + finalizer* tmp = MSGPACK_NULLPTR; + while(fin) { + (*fin)(); + tmp = fin; + fin = fin->m_next; + delete tmp; } + m_head = MSGPACK_NULLPTR; + } - void clear(size_t chunk_size, char* ptr) - { - chunk* c = m_head; - while (c) { - chunk* n = c->m_next; - ::free(c); - c = n; - } - m_head = MSGPACK_NULLPTR; - m_free = chunk_size; - m_ptr = ptr; - } + void push(void (*func)(void* data), void* data) { + m_head = new finalizer(func, data, m_head); + } - size_t m_free; - char* m_ptr; - chunk* m_head; + void pop() { + finalizer* n = m_head->m_next; + delete m_head; + m_head = n; + } + + finalizer* m_head; + private: + finalizer_array(const finalizer_array&); + finalizer_array& operator=(const finalizer_array&); + }; + + struct chunk { + chunk* m_next; + }; + + struct chunk_list { + chunk_list(size_t chunk_size, char* ptr): m_free(chunk_size), m_ptr(ptr), m_head(MSGPACK_NULLPTR) {} + ~chunk_list() { + chunk* c = m_head; + while(c) { + chunk* n = c->m_next; + ::free(c); + c = n; + } + m_head = MSGPACK_NULLPTR; + } - private: - chunk_list(const chunk_list&); - chunk_list& operator=(const chunk_list&); - }; + void clear(size_t chunk_size, char* ptr) { + chunk* c = m_head; + while(c) { + chunk* n = c->m_next; + ::free(c); + c = n; + } + m_head = MSGPACK_NULLPTR; + m_free = chunk_size; + m_ptr = ptr; + } - size_t m_chunk_size; - chunk_list* m_chunk_list; - finalizer_array m_finalizer_array; + size_t m_free; + char* m_ptr; + chunk* m_head; - public: - zone(size_t chunk_size = MSGPACK_ZONE_CHUNK_SIZE); - ~zone(); + private: + chunk_list(const chunk_list&); + chunk_list& operator=(const chunk_list&); + }; - void* allocate_align(size_t size, size_t align = MSGPACK_ZONE_ALIGN); + size_t m_chunk_size; + chunk_list* m_chunk_list; + finalizer_array m_finalizer_array; - void* allocate_no_align(size_t size); +public: + zone(size_t chunk_size = MSGPACK_ZONE_CHUNK_SIZE); + ~zone(); - bool allocated() { return m_chunk_list != MSGPACK_NULLPTR; } + void* allocate_align(size_t size, size_t align = MSGPACK_ZONE_ALIGN); - void push_finalizer(void (*func)(void*), void* data); + void* allocate_no_align(size_t size); - template void push_finalizer(msgpack::unique_ptr obj); + bool allocated() { + return m_chunk_list != MSGPACK_NULLPTR; + } - void clear(); + void push_finalizer(void (*func)(void*), void* data); - void swap(zone& o); + template + void push_finalizer(msgpack::unique_ptr obj); - static void* operator new(std::size_t size) - { - void* p = ::malloc(size); - if (!p) - throw std::bad_alloc(); - return p; - } + void clear(); - static void operator delete(void* p) /* throw() */ { ::free(p); } - - static void* operator new(std::size_t /*size*/, void* mem) /* throw() */ { return mem; } - - static void operator delete(void* /*p*/, void* /*mem*/) /* throw() */ {} - - /// @cond - - template T* allocate(); - - template T* allocate(A1 a1); - - template T* allocate(A1 a1, A2 a2); - - template T* allocate(A1 a1, A2 a2, A3 a3); - - template - T* allocate(A1 a1, A2 a2, A3 a3, A4 a4); - - template - T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5); - - template - T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6); - - template - T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7); - - template - T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8); - - template - T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9); - - template - T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10); - - template - T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11); - - template - T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12); - - template - T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12, A13 a13); - - template - T* allocate( - A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12, A13 a13, A14 a14); - - template - T* allocate(A1 a1, - A2 a2, - A3 a3, - A4 a4, - A5 a5, - A6 a6, - A7 a7, - A8 a8, - A9 a9, - A10 a10, - A11 a11, - A12 a12, - A13 a13, - A14 a14, - A15 a15); - - /// @endcond - - private: - void undo_allocate(size_t size); - - template static void object_destruct(void* obj); - - template static void object_delete(void* obj); - - static char* get_aligned(char* ptr, size_t align); - - chunk_list& get_chank_lst(); - - char* allocate_expand(size_t size); - - private: - zone(const zone&); - zone& operator=(const zone&); - }; + void swap(zone& o); - inline zone::zone(size_t chunk_size) - : m_chunk_size(chunk_size) - , m_chunk_list(MSGPACK_NULLPTR) - {} - - inline zone::~zone() - { - m_finalizer_array.~finalizer_array(); - if (m_chunk_list) { - m_chunk_list->~chunk_list(); - ::free(m_chunk_list); - m_chunk_list = MSGPACK_NULLPTR; - } + static void* operator new(std::size_t size) { + void* p = ::malloc(size); + if (!p) THROW std::bad_alloc(); + return p; } - inline char* zone::get_aligned(char* ptr, size_t align) - { - MSGPACK_ASSERT(align != 0 && (align & (align - 1)) == 0); // align must be 2^n (n >= 0) - return reinterpret_cast(reinterpret_cast(ptr + (align - 1)) & - ~static_cast(align - 1)); + static void operator delete(void *p) /* throw() */ { + ::free(p); } - inline zone::chunk_list& zone::get_chank_lst() - { - if (!m_chunk_list) { - void* ptr = ::malloc(sizeof(chunk_list) + m_chunk_size); - if (!ptr) - throw std::bad_alloc(); - m_chunk_list = new (ptr) chunk_list(m_chunk_size, reinterpret_cast(ptr) + sizeof(chunk_list)); - } - return *m_chunk_list; - } - - inline void* zone::allocate_align(size_t size, size_t align) - { - chunk_list& chank_lst = get_chank_lst(); - char* aligned = get_aligned(chank_lst.m_ptr, align); - size_t adjusted_size = size + static_cast(aligned - chank_lst.m_ptr); - if (chank_lst.m_free < adjusted_size) { - size_t enough_size = size + align - 1; - char* ptr = allocate_expand(enough_size); - aligned = get_aligned(ptr, align); - adjusted_size = size + static_cast(aligned - chank_lst.m_ptr); - } - chank_lst.m_free -= adjusted_size; - chank_lst.m_ptr += adjusted_size; - return aligned; + static void* operator new(std::size_t /*size*/, void* mem) /* throw() */ { + return mem; } - inline void* zone::allocate_no_align(size_t size) - { - chunk_list& chank_lst = get_chank_lst(); - char* ptr = chank_lst.m_ptr; - if (chank_lst.m_free < size) { - ptr = allocate_expand(size); - } - chank_lst.m_free -= size; - chank_lst.m_ptr += size; + static void operator delete(void * /*p*/, void* /*mem*/) /* throw() */ {} - return ptr; - } + /// @cond + + template + T* allocate(); + + template + T* allocate(A1 a1); + + template + T* allocate(A1 a1, A2 a2); + + template + T* allocate(A1 a1, A2 a2, A3 a3); + + template + T* allocate(A1 a1, A2 a2, A3 a3, A4 a4); + + template + T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5); + + template + T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6); + + template + T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7); + + template + T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8); + + template + T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9); + + template + T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10); + + template + T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11); + + template + T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12); + + template + T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12, A13 a13); + + template + T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12, A13 a13, A14 a14); + + template + T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12, A13 a13, A14 a14, A15 a15); + + /// @endcond - inline char* zone::allocate_expand(size_t size) - { - chunk_list& cl = get_chank_lst(); - size_t sz = m_chunk_size; +private: + void undo_allocate(size_t size); - while (sz < size) { - size_t tmp_sz = sz * 2; - if (tmp_sz <= sz) { - sz = size; - break; - } - sz = tmp_sz; - } + template + static void object_destruct(void* obj); - chunk* c = static_cast(::malloc(sizeof(chunk) + sz)); - if (!c) - throw std::bad_alloc(); + template + static void object_delete(void* obj); - char* ptr = reinterpret_cast(c) + sizeof(chunk); + static char* get_aligned(char* ptr, size_t align); - c->m_next = cl.m_head; - cl.m_head = c; - cl.m_free = sz; - cl.m_ptr = ptr; + chunk_list& get_chank_lst(); - return ptr; - } + char* allocate_expand(size_t size); +private: + zone(const zone&); + zone& operator=(const zone&); +}; - inline void zone::push_finalizer(void (*func)(void*), void* data) - { - m_finalizer_array.push(func, data); - } +inline zone::zone(size_t chunk_size):m_chunk_size(chunk_size), m_chunk_list(MSGPACK_NULLPTR) {} - template inline void zone::push_finalizer(msgpack::unique_ptr obj) - { - m_finalizer_array.push(&zone::object_delete, obj.release()); +inline zone::~zone() { + m_finalizer_array.~finalizer_array(); + if(m_chunk_list) { + m_chunk_list->~chunk_list(); + ::free(m_chunk_list); + m_chunk_list = MSGPACK_NULLPTR; } +} + +inline char* zone::get_aligned(char* ptr, size_t align) { + MSGPACK_ASSERT(align != 0 && (align & (align - 1)) == 0); // align must be 2^n (n >= 0) + return + reinterpret_cast( + reinterpret_cast(ptr + (align - 1)) & ~static_cast(align - 1) + ); +} + +inline zone::chunk_list& zone::get_chank_lst() { + if (!m_chunk_list) { + void* ptr = ::malloc(sizeof(chunk_list) + m_chunk_size); + if (!ptr) + THROW std::bad_alloc(); + m_chunk_list = new (ptr) chunk_list(m_chunk_size, reinterpret_cast(ptr) + sizeof(chunk_list)); + } + return *m_chunk_list; +} + +inline void* zone::allocate_align(size_t size, size_t align) { + chunk_list& chank_lst = get_chank_lst(); + char* aligned = get_aligned(chank_lst.m_ptr, align); + size_t adjusted_size = size + static_cast(aligned - chank_lst.m_ptr); + if (chank_lst.m_free < adjusted_size) { + size_t enough_size = size + align - 1; + char* ptr = allocate_expand(enough_size); + aligned = get_aligned(ptr, align); + adjusted_size = size + static_cast(aligned - chank_lst.m_ptr); + } + chank_lst.m_free -= adjusted_size; + chank_lst.m_ptr += adjusted_size; + return aligned; +} + +inline void* zone::allocate_no_align(size_t size) { + chunk_list& chank_lst = get_chank_lst(); + char* ptr = chank_lst.m_ptr; + if(chank_lst.m_free < size) { + ptr = allocate_expand(size); + } + chank_lst.m_free -= size; + chank_lst.m_ptr += size; + + return ptr; +} - inline void zone::clear() - { - m_finalizer_array.clear(); - if (m_chunk_list) { - m_chunk_list->clear(m_chunk_size, reinterpret_cast(m_chunk_list) + sizeof(chunk_list)); +inline char* zone::allocate_expand(size_t size) { + chunk_list& cl = get_chank_lst(); + size_t sz = m_chunk_size; + + while(sz < size) { + size_t tmp_sz = sz * 2; + if (tmp_sz <= sz) { + sz = size; + break; } + sz = tmp_sz; } - inline void zone::swap(zone & o) - { - using std::swap; - swap(m_chunk_size, o.m_chunk_size); - swap(m_chunk_list, o.m_chunk_list); - swap(m_finalizer_array.m_head, o.m_finalizer_array.m_head); - } + chunk* c = static_cast(::malloc(sizeof(chunk) + sz)); + if (!c) THROW std::bad_alloc(); - template void zone::object_delete(void* obj) - { - delete static_cast(obj); - } + char* ptr = reinterpret_cast(c) + sizeof(chunk); - template void zone::object_destruct(void* obj) - { - static_cast(obj)->~T(); - } + c->m_next = cl.m_head; + cl.m_head = c; + cl.m_free = sz; + cl.m_ptr = ptr; - inline void zone::undo_allocate(size_t size) - { - chunk_list& cl = get_chank_lst(); - cl.m_ptr -= size; - cl.m_free += size; - } + return ptr; +} + +inline void zone::push_finalizer(void (*func)(void*), void* data) { + m_finalizer_array.push(func, data); +} - inline std::size_t aligned_size(std::size_t size, std::size_t align) - { - return (size + align - 1) / align * align; +template +inline void zone::push_finalizer(msgpack::unique_ptr obj) { + m_finalizer_array.push(&zone::object_delete, obj.release()); +} + +inline void zone::clear() { + m_finalizer_array.clear(); + if (m_chunk_list) { + m_chunk_list->clear(m_chunk_size, reinterpret_cast(m_chunk_list) + sizeof(chunk_list)); } +} + +inline void zone::swap(zone& o) { + using std::swap; + swap(m_chunk_size, o.m_chunk_size); + swap(m_chunk_list, o.m_chunk_list); + swap(m_finalizer_array.m_head, o.m_finalizer_array.m_head); +} + +template +void zone::object_delete(void* obj) { + delete static_cast(obj); +} + +template +void zone::object_destruct(void* obj) { + static_cast(obj)->~T(); +} + +inline void zone::undo_allocate(size_t size) { + chunk_list& cl = get_chank_lst(); + cl.m_ptr -= size; + cl.m_free += size; +} + +inline std::size_t aligned_size(std::size_t size, std::size_t align) { + return (size + align - 1) / align * align; +} - /// @cond +/// @cond - template T* zone::allocate() - { - void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); - try { - m_finalizer_array.push(&zone::object_destruct, x); - } catch (...) { - undo_allocate(sizeof(T)); - throw; - } - try { - return new (x) T(); - } catch (...) { - m_finalizer_array.pop(); - undo_allocate(sizeof(T)); - throw; - } +template +T* zone::allocate() +{ + void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); + try { + m_finalizer_array.push(&zone::object_destruct, x); + } catch (...) { + undo_allocate(sizeof(T)); + RETHROW; } + try { + return new (x) T(); + } catch (...) { + m_finalizer_array.pop(); + undo_allocate(sizeof(T)); + RETHROW; + } +} - template T* zone::allocate(A1 a1) - { - void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); - try { - m_finalizer_array.push(&zone::object_destruct, x); - } catch (...) { - undo_allocate(sizeof(T)); - throw; - } - try { - return new (x) T(a1); - } catch (...) { - m_finalizer_array.pop(); - undo_allocate(sizeof(T)); - throw; - } +template +T* zone::allocate(A1 a1) +{ + void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); + try { + m_finalizer_array.push(&zone::object_destruct, x); + } catch (...) { + undo_allocate(sizeof(T)); + RETHROW; } + try { + return new (x) T(a1); + } catch (...) { + m_finalizer_array.pop(); + undo_allocate(sizeof(T)); + RETHROW; + } +} - template T* zone::allocate(A1 a1, A2 a2) - { - void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); - try { - m_finalizer_array.push(&zone::object_destruct, x); - } catch (...) { - undo_allocate(sizeof(T)); - throw; - } - try { - return new (x) T(a1, a2); - } catch (...) { - m_finalizer_array.pop(); - undo_allocate(sizeof(T)); - throw; - } +template +T* zone::allocate(A1 a1, A2 a2) +{ + void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); + try { + m_finalizer_array.push(&zone::object_destruct, x); + } catch (...) { + undo_allocate(sizeof(T)); + RETHROW; + } + try { + return new (x) T(a1, a2); + } catch (...) { + m_finalizer_array.pop(); + undo_allocate(sizeof(T)); + RETHROW; } +} - template T* zone::allocate(A1 a1, A2 a2, A3 a3) - { - void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); - try { - m_finalizer_array.push(&zone::object_destruct, x); - } catch (...) { - undo_allocate(sizeof(T)); - throw; - } - try { - return new (x) T(a1, a2, a3); - } catch (...) { - m_finalizer_array.pop(); - undo_allocate(sizeof(T)); - throw; - } +template +T* zone::allocate(A1 a1, A2 a2, A3 a3) +{ + void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); + try { + m_finalizer_array.push(&zone::object_destruct, x); + } catch (...) { + undo_allocate(sizeof(T)); + RETHROW; + } + try { + return new (x) T(a1, a2, a3); + } catch (...) { + m_finalizer_array.pop(); + undo_allocate(sizeof(T)); + RETHROW; } +} - template - T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4) - { - void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); - try { - m_finalizer_array.push(&zone::object_destruct, x); - } catch (...) { - undo_allocate(sizeof(T)); - throw; - } - try { - return new (x) T(a1, a2, a3, a4); - } catch (...) { - m_finalizer_array.pop(); - undo_allocate(sizeof(T)); - throw; - } +template +T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4) +{ + void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); + try { + m_finalizer_array.push(&zone::object_destruct, x); + } catch (...) { + undo_allocate(sizeof(T)); + RETHROW; } + try { + return new (x) T(a1, a2, a3, a4); + } catch (...) { + m_finalizer_array.pop(); + undo_allocate(sizeof(T)); + RETHROW; + } +} - template - T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) - { - void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); - try { - m_finalizer_array.push(&zone::object_destruct, x); - } catch (...) { - undo_allocate(sizeof(T)); - throw; - } - try { - return new (x) T(a1, a2, a3, a4, a5); - } catch (...) { - m_finalizer_array.pop(); - undo_allocate(sizeof(T)); - throw; - } +template +T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) +{ + void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); + try { + m_finalizer_array.push(&zone::object_destruct, x); + } catch (...) { + undo_allocate(sizeof(T)); + RETHROW; + } + try { + return new (x) T(a1, a2, a3, a4, a5); + } catch (...) { + m_finalizer_array.pop(); + undo_allocate(sizeof(T)); + RETHROW; } +} - template - T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) - { - void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); - try { - m_finalizer_array.push(&zone::object_destruct, x); - } catch (...) { - undo_allocate(sizeof(T)); - throw; - } - try { - return new (x) T(a1, a2, a3, a4, a5, a6); - } catch (...) { - m_finalizer_array.pop(); - undo_allocate(sizeof(T)); - throw; - } +template +T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) +{ + void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); + try { + m_finalizer_array.push(&zone::object_destruct, x); + } catch (...) { + undo_allocate(sizeof(T)); + RETHROW; } + try { + return new (x) T(a1, a2, a3, a4, a5, a6); + } catch (...) { + m_finalizer_array.pop(); + undo_allocate(sizeof(T)); + RETHROW; + } +} - template - T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) - { - void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); - try { - m_finalizer_array.push(&zone::object_destruct, x); - } catch (...) { - undo_allocate(sizeof(T)); - throw; - } - try { - return new (x) T(a1, a2, a3, a4, a5, a6, a7); - } catch (...) { - m_finalizer_array.pop(); - undo_allocate(sizeof(T)); - throw; - } +template +T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) +{ + void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); + try { + m_finalizer_array.push(&zone::object_destruct, x); + } catch (...) { + undo_allocate(sizeof(T)); + RETHROW; + } + try { + return new (x) T(a1, a2, a3, a4, a5, a6, a7); + } catch (...) { + m_finalizer_array.pop(); + undo_allocate(sizeof(T)); + RETHROW; } +} - template - T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) - { - void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); - try { - m_finalizer_array.push(&zone::object_destruct, x); - } catch (...) { - undo_allocate(sizeof(T)); - throw; - } - try { - return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8); - } catch (...) { - m_finalizer_array.pop(); - undo_allocate(sizeof(T)); - throw; - } +template +T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) +{ + void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); + try { + m_finalizer_array.push(&zone::object_destruct, x); + } catch (...) { + undo_allocate(sizeof(T)); + RETHROW; + } + try { + return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8); + } catch (...) { + m_finalizer_array.pop(); + undo_allocate(sizeof(T)); + RETHROW; } +} - template - T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9) - { - void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); - try { - m_finalizer_array.push(&zone::object_destruct, x); - } catch (...) { - undo_allocate(sizeof(T)); - throw; - } - try { - return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9); - } catch (...) { - m_finalizer_array.pop(); - undo_allocate(sizeof(T)); - throw; - } +template +T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9) +{ + void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); + try { + m_finalizer_array.push(&zone::object_destruct, x); + } catch (...) { + undo_allocate(sizeof(T)); + RETHROW; + } + try { + return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9); + } catch (...) { + m_finalizer_array.pop(); + undo_allocate(sizeof(T)); + RETHROW; } +} - template - T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10) - { - void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); - try { - m_finalizer_array.push(&zone::object_destruct, x); - } catch (...) { - undo_allocate(sizeof(T)); - throw; - } - try { - return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); - } catch (...) { - m_finalizer_array.pop(); - undo_allocate(sizeof(T)); - throw; - } +template +T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10) +{ + void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); + try { + m_finalizer_array.push(&zone::object_destruct, x); + } catch (...) { + undo_allocate(sizeof(T)); + RETHROW; + } + try { + return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); + } catch (...) { + m_finalizer_array.pop(); + undo_allocate(sizeof(T)); + RETHROW; } +} - template - T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11) - { - void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); - try { - m_finalizer_array.push(&zone::object_destruct, x); - } catch (...) { - undo_allocate(sizeof(T)); - throw; - } - try { - return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11); - } catch (...) { - m_finalizer_array.pop(); - undo_allocate(sizeof(T)); - throw; - } +template +T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11) +{ + void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); + try { + m_finalizer_array.push(&zone::object_destruct, x); + } catch (...) { + undo_allocate(sizeof(T)); + RETHROW; + } + try { + return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11); + } catch (...) { + m_finalizer_array.pop(); + undo_allocate(sizeof(T)); + RETHROW; } +} - template - T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12) - { - void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); - try { - m_finalizer_array.push(&zone::object_destruct, x); - } catch (...) { - undo_allocate(sizeof(T)); - throw; - } - try { - return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12); - } catch (...) { - m_finalizer_array.pop(); - undo_allocate(sizeof(T)); - throw; - } +template +T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12) +{ + void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); + try { + m_finalizer_array.push(&zone::object_destruct, x); + } catch (...) { + undo_allocate(sizeof(T)); + RETHROW; + } + try { + return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12); + } catch (...) { + m_finalizer_array.pop(); + undo_allocate(sizeof(T)); + RETHROW; } +} - template - T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12, A13 a13) - { - void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); - try { - m_finalizer_array.push(&zone::object_destruct, x); - } catch (...) { - undo_allocate(sizeof(T)); - throw; - } - try { - return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13); - } catch (...) { - m_finalizer_array.pop(); - undo_allocate(sizeof(T)); - throw; - } +template +T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12, A13 a13) +{ + void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); + try { + m_finalizer_array.push(&zone::object_destruct, x); + } catch (...) { + undo_allocate(sizeof(T)); + RETHROW; + } + try { + return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13); + } catch (...) { + m_finalizer_array.pop(); + undo_allocate(sizeof(T)); + RETHROW; } +} - template - T* zone::allocate( - A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12, A13 a13, A14 a14) - { - void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); - try { - m_finalizer_array.push(&zone::object_destruct, x); - } catch (...) { - undo_allocate(sizeof(T)); - throw; - } - try { - return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14); - } catch (...) { - m_finalizer_array.pop(); - undo_allocate(sizeof(T)); - throw; - } +template +T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12, A13 a13, A14 a14) +{ + void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); + try { + m_finalizer_array.push(&zone::object_destruct, x); + } catch (...) { + undo_allocate(sizeof(T)); + RETHROW; + } + try { + return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14); + } catch (...) { + m_finalizer_array.pop(); + undo_allocate(sizeof(T)); + RETHROW; } +} - template - T* zone::allocate(A1 a1, - A2 a2, - A3 a3, - A4 a4, - A5 a5, - A6 a6, - A7 a7, - A8 a8, - A9 a9, - A10 a10, - A11 a11, - A12 a12, - A13 a13, - A14 a14, - A15 a15) - { - void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); - try { - m_finalizer_array.push(&zone::object_destruct, x); - } catch (...) { - undo_allocate(sizeof(T)); - throw; - } - try { - return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15); - } catch (...) { - m_finalizer_array.pop(); - undo_allocate(sizeof(T)); - throw; - } +template +T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12, A13 a13, A14 a14, A15 a15) +{ + void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); + try { + m_finalizer_array.push(&zone::object_destruct, x); + } catch (...) { + undo_allocate(sizeof(T)); + RETHROW; + } + try { + return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15); + } catch (...) { + m_finalizer_array.pop(); + undo_allocate(sizeof(T)); + RETHROW; } +} - /// @endcond +/// @endcond - /// @cond -} // MSGPACK_API_VERSION_NAMESPACE(v1) +/// @cond +} // MSGPACK_API_VERSION_NAMESPACE(v1) /// @endcond -} // namespace msgpack +} // namespace msgpack #endif // MSGPACK_V1_CPP03_ZONE_HPP diff --git a/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/detail/cpp11_zone.hpp b/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/detail/cpp11_zone.hpp index 40b50511c24..65572279759 100644 --- a/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/detail/cpp11_zone.hpp +++ b/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/detail/cpp11_zone.hpp @@ -10,10 +10,10 @@ #ifndef MSGPACK_CPP11_ZONE_HPP #define MSGPACK_CPP11_ZONE_HPP -#include "msgpack/assert.hpp" -#include "msgpack/cpp_config.hpp" #include "msgpack/versioning.hpp" +#include "msgpack/cpp_config.hpp" #include "msgpack/zone_decl.hpp" +#include "msgpack/assert.hpp" #include #include @@ -23,331 +23,312 @@ namespace msgpack { /// @cond -MSGPACK_API_VERSION_NAMESPACE(v1) -{ - /// @endcond - - class zone { - private: - struct finalizer { - finalizer(void (*func)(void*), void* data, finalizer* next) - : m_func(func) - , m_data(data) - , m_next(next) - {} - void operator()() { m_func(m_data); } - void (*m_func)(void*); - void* m_data; - finalizer* m_next; - }; - - struct finalizer_array { - finalizer_array() - : m_head(MSGPACK_NULLPTR) - {} - - ~finalizer_array() { clear(); } - - void clear() - { - finalizer* fin = m_head; - finalizer* tmp = MSGPACK_NULLPTR; - while (fin) { - (*fin)(); - tmp = fin; - fin = fin->m_next; - delete tmp; - } - m_head = MSGPACK_NULLPTR; - } - - void push(void (*func)(void* data), void* data) { m_head = new finalizer(func, data, m_head); } - - void pop() - { - auto n = m_head->m_next; - delete m_head; - m_head = n; - } +MSGPACK_API_VERSION_NAMESPACE(v1) { +/// @endcond - finalizer_array(finalizer_array&& other) noexcept - : m_head(other.m_head) - { - other.m_head = MSGPACK_NULLPTR; - } +class zone { +private: + struct finalizer { + finalizer(void (*func)(void*), void* data, finalizer* next): m_func(func), m_data(data), m_next(next) {} + void operator()() { m_func(m_data); } + void (*m_func)(void*); + void* m_data; + finalizer* m_next; + }; - finalizer_array& operator=(finalizer_array&& other) noexcept - { - m_head = other.m_head; - other.m_head = MSGPACK_NULLPTR; - return *this; - } + struct finalizer_array { + finalizer_array(): m_head(MSGPACK_NULLPTR) {} - private: - finalizer* m_head; - finalizer_array(const finalizer_array&); - finalizer_array& operator=(const finalizer_array&); - }; - - struct chunk { - chunk* m_next; - }; - - struct chunk_list { - chunk_list(size_t chunk_size, char* ptr) - : m_free(chunk_size) - , m_ptr(ptr) - , m_head(MSGPACK_NULLPTR) - {} - ~chunk_list() - { - chunk* c = m_head; - while (c) { - chunk* n = c->m_next; - ::free(c); - c = n; - } - m_head = MSGPACK_NULLPTR; - } + ~finalizer_array() { + clear(); + } - void clear(size_t chunk_size, char* ptr) - { - chunk* c = m_head; - while (c) { - chunk* n = c->m_next; - ::free(c); - c = n; - } - m_head = MSGPACK_NULLPTR; - m_free = chunk_size; - m_ptr = ptr; + void clear() { + finalizer* fin = m_head; + finalizer* tmp = MSGPACK_NULLPTR; + while(fin) { + (*fin)(); + tmp = fin; + fin = fin->m_next; + delete tmp; } + m_head = MSGPACK_NULLPTR; + } - size_t m_free; - char* m_ptr; - chunk* m_head; - - private: - chunk_list(chunk_list&& other) noexcept = delete; - chunk_list& operator=(chunk_list&& other) noexcept = delete; - chunk_list(const chunk_list&); - chunk_list& operator=(const chunk_list&); - }; - - size_t m_chunk_size; - chunk_list* m_chunk_list{}; - finalizer_array m_finalizer_array; - - public: - zone(size_t chunk_size = MSGPACK_ZONE_CHUNK_SIZE); - ~zone(); - - void* allocate_align(size_t size, size_t align = MSGPACK_ZONE_ALIGN); + void push(void (*func)(void* data), void* data) { + m_head = new finalizer(func, data, m_head); + } - void* allocate_no_align(size_t size); + void pop() { + auto n = m_head->m_next; + delete m_head; + m_head = n; + } - bool allocated() { return m_chunk_list != MSGPACK_NULLPTR; } + finalizer_array(finalizer_array&& other) noexcept: m_head(other.m_head) { + other.m_head = MSGPACK_NULLPTR; + } - void push_finalizer(void (*func)(void*), void* data); + finalizer_array& operator=(finalizer_array&& other) noexcept { + m_head = other.m_head; + other.m_head = MSGPACK_NULLPTR; + return *this; + } - template void push_finalizer(msgpack::unique_ptr obj); + private: + finalizer* m_head; + finalizer_array(const finalizer_array&); + finalizer_array& operator=(const finalizer_array&); + }; - void clear(); + struct chunk { + chunk* m_next; + }; - void swap(zone& o); + struct chunk_list { + chunk_list(size_t chunk_size, char* ptr): m_free(chunk_size), m_ptr(ptr), m_head(MSGPACK_NULLPTR) {} + ~chunk_list() { + chunk* c = m_head; + while(c) { + chunk* n = c->m_next; + ::free(c); + c = n; + } + m_head = MSGPACK_NULLPTR; + } - static void* operator new(std::size_t size) - { - void* p = ::malloc(size); - if (!p) - THROW std::bad_alloc(); - return p; + void clear(size_t chunk_size, char* ptr) { + chunk* c = m_head; + while(c) { + chunk* n = c->m_next; + ::free(c); + c = n; + } + m_head = MSGPACK_NULLPTR; + m_free = chunk_size; + m_ptr = ptr; } - static void operator delete(void* p) noexcept { ::free(p); } + size_t m_free; + char* m_ptr; + chunk* m_head; - static void* operator new(std::size_t /*size*/, void* mem) noexcept { return mem; } + private: + chunk_list(chunk_list&& other) noexcept = delete; + chunk_list& operator=(chunk_list&& other) noexcept = delete; + chunk_list(const chunk_list&); + chunk_list& operator=(const chunk_list&); + }; - static void operator delete(void* /*p*/, void* /*mem*/) noexcept {} + size_t m_chunk_size; + chunk_list* m_chunk_list{}; + finalizer_array m_finalizer_array; - template T* allocate(Args... args); +public: + zone(size_t chunk_size = MSGPACK_ZONE_CHUNK_SIZE); + ~zone(); - zone(zone&&) = default; - zone& operator=(zone&&) = default; - zone(const zone&) = delete; - zone& operator=(const zone&) = delete; + void* allocate_align(size_t size, size_t align = MSGPACK_ZONE_ALIGN); - private: - void undo_allocate(size_t size); + void* allocate_no_align(size_t size); - template static void object_destruct(void* obj); + bool allocated() { + return m_chunk_list != MSGPACK_NULLPTR; + } - template static void object_delete(void* obj); + void push_finalizer(void (*func)(void*), void* data); - static char* get_aligned(char* ptr, size_t align); + template + void push_finalizer(msgpack::unique_ptr obj); - chunk_list& get_chank_lst(); + void clear(); - char* allocate_expand(size_t size); - }; + void swap(zone& o); - inline zone::zone(size_t chunk_size) - : m_chunk_size(chunk_size) - , m_chunk_list(MSGPACK_NULLPTR) - {} - - inline zone::~zone() - { - m_finalizer_array.~finalizer_array(); - if (m_chunk_list) { - m_chunk_list->~chunk_list(); - ::free(m_chunk_list); - m_chunk_list = MSGPACK_NULLPTR; - } + static void* operator new(std::size_t size) { + void* p = ::malloc(size); + if (!p) THROW std::bad_alloc(); + return p; } - inline char* zone::get_aligned(char* ptr, size_t align) - { - MSGPACK_ASSERT(align != 0 && (align & (align - 1)) == 0); // align must be 2^n (n >= 0) - return reinterpret_cast(reinterpret_cast(ptr + (align - 1)) & - ~static_cast(align - 1)); + static void operator delete(void *p) noexcept { + ::free(p); } - inline zone::chunk_list& zone::get_chank_lst() - { - if (!m_chunk_list) { - auto ptr = ::malloc(sizeof(chunk_list) + m_chunk_size); - if (!ptr) - THROW std::bad_alloc(); - m_chunk_list = new (ptr) chunk_list(m_chunk_size, reinterpret_cast(ptr) + sizeof(chunk_list)); - } - return *m_chunk_list; + static void* operator new(std::size_t /*size*/, void* mem) noexcept { + return mem; } - inline void* zone::allocate_align(size_t size, size_t align) - { - chunk_list& chank_lst = get_chank_lst(); - char* aligned = get_aligned(chank_lst.m_ptr, align); - size_t adjusted_size = size + static_cast(aligned - chank_lst.m_ptr); - if (chank_lst.m_free < adjusted_size) { - size_t enough_size = size + align - 1; - char* ptr = allocate_expand(enough_size); - aligned = get_aligned(ptr, align); - adjusted_size = size + static_cast(aligned - chank_lst.m_ptr); - } - chank_lst.m_free -= adjusted_size; - chank_lst.m_ptr += adjusted_size; - return aligned; - } + static void operator delete(void * /*p*/, void* /*mem*/) noexcept {} - inline void* zone::allocate_no_align(size_t size) - { - chunk_list& chank_lst = get_chank_lst(); - char* ptr = chank_lst.m_ptr; - if (chank_lst.m_free < size) { - ptr = allocate_expand(size); - } - chank_lst.m_free -= size; - chank_lst.m_ptr += size; + template + T* allocate(Args... args); - return ptr; - } + zone(zone&&) = default; + zone& operator=(zone&&) = default; + zone(const zone&) = delete; + zone& operator=(const zone&) = delete; - inline char* zone::allocate_expand(size_t size) - { - chunk_list& cl = get_chank_lst(); - size_t sz = m_chunk_size; +private: + void undo_allocate(size_t size); - while (sz < size) { - size_t tmp_sz = sz * 2; - if (tmp_sz <= sz) { - sz = size; - break; - } - sz = tmp_sz; - } + template + static void object_destruct(void* obj); - chunk* c = static_cast(::malloc(sizeof(chunk) + sz)); - if (!c) - THROW std::bad_alloc(); + template + static void object_delete(void* obj); - char* ptr = reinterpret_cast(c) + sizeof(chunk); + static char* get_aligned(char* ptr, size_t align); - c->m_next = cl.m_head; - cl.m_head = c; - cl.m_free = sz; - cl.m_ptr = ptr; + chunk_list& get_chank_lst(); - return ptr; - } + char* allocate_expand(size_t size); +}; - inline void zone::push_finalizer(void (*func)(void*), void* data) - { - m_finalizer_array.push(func, data); - } +inline zone::zone(size_t chunk_size):m_chunk_size(chunk_size), m_chunk_list(MSGPACK_NULLPTR) {} - template inline void zone::push_finalizer(msgpack::unique_ptr obj) - { - m_finalizer_array.push(&zone::object_delete, obj.release()); +inline zone::~zone() { + m_finalizer_array.~finalizer_array(); + if(m_chunk_list) { + m_chunk_list->~chunk_list(); + ::free(m_chunk_list); + m_chunk_list = MSGPACK_NULLPTR; + } +} + +inline char* zone::get_aligned(char* ptr, size_t align) { + MSGPACK_ASSERT(align != 0 && (align & (align - 1)) == 0); // align must be 2^n (n >= 0) + return + reinterpret_cast( + reinterpret_cast(ptr + (align - 1)) & ~static_cast(align - 1) + ); +} + +inline zone::chunk_list& zone::get_chank_lst() { + if (!m_chunk_list) { + auto ptr = ::malloc(sizeof(chunk_list) + m_chunk_size); + if (!ptr) + THROW std::bad_alloc(); + m_chunk_list = new (ptr) chunk_list(m_chunk_size, reinterpret_cast(ptr) + sizeof(chunk_list)); + } + return *m_chunk_list; +} + +inline void* zone::allocate_align(size_t size, size_t align) { + chunk_list& chank_lst = get_chank_lst(); + char* aligned = get_aligned(chank_lst.m_ptr, align); + size_t adjusted_size = size + static_cast(aligned - chank_lst.m_ptr); + if (chank_lst.m_free < adjusted_size) { + size_t enough_size = size + align - 1; + char* ptr = allocate_expand(enough_size); + aligned = get_aligned(ptr, align); + adjusted_size = size + static_cast(aligned - chank_lst.m_ptr); } + chank_lst.m_free -= adjusted_size; + chank_lst.m_ptr += adjusted_size; + return aligned; +} + +inline void* zone::allocate_no_align(size_t size) { + chunk_list& chank_lst = get_chank_lst(); + char* ptr = chank_lst.m_ptr; + if(chank_lst.m_free < size) { + ptr = allocate_expand(size); + } + chank_lst.m_free -= size; + chank_lst.m_ptr += size; + + return ptr; +} - inline void zone::clear() - { - m_finalizer_array.clear(); - if (m_chunk_list) { - m_chunk_list->clear(m_chunk_size, reinterpret_cast(m_chunk_list) + sizeof(chunk_list)); +inline char* zone::allocate_expand(size_t size) { + chunk_list& cl = get_chank_lst(); + size_t sz = m_chunk_size; + + while(sz < size) { + size_t tmp_sz = sz * 2; + if (tmp_sz <= sz) { + sz = size; + break; } + sz = tmp_sz; } - inline void zone::swap(zone & o) - { - std::swap(*this, o); - } + chunk* c = static_cast(::malloc(sizeof(chunk) + sz)); + if (!c) THROW std::bad_alloc(); - template void zone::object_delete(void* obj) - { - delete static_cast(obj); - } + char* ptr = reinterpret_cast(c) + sizeof(chunk); - template void zone::object_destruct(void* obj) - { - static_cast(obj)->~T(); - } + c->m_next = cl.m_head; + cl.m_head = c; + cl.m_free = sz; + cl.m_ptr = ptr; - inline void zone::undo_allocate(size_t size) - { - chunk_list& cl = get_chank_lst(); - cl.m_ptr -= size; - cl.m_free += size; - } + return ptr; +} - inline std::size_t aligned_size(std::size_t size, std::size_t align) - { - return (size + align - 1) / align * align; - } +inline void zone::push_finalizer(void (*func)(void*), void* data) { + m_finalizer_array.push(func, data); +} - template T* zone::allocate(Args... args) - { - void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); - try { - m_finalizer_array.push(&zone::object_destruct, x); - } catch (...) { - undo_allocate(sizeof(T)); - RETHROW; - } - try { - return new (x) T(args...); - } catch (...) { - m_finalizer_array.pop(); - undo_allocate(sizeof(T)); - RETHROW; - } +template +inline void zone::push_finalizer(msgpack::unique_ptr obj) { + m_finalizer_array.push(&zone::object_delete, obj.release()); +} + +inline void zone::clear() { + m_finalizer_array.clear(); + if (m_chunk_list) { + m_chunk_list->clear(m_chunk_size, reinterpret_cast(m_chunk_list) + sizeof(chunk_list)); } +} + +inline void zone::swap(zone& o) { + std::swap(*this, o); +} + +template +void zone::object_delete(void* obj) { + delete static_cast(obj); +} + +template +void zone::object_destruct(void* obj) { + static_cast(obj)->~T(); +} + +inline void zone::undo_allocate(size_t size) { + chunk_list& cl = get_chank_lst(); + cl.m_ptr -= size; + cl.m_free += size; +} + +inline std::size_t aligned_size(std::size_t size, std::size_t align) { + return (size + align - 1) / align * align; +} + +template +T* zone::allocate(Args... args) { + void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); + try { + m_finalizer_array.push(&zone::object_destruct, x); + } catch (...) { + undo_allocate(sizeof(T)); + RETHROW; + } + try { + return new (x) T(args...); + } catch (...) { + m_finalizer_array.pop(); + undo_allocate(sizeof(T)); + RETHROW; + } +} - /// @cond -} // MSGPACK_API_VERSION_NAMESPACE(v1) +/// @cond +} // MSGPACK_API_VERSION_NAMESPACE(v1) /// @endcond -} // namespace msgpack +} // namespace msgpack #endif // MSGPACK_CPP11_ZONE_HPP diff --git a/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/object_fwd.hpp b/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/object_fwd.hpp index 83a9880c55a..951dca0e108 100644 --- a/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/object_fwd.hpp +++ b/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/object_fwd.hpp @@ -16,216 +16,232 @@ namespace msgpack { /// @cond -MSGPACK_API_VERSION_NAMESPACE(v1) -{ - /// @endcond +MSGPACK_API_VERSION_NAMESPACE(v1) { +/// @endcond - struct object_array { - uint32_t size; - msgpack::object* ptr; - }; +struct object_array { + uint32_t size; + msgpack::object* ptr; +}; - struct object_map { - uint32_t size; - msgpack::object_kv* ptr; - }; +struct object_map { + uint32_t size; + msgpack::object_kv* ptr; +}; - struct object_str { - uint32_t size; - const char* ptr; - }; +struct object_str { + uint32_t size; + const char* ptr; +}; - struct object_bin { - uint32_t size; - const char* ptr; - }; +struct object_bin { + uint32_t size; + const char* ptr; +}; + +struct object_ext { + int8_t type() const { return static_cast(ptr[0]); } + const char* data() const { return &ptr[1]; } + uint32_t size; + const char* ptr; +}; - struct object_ext { - int8_t type() const { return static_cast(ptr[0]); } - const char* data() const { return &ptr[1]; } - uint32_t size; - const char* ptr; - }; #if !defined(MSGPACK_USE_CPP03) - template struct has_as { - private: - template - static auto check_(U*) -> - // Check v1 specialization - typename std::is_same()(std::declval())), T>::type; - template static std::false_type check_(...); - - public: - using type = decltype(check_(MSGPACK_NULLPTR)); - static constexpr bool value = type::value; - }; +template +struct has_as { +private: + template + static auto check_(U*) -> + // Check v1 specialization + typename std::is_same< + decltype(adaptor::as()(std::declval())), + T + >::type; + template + static std::false_type check_(...); +public: + using type = decltype(check_(MSGPACK_NULLPTR)); + static constexpr bool value = type::value; +}; #endif // !defined(MSGPACK_USE_CPP03) - /// Object class that corresponding to MessagePack format object +/// Object class that corresponding to MessagePack format object +/** + * See https://github.com/msgpack/msgpack-c/wiki/v1_1_cpp_object + */ +struct object { + union union_type { + bool boolean; + uint64_t u64; + int64_t i64; +#if defined(MSGPACK_USE_LEGACY_NAME_AS_FLOAT) + MSGPACK_DEPRECATED("please use f64 instead") + double dec; // obsolete +#endif // MSGPACK_USE_LEGACY_NAME_AS_FLOAT + double f64; + msgpack::object_array array; + msgpack::object_map map; + msgpack::object_str str; + msgpack::object_bin bin; + msgpack::object_ext ext; + }; + + msgpack::type::object_type type; + union_type via; + + /// Cheking nil /** - * See https://github.com/msgpack/msgpack-c/wiki/v1_1_cpp_object + * @return If the object is nil, then return true, else return false. */ - struct object { - union union_type { - bool boolean; - uint64_t u64; - int64_t i64; -#if defined(MSGPACK_USE_LEGACY_NAME_AS_FLOAT) - MSGPACK_DEPRECATED("please use f64 instead") - double dec; // obsolete -#endif // MSGPACK_USE_LEGACY_NAME_AS_FLOAT - double f64; - msgpack::object_array array; - msgpack::object_map map; - msgpack::object_str str; - msgpack::object_bin bin; - msgpack::object_ext ext; - }; - - msgpack::type::object_type type; - union_type via; - - /// Cheking nil - /** - * @return If the object is nil, then return true, else return false. - */ - bool is_nil() const { return type == msgpack::type::NIL; } + bool is_nil() const { return type == msgpack::type::NIL; } #if defined(MSGPACK_USE_CPP03) - /// Get value as T - /** - * If the object can't be converted to T, msgpack::type_error would be thrown. - * @tparam T The type you want to get. - * @return The converted object. - */ - template T as() const; - -#else // defined(MSGPACK_USE_CPP03) - - /// Get value as T - /** - * If the object can't be converted to T, msgpack::type_error would be thrown. - * @tparam T The type you want to get. - * @return The converted object. - */ - template typename std::enable_if::value, T>::type as() const; - - /// Get value as T - /** - * If the object can't be converted to T, msgpack::type_error would be thrown. - * @tparam T The type you want to get. - * @return The converted object. - */ - template typename std::enable_if::value, T>::type as() const; + /// Get value as T + /** + * If the object can't be converted to T, msgpack::type_error would be thrown. + * @tparam T The type you want to get. + * @return The converted object. + */ + template + T as() const; + +#else // defined(MSGPACK_USE_CPP03) + + /// Get value as T + /** + * If the object can't be converted to T, msgpack::type_error would be thrown. + * @tparam T The type you want to get. + * @return The converted object. + */ + template + typename std::enable_if::value, T>::type as() const; + + /// Get value as T + /** + * If the object can't be converted to T, msgpack::type_error would be thrown. + * @tparam T The type you want to get. + * @return The converted object. + */ + template + typename std::enable_if::value, T>::type as() const; #endif // defined(MSGPACK_USE_CPP03) - /// Convert the object - /** - * If the object can't be converted to T, msgpack::type_error would be thrown. - * @tparam T The type of v. - * @param v The value you want to get. `v` is output parameter. `v` is overwritten by converted value from the - * object. - * @return The reference of `v`. - */ - template - typename msgpack::enable_if::value && !msgpack::is_pointer::value, T&>::type convert( - T& v) const; + /// Convert the object + /** + * If the object can't be converted to T, msgpack::type_error would be thrown. + * @tparam T The type of v. + * @param v The value you want to get. `v` is output parameter. `v` is overwritten by converted value from the object. + * @return The reference of `v`. + */ + template + typename msgpack::enable_if< + !msgpack::is_array::value && !msgpack::is_pointer::value, + T& + >::type + convert(T& v) const; + + template + T (&convert(T(&v)[N]) const)[N]; - template T (&convert(T (&v)[N]) const)[N]; #if !defined(MSGPACK_DISABLE_LEGACY_CONVERT) - /// Convert the object (obsolete) - /** - * If the object can't be converted to T, msgpack::type_error would be thrown. - * @tparam T The type of v. - * @param v The pointer of the value you want to get. `v` is output parameter. `*v` is overwritten by converted - * value from the object. - * @return The pointer of `v`. - */ - template - MSGPACK_DEPRECATED("please use reference version instead") - typename msgpack::enable_if::value, T>::type convert(T v) const; + /// Convert the object (obsolete) + /** + * If the object can't be converted to T, msgpack::type_error would be thrown. + * @tparam T The type of v. + * @param v The pointer of the value you want to get. `v` is output parameter. `*v` is overwritten by converted value from the object. + * @return The pointer of `v`. + */ + template + MSGPACK_DEPRECATED("please use reference version instead") + typename msgpack::enable_if< + msgpack::is_pointer::value, + T + >::type + convert(T v) const; #endif // !defined(MSGPACK_DISABLE_LEGACY_CONVERT) - /// Convert the object if not nil - /** - * If the object is not nil and can't be converted to T, msgpack::type_error would be thrown. - * @tparam T The type of v. - * @param v The value you want to get. `v` is output parameter. `v` is overwritten by converted value from the - * object if the object is not nil. - * @return If the object is nil, then return false, else return true. - */ - template bool convert_if_not_nil(T& v) const; - - /// Default constructor. The object is set to nil. - object(); - - /// Construct object from T - /** - * If `v` is the type that is corresponding to MessegePack format str, bin, ext, array, or map, - * you need to call `object(const T& v, msgpack::zone& z)` instead of this constructor. - * - * @tparam T The type of `v`. - * @param v The value you want to convert. - */ - template explicit object(const T& v); - - /// Construct object from T - /** - * The object is constructed on the zone `z`. - * See https://github.com/msgpack/msgpack-c/wiki/v1_1_cpp_object - * - * @tparam T The type of `v`. - * @param v The value you want to convert. - * @param z The zone that is used by the object. - */ - template object(const T& v, msgpack::zone& z); - - /// Construct object from T (obsolete) - /** - * The object is constructed on the zone `z`. - * Use `object(const T& v, msgpack::zone& z)` instead of this constructor. - * See https://github.com/msgpack/msgpack-c/wiki/v1_1_cpp_object - * - * @tparam T The type of `v`. - * @param v The value you want to convert. - * @param z The pointer to the zone that is used by the object. - */ - template - MSGPACK_DEPRECATED("please use zone reference version instead of the pointer version") - object(const T& v, msgpack::zone* z); - - template object& operator=(const T& v); - - struct with_zone; - - protected: - struct implicit_type; - - public: - implicit_type convert() const; - }; + /// Convert the object if not nil + /** + * If the object is not nil and can't be converted to T, msgpack::type_error would be thrown. + * @tparam T The type of v. + * @param v The value you want to get. `v` is output parameter. `v` is overwritten by converted value from the object if the object is not nil. + * @return If the object is nil, then return false, else return true. + */ + template + bool convert_if_not_nil(T& v) const; - class type_error : public std::bad_cast {}; + /// Default constructor. The object is set to nil. + object(); - struct object::implicit_type { - implicit_type(object const& o) - : obj(o) - {} - ~implicit_type() {} + /// Construct object from T + /** + * If `v` is the type that is corresponding to MessegePack format str, bin, ext, array, or map, + * you need to call `object(const T& v, msgpack::zone& z)` instead of this constructor. + * + * @tparam T The type of `v`. + * @param v The value you want to convert. + */ + template + explicit object(const T& v); - template operator T(); + /// Construct object from T + /** + * The object is constructed on the zone `z`. + * See https://github.com/msgpack/msgpack-c/wiki/v1_1_cpp_object + * + * @tparam T The type of `v`. + * @param v The value you want to convert. + * @param z The zone that is used by the object. + */ + template + object(const T& v, msgpack::zone& z); - private: - object const& obj; - }; + /// Construct object from T (obsolete) + /** + * The object is constructed on the zone `z`. + * Use `object(const T& v, msgpack::zone& z)` instead of this constructor. + * See https://github.com/msgpack/msgpack-c/wiki/v1_1_cpp_object + * + * @tparam T The type of `v`. + * @param v The value you want to convert. + * @param z The pointer to the zone that is used by the object. + */ + template + MSGPACK_DEPRECATED("please use zone reference version instead of the pointer version") + object(const T& v, msgpack::zone* z); + + template + object& operator=(const T& v); + + struct with_zone; + +protected: + struct implicit_type; - /// @cond +public: + implicit_type convert() const; +}; + +class type_error : public std::bad_cast { }; + +struct object::implicit_type { + implicit_type(object const& o) : obj(o) { } + ~implicit_type() { } + + template + operator T(); + +private: + object const& obj; +}; + +/// @cond } // MSGPACK_API_VERSION_NAMESPACE(v1) /// @endcond diff --git a/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/pack.hpp b/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/pack.hpp index 4a3c5aa9e9f..41cff85f800 100644 --- a/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/pack.hpp +++ b/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/pack.hpp @@ -12,1630 +12,1648 @@ #include "msgpack/v1/pack_decl.hpp" -#include -#include +#include #include +#include +#include #include -#include namespace msgpack { /// @cond -MSGPACK_API_VERSION_NAMESPACE(v1) -{ - /// @endcond +MSGPACK_API_VERSION_NAMESPACE(v1) { +/// @endcond - /// The class template that supports continuous packing. +/// The class template that supports continuous packing. +/** + * @tparam Stream Any type that have a member function `Stream write(const char*, size_t s)` + * + */ +template +class packer { +public: + /// Constructor /** - * @tparam Stream Any type that have a member function `Stream write(const char*, size_t s)` + * This constructor is left for compatibility. + * Use `packer(Stream& s)` instead of the constructor. * + * @param s A pointer to packing destination stream object. */ - template class packer { - public: - /// Constructor - /** - * This constructor is left for compatibility. - * Use `packer(Stream& s)` instead of the constructor. - * - * @param s A pointer to packing destination stream object. - */ - packer(Stream* s); - /// Constructor - /** - * @param s Packing destination stream object. - */ - packer(Stream& s); - - public: - /// Packing function template - /** - * @tparam T The type of packing object. - * - * @param v a packing object. - * - * @return The reference of `*this`. - */ - template packer& pack(const T& v); - - /// Packing uint8 - /** - * The byte size of the packed data depends on `d`. - * The packed type is positive fixnum or uint8. - * The minimum byte size expression is used. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_uint8(uint8_t d); - - /// Packing uint16 - /** - * The byte size of the packed data depends on `d`. - * The packed type is positive fixnum, uint8 or uint16. - * The minimum byte size expression is used. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_uint16(uint16_t d); - - /// Packing uint32 - /** - * The byte size of the packed data depends on `d`. - * The packed type is positive fixnum, uint8, uint16 or uint32. - * The minimum byte size expression is used. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_uint32(uint32_t d); - - /// Packing uint16 - /** - * The byte size of the packed data depends on `d`. - * The packed type is positive fixnum, uint8, uint16, uint32 or uint64. - * The minimum byte size expression is used. - * positive fixnum, uint8, uint16, or uint32 is used. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_uint64(uint64_t d); - - /// Packing int8 - /** - * The byte size of the packed data depends on `d`. - * If `d` is zero or positive, the packed type is positive fixnum, or uint8, - * else the packed type is negative fixnum, or int8 - * The minimum byte size expression is used. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_int8(int8_t d); - - /// Packing int16 - /** - * The byte size of the packed data depends on `d`. - * If `d` is zero or positive, the packed type is positive fixnum, uint8, or uint16, - * else the packed type is negative fixnum, int8, or int16. - * The minimum byte size expression is used. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_int16(int16_t d); - - /// Packing int32 - /** - * The byte size of the packed data depends on `d`. - * If `d` is zero or positive, the packed type is positive fixnum, uint8, uint16, or uint32, - * else the packed type is negative fixnum, int8, int16, or int32. - * The minimum byte size expression is used. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_int32(int32_t d); - - /// Packing int32 - /** - * The byte size of the packed data depends on `d`. - * If `d` is zero or positive, the packed type is positive fixnum, uint8, uint16, uint32, or uint64, - * else the packed type is negative fixnum, int8, int16, int32, or int64. - * The minimum byte size expression is used. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_int64(int64_t d); - - /// Packing uint8 (fixed packed type). - /** - * The packed type is always uint8. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_fix_uint8(uint8_t d); - - /// Packing uint8 (fixed packed type). - /** - * The packed type is always uint16. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_fix_uint16(uint16_t d); - - /// Packing uint8 (fixed packed type). - /** - * The packed type is always uint32. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_fix_uint32(uint32_t d); - - /// Packing uint8 (fixed packed type). - /** - * The packed type is always uint64. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_fix_uint64(uint64_t d); - - /// Packing uint8 (fixed packed type). - /** - * The packed type is always int8. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_fix_int8(int8_t d); - - /// Packing uint8 (fixed packed type). - /** - * The packed type is always int16. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_fix_int16(int16_t d); - - /// Packing uint8 (fixed packed type). - /** - * The packed type is always int32. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_fix_int32(int32_t d); - - /// Packing uint8 (fixed packed type). - /** - * The packed type is always int64. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_fix_int64(int64_t d); - - /// Packing char - /** - * The byte size of the packed data depends on `d`. - * If `d` is zero or positive, the packed type is positive fixnum, or uint*, - * else the packed type is negative fixnum, or int* - * The minimum byte size expression is used. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_char(char d); - - /// Packing wchar_t - /** - * The byte size of the packed data depends on `d`. - * If `d` is zero or positive, the packed type is positive fixnum, or uint*, - * else the packed type is negative fixnum, or int* - * The minimum byte size expression is used. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_wchar(wchar_t d); - - /// Packing signed char - /** - * The byte size of the packed data depends on `d`. - * If `d` is zero or positive, the packed type is positive fixnum, or uint*, - * else the packed type is negative fixnum, or int* - * The minimum byte size expression is used. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_signed_char(signed char d); - - /// Packing short - /** - * The byte size of the packed data depends on `d`. - * If `d` is zero or positive, the packed type is positive fixnum, or uint*, - * else the packed type is negative fixnum, or int* - * The minimum byte size expression is used. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_short(short d); - - /// Packing int - /** - * The byte size of the packed data depends on `d`. - * If `d` is zero or positive, the packed type is positive fixnum, or uint*, - * else the packed type is negative fixnum, or int* - * The minimum byte size expression is used. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_int(int d); - - /// Packing long - /** - * The byte size of the packed data depends on `d`. - * If `d` is zero or positive, the packed type is positive fixnum, or uint*, - * else the packed type is negative fixnum, or int* - * The minimum byte size expression is used. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_long(long d); - - /// Packing long long - /** - * The byte size of the packed data depends on `d`. - * If `d` is zero or positive, the packed type is positive fixnum, or uint*, - * else the packed type is negative fixnum, or int* - * The minimum byte size expression is used. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_long_long(long long d); - - /// Packing unsigned char - /** - * The byte size of the packed data depends on `d`. - * The packed type is positive fixnum, or uint*. - * The minimum byte size expression is used. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_unsigned_char(unsigned char d); - - /// Packing unsigned short - /** - * The byte size of the packed data depends on `d`. - * The packed type is positive fixnum, or uint*. - * The minimum byte size expression is used. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_unsigned_short(unsigned short d); - - /// Packing unsigned int - /** - * The byte size of the packed data depends on `d`. - * The packed type is positive fixnum, or uint*. - * The minimum byte size expression is used. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_unsigned_int(unsigned int d); - - /// Packing unsigned long - /** - * The byte size of the packed data depends on `d`. - * The packed type is positive fixnum, or uint*. - * The minimum byte size expression is used. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_unsigned_long(unsigned long d); - - /// Packing unsigned long long - /** - * The byte size of the packed data depends on `d`. - * The packed type is positive fixnum, or uint*. - * The minimum byte size expression is used. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_unsigned_long_long(unsigned long long d); - - /// Packing float - /** - * The packed type is float32. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-float - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_float(float d); - - /// Packing double - /** - * The packed type is float64. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-float - * - * @param d a packing object. - * - * @return The reference of `*this`. - */ - packer& pack_double(double d); - - /// Packing nil - /** - * The packed type is nil. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-nil - * - * @return The reference of `*this`. - */ - packer& pack_nil(); - - /// Packing true - /** - * The packed type is bool, value is true. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#bool-format-family - * - * @return The reference of `*this`. - */ - packer& pack_true(); - - /// Packing false - /** - * The packed type is bool, value is false. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#bool-format-family - * - * @return The reference of `*this`. - */ - packer& pack_false(); - - /// Packing array header and size - /** - * The packed type is array header and array size. - * You need to pack `n` msgpack objects following this header and size. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#array-format-family - * - * @param n The number of array elements (array size). - * - * @return The reference of `*this`. - */ - packer& pack_array(uint32_t n); - - /// Packing map header and size - /** - * The packed type is map header and map size. - * You need to pack `n` pairs of msgpack objects following this header and size. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#map-format-family - * - * @param n The number of array elements (array size). - * - * @return The reference of `*this`. - */ - packer& pack_map(uint32_t n); - - /// Packing str header and length - /** - * The packed type is str header and length. - * The minimum byte size length expression is used. - * You need to call `pack_str_body(const char* b, uint32_t l)` after this function calling with the same `l` - * value. See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-str - * - * @param l The length of string. - * - * @return The reference of `*this`. - */ - packer& pack_str(uint32_t l); - - /// Packing str body - /** - * You need to call this function just after `pack_str(uint32_t l)` calling. - * The value `l` should be the same as `pack_str(uint32_t l)` argument `l`. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-str - * - * @param l The length of string. - * - * @return The reference of `*this`. - */ - packer& pack_str_body(const char* b, uint32_t l); - - /// Packing raw (v4) header and length - /** - * The packed type is raw header and length. - * The minimum byte size length expression is used. - * The format raw (v4) is old MessagePack version4 format. - * You need to call `pack_v4raw_body(const char* b, uint32_t l)` after this function calling with the same `l` - * value. See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-str - * - * @param l The length of string. - * - * @return The reference of `*this`. - */ - packer& pack_v4raw(uint32_t l); - - /// Packing raw (v4) body - /** - * The format raw (v4) is old MessagePack version4 format. - * You need to call this function just after `pack_v4raw(uint32_t l)` calling. - * The value `l` should be the same as `pack_v4raw(uint32_t l)` argument `l`. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-str - * - * @param l The length of string. - * - * @return The reference of `*this`. - */ - packer& pack_v4raw_body(const char* b, uint32_t l); - - /// Packing bin header and length - /** - * The packed type is bin header and length. - * The minimum byte size length expression is used. - * You need to call `pack_bin_body(const char* b, uint32_t l)` after this function calling with the same `l` - * value. See https://github.com/msgpack/msgpack/blob/master/spec.md#bin-format-family - * - * @param l The length of string. - * - * @return The reference of `*this`. - */ - packer& pack_bin(uint32_t l); - - /// Packing bin body - /** - * You need to call this function just after `pack_bin(uint32_t l)` calling. - * The value `l` should be the same as `pack_bin(uint32_t l)` argument `l`. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#bin-format-family - * - * @param l The length of string. - * - * @return The reference of `*this`. - */ - packer& pack_bin_body(const char* b, uint32_t l); - - /// Packing ext header, type, and length - /** - * The packed type is ext. - * The minimum byte size length expression is used. - * The length 1, 2, 4, 8, and 16 can be encoded in the header. - * You need to call `pack_ext_body(const char* b, uint32_t l)` after this function calling with the same `l` - * value. See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-ext - * - * @param l The length of string. - * - * @return The reference of `*this`. - */ - packer& pack_ext(size_t l, int8_t type); - - /// Packing ext body - /** - * You need to call this function just after `pack_ext(size_t l, int8_t type)` calling. - * The value `l` should be the same as `pack_ext(size_t l, int8_t type)` argument `l`. - * See https://github.com/msgpack/msgpack/blob/master/spec.md#bin-format-family - * - * @param l The length of string. - * - * @return The reference of `*this`. - */ - packer& pack_ext_body(const char* b, uint32_t l); - - private: - template void pack_imp_uint8(T d); - template void pack_imp_uint16(T d); - template void pack_imp_uint32(T d); - template void pack_imp_uint64(T d); - template void pack_imp_int8(T d); - template void pack_imp_int16(T d); - template void pack_imp_int32(T d); - template void pack_imp_int64(T d); - - void append_buffer(const char* buf, size_t len) { append_buffer(&Stream::write, buf, len); } - - template - void append_buffer(Ret (Cls::*)(const char*, SizeType), const char* buf, size_t len) - { - m_stream.write(buf, static_cast(len)); - } + packer(Stream* s); + /// Constructor + /** + * @param s Packing destination stream object. + */ + packer(Stream& s); - private: - Stream& m_stream; +public: + /// Packing function template + /** + * @tparam T The type of packing object. + * + * @param v a packing object. + * + * @return The reference of `*this`. + */ + template + packer& pack(const T& v); -#if defined(MSGPACK_USE_CPP03) - private: - packer(const packer&); - packer& operator=(const packer&); - packer(); -#else // defined(MSGPACK_USE_CPP03) - public: - packer(const packer&) = delete; - packer& operator=(const packer&) = delete; - packer() = delete; -#endif // defined(MSGPACK_USE_CPP03) - }; + /// Packing uint8 + /** + * The byte size of the packed data depends on `d`. + * The packed type is positive fixnum or uint8. + * The minimum byte size expression is used. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_uint8(uint8_t d); - /// Pack the value as MessagePack format into the stream + /// Packing uint16 /** - * This function template is left for compatibility. - * Use `void pack(Stream& s, const T& v)` instead of the function template. + * The byte size of the packed data depends on `d`. + * The packed type is positive fixnum, uint8 or uint16. + * The minimum byte size expression is used. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int * - * @tparam Stream Any type that have a member function `Stream write(const char*, size_t s)` - * @tparam T Any type that is adapted to MessagePack - * @param s The pointer to packing destination stream - * @param v Packing value + * @param d a packing object. + * + * @return The reference of `*this`. */ - template inline void pack(Stream * s, const T& v) - { - packer(*s).pack(v); - } + packer& pack_uint16(uint16_t d); - /// Pack the value as MessagePack format into the stream + /// Packing uint32 /** - * @tparam Stream Any type that have a member function `Stream write(const char*, size_t s)` - * @tparam T Any type that is adapted to MessagePack - * @param s Packing destination stream - * @param v Packing value + * The byte size of the packed data depends on `d`. + * The packed type is positive fixnum, uint8, uint16 or uint32. + * The minimum byte size expression is used. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. */ - template inline void pack(Stream & s, const T& v) - { - packer(s).pack(v); - } + packer& pack_uint32(uint32_t d); -#if MSGPACK_ENDIAN_LITTLE_BYTE - template inline char take8_8(T d) - { - return static_cast(reinterpret_cast(&d)[0]); - } - template inline char take8_16(T d) - { - return static_cast(reinterpret_cast(&d)[0]); - } - template inline char take8_32(T d) + /// Packing uint16 + /** + * The byte size of the packed data depends on `d`. + * The packed type is positive fixnum, uint8, uint16, uint32 or uint64. + * The minimum byte size expression is used. + * positive fixnum, uint8, uint16, or uint32 is used. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_uint64(uint64_t d); + + /// Packing int8 + /** + * The byte size of the packed data depends on `d`. + * If `d` is zero or positive, the packed type is positive fixnum, or uint8, + * else the packed type is negative fixnum, or int8 + * The minimum byte size expression is used. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_int8(int8_t d); + + /// Packing int16 + /** + * The byte size of the packed data depends on `d`. + * If `d` is zero or positive, the packed type is positive fixnum, uint8, or uint16, + * else the packed type is negative fixnum, int8, or int16. + * The minimum byte size expression is used. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_int16(int16_t d); + + /// Packing int32 + /** + * The byte size of the packed data depends on `d`. + * If `d` is zero or positive, the packed type is positive fixnum, uint8, uint16, or uint32, + * else the packed type is negative fixnum, int8, int16, or int32. + * The minimum byte size expression is used. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_int32(int32_t d); + + /// Packing int32 + /** + * The byte size of the packed data depends on `d`. + * If `d` is zero or positive, the packed type is positive fixnum, uint8, uint16, uint32, or uint64, + * else the packed type is negative fixnum, int8, int16, int32, or int64. + * The minimum byte size expression is used. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_int64(int64_t d); + + + + /// Packing uint8 (fixed packed type). + /** + * The packed type is always uint8. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_fix_uint8(uint8_t d); + + /// Packing uint8 (fixed packed type). + /** + * The packed type is always uint16. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_fix_uint16(uint16_t d); + + /// Packing uint8 (fixed packed type). + /** + * The packed type is always uint32. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_fix_uint32(uint32_t d); + + /// Packing uint8 (fixed packed type). + /** + * The packed type is always uint64. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_fix_uint64(uint64_t d); + + /// Packing uint8 (fixed packed type). + /** + * The packed type is always int8. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_fix_int8(int8_t d); + + /// Packing uint8 (fixed packed type). + /** + * The packed type is always int16. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_fix_int16(int16_t d); + + /// Packing uint8 (fixed packed type). + /** + * The packed type is always int32. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_fix_int32(int32_t d); + + /// Packing uint8 (fixed packed type). + /** + * The packed type is always int64. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_fix_int64(int64_t d); + + + /// Packing char + /** + * The byte size of the packed data depends on `d`. + * If `d` is zero or positive, the packed type is positive fixnum, or uint*, + * else the packed type is negative fixnum, or int* + * The minimum byte size expression is used. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_char(char d); + + /// Packing wchar_t + /** + * The byte size of the packed data depends on `d`. + * If `d` is zero or positive, the packed type is positive fixnum, or uint*, + * else the packed type is negative fixnum, or int* + * The minimum byte size expression is used. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_wchar(wchar_t d); + + /// Packing signed char + /** + * The byte size of the packed data depends on `d`. + * If `d` is zero or positive, the packed type is positive fixnum, or uint*, + * else the packed type is negative fixnum, or int* + * The minimum byte size expression is used. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_signed_char(signed char d); + + /// Packing short + /** + * The byte size of the packed data depends on `d`. + * If `d` is zero or positive, the packed type is positive fixnum, or uint*, + * else the packed type is negative fixnum, or int* + * The minimum byte size expression is used. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_short(short d); + + /// Packing int + /** + * The byte size of the packed data depends on `d`. + * If `d` is zero or positive, the packed type is positive fixnum, or uint*, + * else the packed type is negative fixnum, or int* + * The minimum byte size expression is used. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_int(int d); + + /// Packing long + /** + * The byte size of the packed data depends on `d`. + * If `d` is zero or positive, the packed type is positive fixnum, or uint*, + * else the packed type is negative fixnum, or int* + * The minimum byte size expression is used. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_long(long d); + + /// Packing long long + /** + * The byte size of the packed data depends on `d`. + * If `d` is zero or positive, the packed type is positive fixnum, or uint*, + * else the packed type is negative fixnum, or int* + * The minimum byte size expression is used. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_long_long(long long d); + + + /// Packing unsigned char + /** + * The byte size of the packed data depends on `d`. + * The packed type is positive fixnum, or uint*. + * The minimum byte size expression is used. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_unsigned_char(unsigned char d); + + /// Packing unsigned short + /** + * The byte size of the packed data depends on `d`. + * The packed type is positive fixnum, or uint*. + * The minimum byte size expression is used. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_unsigned_short(unsigned short d); + + /// Packing unsigned int + /** + * The byte size of the packed data depends on `d`. + * The packed type is positive fixnum, or uint*. + * The minimum byte size expression is used. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_unsigned_int(unsigned int d); + + /// Packing unsigned long + /** + * The byte size of the packed data depends on `d`. + * The packed type is positive fixnum, or uint*. + * The minimum byte size expression is used. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_unsigned_long(unsigned long d); + + /// Packing unsigned long long + /** + * The byte size of the packed data depends on `d`. + * The packed type is positive fixnum, or uint*. + * The minimum byte size expression is used. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_unsigned_long_long(unsigned long long d); + + /// Packing float + /** + * The packed type is float32. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-float + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_float(float d); + + /// Packing double + /** + * The packed type is float64. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-float + * + * @param d a packing object. + * + * @return The reference of `*this`. + */ + packer& pack_double(double d); + + + /// Packing nil + /** + * The packed type is nil. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-nil + * + * @return The reference of `*this`. + */ + packer& pack_nil(); + + /// Packing true + /** + * The packed type is bool, value is true. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#bool-format-family + * + * @return The reference of `*this`. + */ + packer& pack_true(); + + /// Packing false + /** + * The packed type is bool, value is false. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#bool-format-family + * + * @return The reference of `*this`. + */ + packer& pack_false(); + + /// Packing array header and size + /** + * The packed type is array header and array size. + * You need to pack `n` msgpack objects following this header and size. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#array-format-family + * + * @param n The number of array elements (array size). + * + * @return The reference of `*this`. + */ + packer& pack_array(uint32_t n); + + /// Packing map header and size + /** + * The packed type is map header and map size. + * You need to pack `n` pairs of msgpack objects following this header and size. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#map-format-family + * + * @param n The number of array elements (array size). + * + * @return The reference of `*this`. + */ + packer& pack_map(uint32_t n); + + + /// Packing str header and length + /** + * The packed type is str header and length. + * The minimum byte size length expression is used. + * You need to call `pack_str_body(const char* b, uint32_t l)` after this function calling with the same `l` value. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-str + * + * @param l The length of string. + * + * @return The reference of `*this`. + */ + packer& pack_str(uint32_t l); + + /// Packing str body + /** + * You need to call this function just after `pack_str(uint32_t l)` calling. + * The value `l` should be the same as `pack_str(uint32_t l)` argument `l`. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-str + * + * @param l The length of string. + * + * @return The reference of `*this`. + */ + packer& pack_str_body(const char* b, uint32_t l); + + /// Packing raw (v4) header and length + /** + * The packed type is raw header and length. + * The minimum byte size length expression is used. + * The format raw (v4) is old MessagePack version4 format. + * You need to call `pack_v4raw_body(const char* b, uint32_t l)` after this function calling with the same `l` value. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-str + * + * @param l The length of string. + * + * @return The reference of `*this`. + */ + packer& pack_v4raw(uint32_t l); + + /// Packing raw (v4) body + /** + * The format raw (v4) is old MessagePack version4 format. + * You need to call this function just after `pack_v4raw(uint32_t l)` calling. + * The value `l` should be the same as `pack_v4raw(uint32_t l)` argument `l`. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-str + * + * @param l The length of string. + * + * @return The reference of `*this`. + */ + packer& pack_v4raw_body(const char* b, uint32_t l); + + /// Packing bin header and length + /** + * The packed type is bin header and length. + * The minimum byte size length expression is used. + * You need to call `pack_bin_body(const char* b, uint32_t l)` after this function calling with the same `l` value. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#bin-format-family + * + * @param l The length of string. + * + * @return The reference of `*this`. + */ + packer& pack_bin(uint32_t l); + + /// Packing bin body + /** + * You need to call this function just after `pack_bin(uint32_t l)` calling. + * The value `l` should be the same as `pack_bin(uint32_t l)` argument `l`. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#bin-format-family + * + * @param l The length of string. + * + * @return The reference of `*this`. + */ + packer& pack_bin_body(const char* b, uint32_t l); + + /// Packing ext header, type, and length + /** + * The packed type is ext. + * The minimum byte size length expression is used. + * The length 1, 2, 4, 8, and 16 can be encoded in the header. + * You need to call `pack_ext_body(const char* b, uint32_t l)` after this function calling with the same `l` value. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-ext + * + * @param l The length of string. + * + * @return The reference of `*this`. + */ + packer& pack_ext(size_t l, int8_t type); + + /// Packing ext body + /** + * You need to call this function just after `pack_ext(size_t l, int8_t type)` calling. + * The value `l` should be the same as `pack_ext(size_t l, int8_t type)` argument `l`. + * See https://github.com/msgpack/msgpack/blob/master/spec.md#bin-format-family + * + * @param l The length of string. + * + * @return The reference of `*this`. + */ + packer& pack_ext_body(const char* b, uint32_t l); + +private: + template + void pack_imp_uint8(T d); + template + void pack_imp_uint16(T d); + template + void pack_imp_uint32(T d); + template + void pack_imp_uint64(T d); + template + void pack_imp_int8(T d); + template + void pack_imp_int16(T d); + template + void pack_imp_int32(T d); + template + void pack_imp_int64(T d); + + void append_buffer(const char* buf, size_t len) { - return static_cast(reinterpret_cast(&d)[0]); + append_buffer(&Stream::write, buf, len); } - template inline char take8_64(T d) + + template + void append_buffer(Ret (Cls::*)(const char*, SizeType), const char* buf, size_t len) { - return static_cast(reinterpret_cast(&d)[0]); + m_stream.write(buf, static_cast(len)); } +private: + Stream& m_stream; + +#if defined(MSGPACK_USE_CPP03) +private: + packer(const packer&); + packer& operator=(const packer&); + packer(); +#else // defined(MSGPACK_USE_CPP03) +public: + packer(const packer&) = delete; + packer& operator=(const packer&) = delete; + packer() = delete; +#endif // defined(MSGPACK_USE_CPP03) +}; + + +/// Pack the value as MessagePack format into the stream +/** + * This function template is left for compatibility. + * Use `void pack(Stream& s, const T& v)` instead of the function template. + * + * @tparam Stream Any type that have a member function `Stream write(const char*, size_t s)` + * @tparam T Any type that is adapted to MessagePack + * @param s The pointer to packing destination stream + * @param v Packing value + */ +template +inline void pack(Stream* s, const T& v) +{ + packer(*s).pack(v); +} + +/// Pack the value as MessagePack format into the stream +/** + * @tparam Stream Any type that have a member function `Stream write(const char*, size_t s)` + * @tparam T Any type that is adapted to MessagePack + * @param s Packing destination stream + * @param v Packing value + */ +template +inline void pack(Stream& s, const T& v) +{ + packer(s).pack(v); +} + + +#if MSGPACK_ENDIAN_LITTLE_BYTE +template +inline char take8_8(T d) { + return static_cast(reinterpret_cast(&d)[0]); +} +template +inline char take8_16(T d) { + return static_cast(reinterpret_cast(&d)[0]); +} +template +inline char take8_32(T d) { + return static_cast(reinterpret_cast(&d)[0]); +} +template +inline char take8_64(T d) { + return static_cast(reinterpret_cast(&d)[0]); +} + #elif MSGPACK_ENDIAN_BIG_BYTE - template inline char take8_8(T d) - { - return static_cast(reinterpret_cast(&d)[0]); - } - template inline char take8_16(T d) - { - return static_cast(reinterpret_cast(&d)[1]); - } - template inline char take8_32(T d) - { - return static_cast(reinterpret_cast(&d)[3]); - } - template inline char take8_64(T d) - { - return static_cast(reinterpret_cast(&d)[7]); - } +template +inline char take8_8(T d) { + return static_cast(reinterpret_cast(&d)[0]); +} +template +inline char take8_16(T d) { + return static_cast(reinterpret_cast(&d)[1]); +} +template +inline char take8_32(T d) { + return static_cast(reinterpret_cast(&d)[3]); +} +template +inline char take8_64(T d) { + return static_cast(reinterpret_cast(&d)[7]); +} #else #error msgpack-c supports only big endian and little endian #endif - template - inline packer::packer(Stream * s) - : m_stream(*s) - {} +template +inline packer::packer(Stream* s) : m_stream(*s) { } - template - inline packer::packer(Stream & s) - : m_stream(s) - {} +template +inline packer::packer(Stream& s) : m_stream(s) { } - template inline packer& packer::pack_uint8(uint8_t d) - { - pack_imp_uint8(d); - return *this; - } - template inline packer& packer::pack_uint16(uint16_t d) - { - pack_imp_uint16(d); - return *this; - } +template +inline packer& packer::pack_uint8(uint8_t d) +{ pack_imp_uint8(d); return *this; } - template inline packer& packer::pack_uint32(uint32_t d) - { - pack_imp_uint32(d); - return *this; - } +template +inline packer& packer::pack_uint16(uint16_t d) +{ pack_imp_uint16(d); return *this; } - template inline packer& packer::pack_uint64(uint64_t d) - { - pack_imp_uint64(d); - return *this; - } +template +inline packer& packer::pack_uint32(uint32_t d) +{ pack_imp_uint32(d); return *this; } - template inline packer& packer::pack_int8(int8_t d) - { - pack_imp_int8(d); - return *this; - } +template +inline packer& packer::pack_uint64(uint64_t d) +{ pack_imp_uint64(d); return *this; } - template inline packer& packer::pack_int16(int16_t d) - { - pack_imp_int16(d); - return *this; - } +template +inline packer& packer::pack_int8(int8_t d) +{ pack_imp_int8(d); return *this; } - template inline packer& packer::pack_int32(int32_t d) - { - pack_imp_int32(d); - return *this; - } +template +inline packer& packer::pack_int16(int16_t d) +{ pack_imp_int16(d); return *this; } - template inline packer& packer::pack_int64(int64_t d) - { - pack_imp_int64(d); - return *this; - } +template +inline packer& packer::pack_int32(int32_t d) +{ pack_imp_int32(d); return *this; } - template inline packer& packer::pack_fix_uint8(uint8_t d) - { - char buf[2] = { static_cast(0xccu), take8_8(d) }; - append_buffer(buf, 2); - return *this; - } +template +inline packer& packer::pack_int64(int64_t d) +{ pack_imp_int64(d); return *this;} - template inline packer& packer::pack_fix_uint16(uint16_t d) - { - char buf[3]; - buf[0] = static_cast(0xcdu); - _msgpack_store16(&buf[1], d); - append_buffer(buf, 3); - return *this; - } - - template inline packer& packer::pack_fix_uint32(uint32_t d) - { - char buf[5]; - buf[0] = static_cast(0xceu); - _msgpack_store32(&buf[1], d); - append_buffer(buf, 5); - return *this; - } - - template inline packer& packer::pack_fix_uint64(uint64_t d) - { - char buf[9]; - buf[0] = static_cast(0xcfu); - _msgpack_store64(&buf[1], d); - append_buffer(buf, 9); - return *this; - } - template inline packer& packer::pack_fix_int8(int8_t d) - { - char buf[2] = { static_cast(0xd0u), take8_8(d) }; - append_buffer(buf, 2); - return *this; - } +template +inline packer& packer::pack_fix_uint8(uint8_t d) +{ + char buf[2] = {static_cast(0xccu), take8_8(d)}; + append_buffer(buf, 2); + return *this; +} - template inline packer& packer::pack_fix_int16(int16_t d) - { - char buf[3]; - buf[0] = static_cast(0xd1u); - _msgpack_store16(&buf[1], (uint16_t)d); - append_buffer(buf, 3); - return *this; - } +template +inline packer& packer::pack_fix_uint16(uint16_t d) +{ + char buf[3]; + buf[0] = static_cast(0xcdu); _msgpack_store16(&buf[1], d); + append_buffer(buf, 3); + return *this; +} + +template +inline packer& packer::pack_fix_uint32(uint32_t d) +{ + char buf[5]; + buf[0] = static_cast(0xceu); _msgpack_store32(&buf[1], d); + append_buffer(buf, 5); + return *this; +} + +template +inline packer& packer::pack_fix_uint64(uint64_t d) +{ + char buf[9]; + buf[0] = static_cast(0xcfu); _msgpack_store64(&buf[1], d); + append_buffer(buf, 9); + return *this; +} + +template +inline packer& packer::pack_fix_int8(int8_t d) +{ + char buf[2] = {static_cast(0xd0u), take8_8(d)}; + append_buffer(buf, 2); + return *this; +} - template inline packer& packer::pack_fix_int32(int32_t d) - { - char buf[5]; - buf[0] = static_cast(0xd2u); - _msgpack_store32(&buf[1], (uint32_t)d); - append_buffer(buf, 5); - return *this; - } +template +inline packer& packer::pack_fix_int16(int16_t d) +{ + char buf[3]; + buf[0] = static_cast(0xd1u); _msgpack_store16(&buf[1], (uint16_t)d); + append_buffer(buf, 3); + return *this; +} + +template +inline packer& packer::pack_fix_int32(int32_t d) +{ + char buf[5]; + buf[0] = static_cast(0xd2u); _msgpack_store32(&buf[1], (uint32_t)d); + append_buffer(buf, 5); + return *this; +} + +template +inline packer& packer::pack_fix_int64(int64_t d) +{ + char buf[9]; + buf[0] = static_cast(0xd3u); _msgpack_store64(&buf[1], d); + append_buffer(buf, 9); + return *this; +} - template inline packer& packer::pack_fix_int64(int64_t d) - { - char buf[9]; - buf[0] = static_cast(0xd3u); - _msgpack_store64(&buf[1], d); - append_buffer(buf, 9); - return *this; - } - template inline packer& packer::pack_char(char d) - { +template +inline packer& packer::pack_char(char d) +{ #if defined(CHAR_MIN) #if CHAR_MIN < 0 - pack_imp_int8(d); + pack_imp_int8(d); #else - pack_imp_uint8(d); + pack_imp_uint8(d); #endif #else #error CHAR_MIN is not defined #endif - return *this; - } + return *this; +} - template inline packer& packer::pack_wchar(wchar_t d) - { - if (d < 0) { - pack_imp_int64(static_cast(d)); - } else { - pack_imp_uint64(static_cast(d)); - } - return *this; +template +inline packer& packer::pack_wchar(wchar_t d) +{ + if (d < 0) { + pack_imp_int64(static_cast(d)); } - - template inline packer& packer::pack_signed_char(signed char d) - { - pack_imp_int8(d); - return *this; + else { + pack_imp_uint64(static_cast(d)); } + return *this; +} - template inline packer& packer::pack_short(short d) - { +template +inline packer& packer::pack_signed_char(signed char d) +{ + pack_imp_int8(d); + return *this; +} + +template +inline packer& packer::pack_short(short d) +{ #if defined(SIZEOF_SHORT) #if SIZEOF_SHORT == 2 - pack_imp_int16(d); + pack_imp_int16(d); #elif SIZEOF_SHORT == 4 - pack_imp_int32(d); + pack_imp_int32(d); #else - pack_imp_int64(d); + pack_imp_int64(d); #endif #elif defined(SHRT_MAX) #if SHRT_MAX == 0x7fff - pack_imp_int16(d); + pack_imp_int16(d); #elif SHRT_MAX == 0x7fffffff - pack_imp_int32(d); + pack_imp_int32(d); #else - pack_imp_int64(d); + pack_imp_int64(d); #endif #else - if (sizeof(short) == 2) { - pack_imp_int16(d); - } else if (sizeof(short) == 4) { - pack_imp_int32(d); - } else { - pack_imp_int64(d); - } -#endif - return *this; + if(sizeof(short) == 2) { + pack_imp_int16(d); + } else if(sizeof(short) == 4) { + pack_imp_int32(d); + } else { + pack_imp_int64(d); } +#endif + return *this; +} - template inline packer& packer::pack_int(int d) - { +template +inline packer& packer::pack_int(int d) +{ #if defined(SIZEOF_INT) #if SIZEOF_INT == 2 - pack_imp_int16(d); + pack_imp_int16(d); #elif SIZEOF_INT == 4 - pack_imp_int32(d); + pack_imp_int32(d); #else - pack_imp_int64(d); + pack_imp_int64(d); #endif #elif defined(INT_MAX) #if INT_MAX == 0x7fff - pack_imp_int16(d); + pack_imp_int16(d); #elif INT_MAX == 0x7fffffff - pack_imp_int32(d); + pack_imp_int32(d); #else - pack_imp_int64(d); + pack_imp_int64(d); #endif #else - if (sizeof(int) == 2) { - pack_imp_int16(d); - } else if (sizeof(int) == 4) { - pack_imp_int32(d); - } else { - pack_imp_int64(d); - } -#endif - return *this; + if(sizeof(int) == 2) { + pack_imp_int16(d); + } else if(sizeof(int) == 4) { + pack_imp_int32(d); + } else { + pack_imp_int64(d); } +#endif + return *this; +} - template inline packer& packer::pack_long(long d) - { +template +inline packer& packer::pack_long(long d) +{ #if defined(SIZEOF_LONG) #if SIZEOF_LONG == 2 - pack_imp_int16(d); + pack_imp_int16(d); #elif SIZEOF_LONG == 4 - pack_imp_int32(d); + pack_imp_int32(d); #else - pack_imp_int64(d); + pack_imp_int64(d); #endif #elif defined(LONG_MAX) #if LONG_MAX == 0x7fffL - pack_imp_int16(d); + pack_imp_int16(d); #elif LONG_MAX == 0x7fffffffL - pack_imp_int32(d); + pack_imp_int32(d); #else - pack_imp_int64(d); + pack_imp_int64(d); #endif #else - if (sizeof(long) == 2) { - pack_imp_int16(d); - } else if (sizeof(long) == 4) { - pack_imp_int32(d); - } else { - pack_imp_int64(d); - } -#endif - return *this; + if(sizeof(long) == 2) { + pack_imp_int16(d); + } else if(sizeof(long) == 4) { + pack_imp_int32(d); + } else { + pack_imp_int64(d); } +#endif + return *this; +} - template inline packer& packer::pack_long_long(long long d) - { +template +inline packer& packer::pack_long_long(long long d) +{ #if defined(SIZEOF_LONG_LONG) #if SIZEOF_LONG_LONG == 2 - pack_imp_int16(d); + pack_imp_int16(d); #elif SIZEOF_LONG_LONG == 4 - pack_imp_int32(d); + pack_imp_int32(d); #else - pack_imp_int64(d); + pack_imp_int64(d); #endif #elif defined(LLONG_MAX) #if LLONG_MAX == 0x7fffL - pack_imp_int16(d); + pack_imp_int16(d); #elif LLONG_MAX == 0x7fffffffL - pack_imp_int32(d); + pack_imp_int32(d); #else - pack_imp_int64(d); + pack_imp_int64(d); #endif #else - if (sizeof(long long) == 2) { - pack_imp_int16(d); - } else if (sizeof(long long) == 4) { - pack_imp_int32(d); - } else { - pack_imp_int64(d); - } -#endif - return *this; + if(sizeof(long long) == 2) { + pack_imp_int16(d); + } else if(sizeof(long long) == 4) { + pack_imp_int32(d); + } else { + pack_imp_int64(d); } +#endif + return *this; +} - template inline packer& packer::pack_unsigned_char(unsigned char d) - { - pack_imp_uint8(d); - return *this; - } - template inline packer& packer::pack_unsigned_short(unsigned short d) - { +template +inline packer& packer::pack_unsigned_char(unsigned char d) +{ + pack_imp_uint8(d); + return *this; +} + +template +inline packer& packer::pack_unsigned_short(unsigned short d) +{ #if defined(SIZEOF_SHORT) #if SIZEOF_SHORT == 2 - pack_imp_uint16(d); + pack_imp_uint16(d); #elif SIZEOF_SHORT == 4 - pack_imp_uint32(d); + pack_imp_uint32(d); #else - pack_imp_uint64(d); + pack_imp_uint64(d); #endif #elif defined(USHRT_MAX) #if USHRT_MAX == 0xffffU - pack_imp_uint16(d); + pack_imp_uint16(d); #elif USHRT_MAX == 0xffffffffU - pack_imp_uint32(d); + pack_imp_uint32(d); #else - pack_imp_uint64(d); + pack_imp_uint64(d); #endif #else - if (sizeof(unsigned short) == 2) { - pack_imp_uint16(d); - } else if (sizeof(unsigned short) == 4) { - pack_imp_uint32(d); - } else { - pack_imp_uint64(d); - } -#endif - return *this; + if(sizeof(unsigned short) == 2) { + pack_imp_uint16(d); + } else if(sizeof(unsigned short) == 4) { + pack_imp_uint32(d); + } else { + pack_imp_uint64(d); } +#endif + return *this; +} - template inline packer& packer::pack_unsigned_int(unsigned int d) - { +template +inline packer& packer::pack_unsigned_int(unsigned int d) +{ #if defined(SIZEOF_INT) #if SIZEOF_INT == 2 - pack_imp_uint16(d); + pack_imp_uint16(d); #elif SIZEOF_INT == 4 - pack_imp_uint32(d); + pack_imp_uint32(d); #else - pack_imp_uint64(d); + pack_imp_uint64(d); #endif #elif defined(UINT_MAX) #if UINT_MAX == 0xffffU - pack_imp_uint16(d); + pack_imp_uint16(d); #elif UINT_MAX == 0xffffffffU - pack_imp_uint32(d); + pack_imp_uint32(d); #else - pack_imp_uint64(d); + pack_imp_uint64(d); #endif #else - if (sizeof(unsigned int) == 2) { - pack_imp_uint16(d); - } else if (sizeof(unsigned int) == 4) { - pack_imp_uint32(d); - } else { - pack_imp_uint64(d); - } -#endif - return *this; + if(sizeof(unsigned int) == 2) { + pack_imp_uint16(d); + } else if(sizeof(unsigned int) == 4) { + pack_imp_uint32(d); + } else { + pack_imp_uint64(d); } +#endif + return *this; +} - template inline packer& packer::pack_unsigned_long(unsigned long d) - { +template +inline packer& packer::pack_unsigned_long(unsigned long d) +{ #if defined(SIZEOF_LONG) #if SIZEOF_LONG == 2 - pack_imp_uint16(d); + pack_imp_uint16(d); #elif SIZEOF_LONG == 4 - pack_imp_uint32(d); + pack_imp_uint32(d); #else - pack_imp_uint64(d); + pack_imp_uint64(d); #endif #elif defined(ULONG_MAX) #if ULONG_MAX == 0xffffUL - pack_imp_uint16(d); + pack_imp_uint16(d); #elif ULONG_MAX == 0xffffffffUL - pack_imp_uint32(d); + pack_imp_uint32(d); #else - pack_imp_uint64(d); + pack_imp_uint64(d); #endif #else - if (sizeof(unsigned long) == 2) { - pack_imp_uint16(d); - } else if (sizeof(unsigned long) == 4) { - pack_imp_uint32(d); - } else { - pack_imp_uint64(d); - } -#endif - return *this; + if(sizeof(unsigned long) == 2) { + pack_imp_uint16(d); + } else if(sizeof(unsigned long) == 4) { + pack_imp_uint32(d); + } else { + pack_imp_uint64(d); } +#endif + return *this; +} - template inline packer& packer::pack_unsigned_long_long(unsigned long long d) - { +template +inline packer& packer::pack_unsigned_long_long(unsigned long long d) +{ #if defined(SIZEOF_LONG_LONG) #if SIZEOF_LONG_LONG == 2 - pack_imp_uint16(d); + pack_imp_uint16(d); #elif SIZEOF_LONG_LONG == 4 - pack_imp_uint32(d); + pack_imp_uint32(d); #else - pack_imp_uint64(d); + pack_imp_uint64(d); #endif #elif defined(ULLONG_MAX) #if ULLONG_MAX == 0xffffUL - pack_imp_uint16(d); + pack_imp_uint16(d); #elif ULLONG_MAX == 0xffffffffUL - pack_imp_uint32(d); + pack_imp_uint32(d); #else - pack_imp_uint64(d); + pack_imp_uint64(d); #endif #else - if (sizeof(unsigned long long) == 2) { - pack_imp_uint16(d); - } else if (sizeof(unsigned long long) == 4) { - pack_imp_uint32(d); - } else { - pack_imp_uint64(d); - } -#endif - return *this; + if(sizeof(unsigned long long) == 2) { + pack_imp_uint16(d); + } else if(sizeof(unsigned long long) == 4) { + pack_imp_uint32(d); + } else { + pack_imp_uint64(d); } +#endif + return *this; +} - template inline packer& packer::pack_float(float d) - { - if (d == d) { // check for nan - // compare d to limits to avoid undefined behaviour - if (d >= 0 && d <= float(std::numeric_limits::max()) && d == float(uint64_t(d))) { - pack_imp_uint64(uint64_t(d)); - return *this; - } else if (d < 0 && d >= float(std::numeric_limits::min()) && d == float(int64_t(d))) { - pack_imp_int64(int64_t(d)); - return *this; - } - } - - union { - float f; - uint32_t i; - } mem; - mem.f = d; - char buf[5]; - buf[0] = static_cast(0xcau); - _msgpack_store32(&buf[1], mem.i); - append_buffer(buf, 5); - return *this; + +template +inline packer& packer::pack_float(float d) +{ + if(d == d) { // check for nan + // compare d to limits to avoid undefined behaviour + if(d >= 0 && d <= float(std::numeric_limits::max()) && d == float(uint64_t(d))) { + pack_imp_uint64(uint64_t(d)); + return *this; + } else if(d < 0 && d >= float(std::numeric_limits::min()) && d == float(int64_t(d))) { + pack_imp_int64(int64_t(d)); + return *this; + } } - template inline packer& packer::pack_double(double d) - { - if (d == d) { // check for nan - // compare d to limits to avoid undefined behaviour - if (d >= 0 && d <= double(std::numeric_limits::max()) && d == double(uint64_t(d))) { - pack_imp_uint64(uint64_t(d)); - return *this; - } else if (d < 0 && d >= double(std::numeric_limits::min()) && d == double(int64_t(d))) { - pack_imp_int64(int64_t(d)); - return *this; - } + union { float f; uint32_t i; } mem; + mem.f = d; + char buf[5]; + buf[0] = static_cast(0xcau); _msgpack_store32(&buf[1], mem.i); + append_buffer(buf, 5); + return *this; +} + +template +inline packer& packer::pack_double(double d) +{ + if(d == d) { // check for nan + // compare d to limits to avoid undefined behaviour + if(d >= 0 && d <= double(std::numeric_limits::max()) && d == double(uint64_t(d))) { + pack_imp_uint64(uint64_t(d)); + return *this; + } else if(d < 0 && d >= double(std::numeric_limits::min()) && d == double(int64_t(d))) { + pack_imp_int64(int64_t(d)); + return *this; } + } - union { - double f; - uint64_t i; - } mem; - mem.f = d; - char buf[9]; - buf[0] = static_cast(0xcbu); + union { double f; uint64_t i; } mem; + mem.f = d; + char buf[9]; + buf[0] = static_cast(0xcbu); #if defined(TARGET_OS_IPHONE) - // ok + // ok #elif defined(__arm__) && !(__ARM_EABI__) // arm-oabi - // https://github.com/msgpack/msgpack-perl/pull/1 - mem.i = (mem.i & 0xFFFFFFFFUL) << 32UL | (mem.i >> 32UL); + // https://github.com/msgpack/msgpack-perl/pull/1 + mem.i = (mem.i & 0xFFFFFFFFUL) << 32UL | (mem.i >> 32UL); #endif - _msgpack_store64(&buf[1], mem.i); - append_buffer(buf, 9); - return *this; - } + _msgpack_store64(&buf[1], mem.i); + append_buffer(buf, 9); + return *this; +} - template inline packer& packer::pack_nil() - { - const char d = static_cast(0xc0u); + +template +inline packer& packer::pack_nil() +{ + const char d = static_cast(0xc0u); + append_buffer(&d, 1); + return *this; +} + +template +inline packer& packer::pack_true() +{ + const char d = static_cast(0xc3u); + append_buffer(&d, 1); + return *this; +} + +template +inline packer& packer::pack_false() +{ + const char d = static_cast(0xc2u); + append_buffer(&d, 1); + return *this; +} + + +template +inline packer& packer::pack_array(uint32_t n) +{ + if(n < 16) { + char d = static_cast(0x90u | n); append_buffer(&d, 1); - return *this; + } else if(n < 65536) { + char buf[3]; + buf[0] = static_cast(0xdcu); _msgpack_store16(&buf[1], static_cast(n)); + append_buffer(buf, 3); + } else { + char buf[5]; + buf[0] = static_cast(0xddu); _msgpack_store32(&buf[1], static_cast(n)); + append_buffer(buf, 5); } + return *this; +} - template inline packer& packer::pack_true() - { - const char d = static_cast(0xc3u); - append_buffer(&d, 1); - return *this; +template +inline packer& packer::pack_map(uint32_t n) +{ + if(n < 16) { + unsigned char d = static_cast(0x80u | n); + char buf = take8_8(d); + append_buffer(&buf, 1); + } else if(n < 65536) { + char buf[3]; + buf[0] = static_cast(0xdeu); _msgpack_store16(&buf[1], static_cast(n)); + append_buffer(buf, 3); + } else { + char buf[5]; + buf[0] = static_cast(0xdfu); _msgpack_store32(&buf[1], static_cast(n)); + append_buffer(buf, 5); } + return *this; +} - template inline packer& packer::pack_false() - { - const char d = static_cast(0xc2u); - append_buffer(&d, 1); - return *this; +template +inline packer& packer::pack_str(uint32_t l) +{ + if(l < 32) { + unsigned char d = static_cast(0xa0u | l); + char buf = take8_8(d); + append_buffer(&buf, 1); + } else if(l < 256) { + char buf[2]; + buf[0] = static_cast(0xd9u); buf[1] = static_cast(l); + append_buffer(buf, 2); + } else if(l < 65536) { + char buf[3]; + buf[0] = static_cast(0xdau); _msgpack_store16(&buf[1], static_cast(l)); + append_buffer(buf, 3); + } else { + char buf[5]; + buf[0] = static_cast(0xdbu); _msgpack_store32(&buf[1], static_cast(l)); + append_buffer(buf, 5); } + return *this; +} - template inline packer& packer::pack_array(uint32_t n) - { - if (n < 16) { - char d = static_cast(0x90u | n); - append_buffer(&d, 1); - } else if (n < 65536) { - char buf[3]; - buf[0] = static_cast(0xdcu); - _msgpack_store16(&buf[1], static_cast(n)); - append_buffer(buf, 3); - } else { - char buf[5]; - buf[0] = static_cast(0xddu); - _msgpack_store32(&buf[1], static_cast(n)); - append_buffer(buf, 5); - } - return *this; +template +inline packer& packer::pack_str_body(const char* b, uint32_t l) +{ + append_buffer(b, l); + return *this; +} + +// Raw (V4) + +template +inline packer& packer::pack_v4raw(uint32_t l) +{ + if(l < 32) { + unsigned char d = static_cast(0xa0u | l); + char buf = take8_8(d); + append_buffer(&buf, 1); + } else if(l < 65536) { + char buf[3]; + buf[0] = static_cast(0xdau); _msgpack_store16(&buf[1], static_cast(l)); + append_buffer(buf, 3); + } else { + char buf[5]; + buf[0] = static_cast(0xdbu); _msgpack_store32(&buf[1], static_cast(l)); + append_buffer(buf, 5); } + return *this; +} - template inline packer& packer::pack_map(uint32_t n) - { - if (n < 16) { - unsigned char d = static_cast(0x80u | n); - char buf = take8_8(d); - append_buffer(&buf, 1); - } else if (n < 65536) { - char buf[3]; - buf[0] = static_cast(0xdeu); - _msgpack_store16(&buf[1], static_cast(n)); - append_buffer(buf, 3); - } else { - char buf[5]; - buf[0] = static_cast(0xdfu); - _msgpack_store32(&buf[1], static_cast(n)); - append_buffer(buf, 5); - } - return *this; +template +inline packer& packer::pack_v4raw_body(const char* b, uint32_t l) +{ + append_buffer(b, l); + return *this; +} + +template +inline packer& packer::pack_bin(uint32_t l) +{ + if(l < 256) { + char buf[2]; + buf[0] = static_cast(0xc4u); buf[1] = static_cast(l); + append_buffer(buf, 2); + } else if(l < 65536) { + char buf[3]; + buf[0] = static_cast(0xc5u); _msgpack_store16(&buf[1], static_cast(l)); + append_buffer(buf, 3); + } else { + char buf[5]; + buf[0] = static_cast(0xc6u); _msgpack_store32(&buf[1], static_cast(l)); + append_buffer(buf, 5); } + return *this; +} - template inline packer& packer::pack_str(uint32_t l) - { - if (l < 32) { - unsigned char d = static_cast(0xa0u | l); - char buf = take8_8(d); - append_buffer(&buf, 1); - } else if (l < 256) { - char buf[2]; - buf[0] = static_cast(0xd9u); - buf[1] = static_cast(l); - append_buffer(buf, 2); - } else if (l < 65536) { +template +inline packer& packer::pack_bin_body(const char* b, uint32_t l) +{ + append_buffer(b, l); + return *this; +} + +template +inline packer& packer::pack_ext(size_t l, int8_t type) +{ + switch(l) { + case 1: { + char buf[2]; + buf[0] = static_cast(0xd4u); + buf[1] = static_cast(type); + append_buffer(buf, 2); + } break; + case 2: { + char buf[2]; + buf[0] = static_cast(0xd5u); + buf[1] = static_cast(type); + append_buffer(buf, 2); + } break; + case 4: { + char buf[2]; + buf[0] = static_cast(0xd6u); + buf[1] = static_cast(type); + append_buffer(buf, 2); + } break; + case 8: { + char buf[2]; + buf[0] = static_cast(0xd7u); + buf[1] = static_cast(type); + append_buffer(buf, 2); + } break; + case 16: { + char buf[2]; + buf[0] = static_cast(0xd8u); + buf[1] = static_cast(type); + append_buffer(buf, 2); + } break; + default: + if(l < 256) { char buf[3]; - buf[0] = static_cast(0xdau); - _msgpack_store16(&buf[1], static_cast(l)); + buf[0] = static_cast(0xc7u); + buf[1] = static_cast(l); + buf[2] = static_cast(type); append_buffer(buf, 3); + } else if(l < 65536) { + char buf[4]; + buf[0] = static_cast(0xc8u); + _msgpack_store16(&buf[1], static_cast(l)); + buf[3] = static_cast(type); + append_buffer(buf, 4); } else { - char buf[5]; - buf[0] = static_cast(0xdbu); + char buf[6]; + buf[0] = static_cast(0xc9u); _msgpack_store32(&buf[1], static_cast(l)); - append_buffer(buf, 5); + buf[5] = static_cast(type); + append_buffer(buf, 6); } - return *this; + break; } + return *this; +} - template inline packer& packer::pack_str_body(const char* b, uint32_t l) - { - append_buffer(b, l); - return *this; +template +inline packer& packer::pack_ext_body(const char* b, uint32_t l) +{ + append_buffer(b, l); + return *this; +} + +template +template +inline void packer::pack_imp_uint8(T d) +{ + if(d < (1<<7)) { + /* fixnum */ + char buf = take8_8(d); + append_buffer(&buf, 1); + } else { + /* unsigned 8 */ + char buf[2] = {static_cast(0xccu), take8_8(d)}; + append_buffer(buf, 2); } +} - // Raw (V4) +template +template +inline void packer::pack_imp_uint16(T d) +{ + if(d < (1<<7)) { + /* fixnum */ + char buf = take8_16(d); + append_buffer(&buf, 1); + } else if(d < (1<<8)) { + /* unsigned 8 */ + char buf[2] = {static_cast(0xccu), take8_16(d)}; + append_buffer(buf, 2); + } else { + /* unsigned 16 */ + char buf[3]; + buf[0] = static_cast(0xcdu); _msgpack_store16(&buf[1], static_cast(d)); + append_buffer(buf, 3); + } +} - template inline packer& packer::pack_v4raw(uint32_t l) - { - if (l < 32) { - unsigned char d = static_cast(0xa0u | l); - char buf = take8_8(d); +template +template +inline void packer::pack_imp_uint32(T d) +{ + if(d < (1<<8)) { + if(d < (1<<7)) { + /* fixnum */ + char buf = take8_32(d); append_buffer(&buf, 1); - } else if (l < 65536) { + } else { + /* unsigned 8 */ + char buf[2] = {static_cast(0xccu), take8_32(d)}; + append_buffer(buf, 2); + } + } else { + if(d < (1<<16)) { + /* unsigned 16 */ char buf[3]; - buf[0] = static_cast(0xdau); - _msgpack_store16(&buf[1], static_cast(l)); + buf[0] = static_cast(0xcdu); _msgpack_store16(&buf[1], static_cast(d)); append_buffer(buf, 3); } else { + /* unsigned 32 */ char buf[5]; - buf[0] = static_cast(0xdbu); - _msgpack_store32(&buf[1], static_cast(l)); + buf[0] = static_cast(0xceu); _msgpack_store32(&buf[1], static_cast(d)); append_buffer(buf, 5); } - return *this; - } - - template inline packer& packer::pack_v4raw_body(const char* b, uint32_t l) - { - append_buffer(b, l); - return *this; } +} - template inline packer& packer::pack_bin(uint32_t l) - { - if (l < 256) { - char buf[2]; - buf[0] = static_cast(0xc4u); - buf[1] = static_cast(l); +template +template +inline void packer::pack_imp_uint64(T d) +{ + if(d < (1ULL<<8)) { + if(d < (1ULL<<7)) { + /* fixnum */ + char buf = take8_64(d); + append_buffer(&buf, 1); + } else { + /* unsigned 8 */ + char buf[2] = {static_cast(0xccu), take8_64(d)}; append_buffer(buf, 2); - } else if (l < 65536) { + } + } else { + if(d < (1ULL<<16)) { + /* unsigned 16 */ char buf[3]; - buf[0] = static_cast(0xc5u); - _msgpack_store16(&buf[1], static_cast(l)); + buf[0] = static_cast(0xcdu); _msgpack_store16(&buf[1], static_cast(d)); append_buffer(buf, 3); - } else { + } else if(d < (1ULL<<32)) { + /* unsigned 32 */ char buf[5]; - buf[0] = static_cast(0xc6u); - _msgpack_store32(&buf[1], static_cast(l)); + buf[0] = static_cast(0xceu); _msgpack_store32(&buf[1], static_cast(d)); append_buffer(buf, 5); + } else { + /* unsigned 64 */ + char buf[9]; + buf[0] = static_cast(0xcfu); _msgpack_store64(&buf[1], d); + append_buffer(buf, 9); } - return *this; } +} - template inline packer& packer::pack_bin_body(const char* b, uint32_t l) - { - append_buffer(b, l); - return *this; +template +template +inline void packer::pack_imp_int8(T d) +{ + if(d < -(1<<5)) { + /* signed 8 */ + char buf[2] = {static_cast(0xd0u), take8_8(d)}; + append_buffer(buf, 2); + } else { + /* fixnum */ + char buf = take8_8(d); + append_buffer(&buf, 1); } +} - template inline packer& packer::pack_ext(size_t l, int8_t type) - { - switch (l) { - case 1: { - char buf[2]; - buf[0] = static_cast(0xd4u); - buf[1] = static_cast(type); - append_buffer(buf, 2); - } break; - case 2: { - char buf[2]; - buf[0] = static_cast(0xd5u); - buf[1] = static_cast(type); - append_buffer(buf, 2); - } break; - case 4: { - char buf[2]; - buf[0] = static_cast(0xd6u); - buf[1] = static_cast(type); - append_buffer(buf, 2); - } break; - case 8: { - char buf[2]; - buf[0] = static_cast(0xd7u); - buf[1] = static_cast(type); +template +template +inline void packer::pack_imp_int16(T d) +{ + if(d < -(1<<5)) { + if(d < -(1<<7)) { + /* signed 16 */ + char buf[3]; + buf[0] = static_cast(0xd1u); _msgpack_store16(&buf[1], static_cast(d)); + append_buffer(buf, 3); + } else { + /* signed 8 */ + char buf[2] = {static_cast(0xd0u), take8_16(d)}; append_buffer(buf, 2); - } break; - case 16: { - char buf[2]; - buf[0] = static_cast(0xd8u); - buf[1] = static_cast(type); + } + } else if(d < (1<<7)) { + /* fixnum */ + char buf = take8_16(d); + append_buffer(&buf, 1); + } else { + if(d < (1<<8)) { + /* unsigned 8 */ + char buf[2] = {static_cast(0xccu), take8_16(d)}; append_buffer(buf, 2); - } break; - default: - if (l < 256) { - char buf[3]; - buf[0] = static_cast(0xc7u); - buf[1] = static_cast(l); - buf[2] = static_cast(type); - append_buffer(buf, 3); - } else if (l < 65536) { - char buf[4]; - buf[0] = static_cast(0xc8u); - _msgpack_store16(&buf[1], static_cast(l)); - buf[3] = static_cast(type); - append_buffer(buf, 4); - } else { - char buf[6]; - buf[0] = static_cast(0xc9u); - _msgpack_store32(&buf[1], static_cast(l)); - buf[5] = static_cast(type); - append_buffer(buf, 6); - } - break; + } else { + /* unsigned 16 */ + char buf[3]; + buf[0] = static_cast(0xcdu); _msgpack_store16(&buf[1], static_cast(d)); + append_buffer(buf, 3); } - return *this; } +} - template inline packer& packer::pack_ext_body(const char* b, uint32_t l) - { - append_buffer(b, l); - return *this; - } - - template template inline void packer::pack_imp_uint8(T d) - { - if (d < (1 << 7)) { - /* fixnum */ - char buf = take8_8(d); - append_buffer(&buf, 1); +template +template +inline void packer::pack_imp_int32(T d) +{ + if(d < -(1<<5)) { + if(d < -(1<<15)) { + /* signed 32 */ + char buf[5]; + buf[0] = static_cast(0xd2u); _msgpack_store32(&buf[1], static_cast(d)); + append_buffer(buf, 5); + } else if(d < -(1<<7)) { + /* signed 16 */ + char buf[3]; + buf[0] = static_cast(0xd1u); _msgpack_store16(&buf[1], static_cast(d)); + append_buffer(buf, 3); } else { - /* unsigned 8 */ - char buf[2] = { static_cast(0xccu), take8_8(d) }; + /* signed 8 */ + char buf[2] = { static_cast(0xd0u), take8_32(d)}; append_buffer(buf, 2); } - } - - template template inline void packer::pack_imp_uint16(T d) - { - if (d < (1 << 7)) { - /* fixnum */ - char buf = take8_16(d); - append_buffer(&buf, 1); - } else if (d < (1 << 8)) { + } else if(d < (1<<7)) { + /* fixnum */ + char buf = take8_32(d); + append_buffer(&buf, 1); + } else { + if(d < (1<<8)) { /* unsigned 8 */ - char buf[2] = { static_cast(0xccu), take8_16(d) }; + char buf[2] = { static_cast(0xccu), take8_32(d)}; append_buffer(buf, 2); - } else { + } else if(d < (1<<16)) { /* unsigned 16 */ char buf[3]; - buf[0] = static_cast(0xcdu); - _msgpack_store16(&buf[1], static_cast(d)); + buf[0] = static_cast(0xcdu); _msgpack_store16(&buf[1], static_cast(d)); append_buffer(buf, 3); - } - } - - template template inline void packer::pack_imp_uint32(T d) - { - if (d < (1 << 8)) { - if (d < (1 << 7)) { - /* fixnum */ - char buf = take8_32(d); - append_buffer(&buf, 1); - } else { - /* unsigned 8 */ - char buf[2] = { static_cast(0xccu), take8_32(d) }; - append_buffer(buf, 2); - } } else { - if (d < (1 << 16)) { - /* unsigned 16 */ - char buf[3]; - buf[0] = static_cast(0xcdu); - _msgpack_store16(&buf[1], static_cast(d)); - append_buffer(buf, 3); - } else { - /* unsigned 32 */ - char buf[5]; - buf[0] = static_cast(0xceu); - _msgpack_store32(&buf[1], static_cast(d)); - append_buffer(buf, 5); - } + /* unsigned 32 */ + char buf[5]; + buf[0] = static_cast(0xceu); _msgpack_store32(&buf[1], static_cast(d)); + append_buffer(buf, 5); } } +} - template template inline void packer::pack_imp_uint64(T d) - { - if (d < (1ULL << 8)) { - if (d < (1ULL << 7)) { - /* fixnum */ - char buf = take8_64(d); - append_buffer(&buf, 1); +template +template +inline void packer::pack_imp_int64(T d) +{ + if(d < -(1LL<<5)) { + if(d < -(1LL<<15)) { + if(d < -(1LL<<31)) { + /* signed 64 */ + char buf[9]; + buf[0] = static_cast(0xd3u); _msgpack_store64(&buf[1], d); + append_buffer(buf, 9); } else { - /* unsigned 8 */ - char buf[2] = { static_cast(0xccu), take8_64(d) }; - append_buffer(buf, 2); - } - } else { - if (d < (1ULL << 16)) { - /* unsigned 16 */ - char buf[3]; - buf[0] = static_cast(0xcdu); - _msgpack_store16(&buf[1], static_cast(d)); - append_buffer(buf, 3); - } else if (d < (1ULL << 32)) { - /* unsigned 32 */ + /* signed 32 */ char buf[5]; - buf[0] = static_cast(0xceu); - _msgpack_store32(&buf[1], static_cast(d)); + buf[0] = static_cast(0xd2u); _msgpack_store32(&buf[1], static_cast(d)); append_buffer(buf, 5); - } else { - /* unsigned 64 */ - char buf[9]; - buf[0] = static_cast(0xcfu); - _msgpack_store64(&buf[1], d); - append_buffer(buf, 9); } - } - } - - template template inline void packer::pack_imp_int8(T d) - { - if (d < -(1 << 5)) { - /* signed 8 */ - char buf[2] = { static_cast(0xd0u), take8_8(d) }; - append_buffer(buf, 2); } else { - /* fixnum */ - char buf = take8_8(d); - append_buffer(&buf, 1); - } - } - - template template inline void packer::pack_imp_int16(T d) - { - if (d < -(1 << 5)) { - if (d < -(1 << 7)) { + if(d < -(1<<7)) { /* signed 16 */ char buf[3]; - buf[0] = static_cast(0xd1u); - _msgpack_store16(&buf[1], static_cast(d)); + buf[0] = static_cast(0xd1u); _msgpack_store16(&buf[1], static_cast(d)); append_buffer(buf, 3); } else { /* signed 8 */ - char buf[2] = { static_cast(0xd0u), take8_16(d) }; + char buf[2] = {static_cast(0xd0u), take8_64(d)}; append_buffer(buf, 2); } - } else if (d < (1 << 7)) { - /* fixnum */ - char buf = take8_16(d); - append_buffer(&buf, 1); - } else { - if (d < (1 << 8)) { + } + } else if(d < (1<<7)) { + /* fixnum */ + char buf = take8_64(d); + append_buffer(&buf, 1); + } else { + if(d < (1LL<<16)) { + if(d < (1<<8)) { /* unsigned 8 */ - char buf[2] = { static_cast(0xccu), take8_16(d) }; + char buf[2] = {static_cast(0xccu), take8_64(d)}; append_buffer(buf, 2); } else { /* unsigned 16 */ char buf[3]; - buf[0] = static_cast(0xcdu); - _msgpack_store16(&buf[1], static_cast(d)); - append_buffer(buf, 3); - } - } - } - - template template inline void packer::pack_imp_int32(T d) - { - if (d < -(1 << 5)) { - if (d < -(1 << 15)) { - /* signed 32 */ - char buf[5]; - buf[0] = static_cast(0xd2u); - _msgpack_store32(&buf[1], static_cast(d)); - append_buffer(buf, 5); - } else if (d < -(1 << 7)) { - /* signed 16 */ - char buf[3]; - buf[0] = static_cast(0xd1u); - _msgpack_store16(&buf[1], static_cast(d)); + buf[0] = static_cast(0xcdu); _msgpack_store16(&buf[1], static_cast(d)); append_buffer(buf, 3); - } else { - /* signed 8 */ - char buf[2] = { static_cast(0xd0u), take8_32(d) }; - append_buffer(buf, 2); } - } else if (d < (1 << 7)) { - /* fixnum */ - char buf = take8_32(d); - append_buffer(&buf, 1); } else { - if (d < (1 << 8)) { - /* unsigned 8 */ - char buf[2] = { static_cast(0xccu), take8_32(d) }; - append_buffer(buf, 2); - } else if (d < (1 << 16)) { - /* unsigned 16 */ - char buf[3]; - buf[0] = static_cast(0xcdu); - _msgpack_store16(&buf[1], static_cast(d)); - append_buffer(buf, 3); - } else { + if(d < (1LL<<32)) { /* unsigned 32 */ char buf[5]; - buf[0] = static_cast(0xceu); - _msgpack_store32(&buf[1], static_cast(d)); + buf[0] = static_cast(0xceu); _msgpack_store32(&buf[1], static_cast(d)); append_buffer(buf, 5); - } - } - } - - template template inline void packer::pack_imp_int64(T d) - { - if (d < -(1LL << 5)) { - if (d < -(1LL << 15)) { - if (d < -(1LL << 31)) { - /* signed 64 */ - char buf[9]; - buf[0] = static_cast(0xd3u); - _msgpack_store64(&buf[1], d); - append_buffer(buf, 9); - } else { - /* signed 32 */ - char buf[5]; - buf[0] = static_cast(0xd2u); - _msgpack_store32(&buf[1], static_cast(d)); - append_buffer(buf, 5); - } - } else { - if (d < -(1 << 7)) { - /* signed 16 */ - char buf[3]; - buf[0] = static_cast(0xd1u); - _msgpack_store16(&buf[1], static_cast(d)); - append_buffer(buf, 3); - } else { - /* signed 8 */ - char buf[2] = { static_cast(0xd0u), take8_64(d) }; - append_buffer(buf, 2); - } - } - } else if (d < (1 << 7)) { - /* fixnum */ - char buf = take8_64(d); - append_buffer(&buf, 1); - } else { - if (d < (1LL << 16)) { - if (d < (1 << 8)) { - /* unsigned 8 */ - char buf[2] = { static_cast(0xccu), take8_64(d) }; - append_buffer(buf, 2); - } else { - /* unsigned 16 */ - char buf[3]; - buf[0] = static_cast(0xcdu); - _msgpack_store16(&buf[1], static_cast(d)); - append_buffer(buf, 3); - } } else { - if (d < (1LL << 32)) { - /* unsigned 32 */ - char buf[5]; - buf[0] = static_cast(0xceu); - _msgpack_store32(&buf[1], static_cast(d)); - append_buffer(buf, 5); - } else { - /* unsigned 64 */ - char buf[9]; - buf[0] = static_cast(0xcfu); - _msgpack_store64(&buf[1], d); - append_buffer(buf, 9); - } + /* unsigned 64 */ + char buf[9]; + buf[0] = static_cast(0xcfu); _msgpack_store64(&buf[1], d); + append_buffer(buf, 9); } } } +} - /// @cond -} // MSGPACK_API_VERSION_NAMESPACE(v1) +/// @cond +} // MSGPACK_API_VERSION_NAMESPACE(v1) /// @endcond -} // namespace msgpack +} // namespace msgpack #endif // MSGPACK_V1_PACK_HPP diff --git a/barretenberg/cpp/src/msgpack-c/include/msgpack/v2/object_fwd.hpp b/barretenberg/cpp/src/msgpack-c/include/msgpack/v2/object_fwd.hpp index 38a95e258e5..45a63118088 100644 --- a/barretenberg/cpp/src/msgpack-c/include/msgpack/v2/object_fwd.hpp +++ b/barretenberg/cpp/src/msgpack-c/include/msgpack/v2/object_fwd.hpp @@ -11,89 +11,96 @@ #ifndef MSGPACK_V2_OBJECT_FWD_HPP #define MSGPACK_V2_OBJECT_FWD_HPP -#include "msgpack/object_fwd.hpp" #include "msgpack/v2/object_fwd_decl.hpp" +#include "msgpack/object_fwd.hpp" namespace msgpack { /// @cond -MSGPACK_API_VERSION_NAMESPACE(v2) -{ - /// @endcond - - struct object : v1::object { - object() {} - object(v1::object const& o) - : v1::object(o) - {} - /// Construct object from T - /** - * If `v` is the type that is corresponding to MessegePack format str, bin, ext, array, or map, - * you need to call `object(const T& v, msgpack::zone& z)` instead of this constructor. - * - * @tparam T The type of `v`. - * @param v The value you want to convert. - */ - template explicit object(const T& v) { *this << v; } - - /// Construct object from T - /** - * The object is constructed on the zone `z`. - * See https://github.com/msgpack/msgpack-c/wiki/v1_1_cpp_object - * - * @tparam T The type of `v`. - * @param v The value you want to convert. - * @param z The zone that is used by the object. - */ - template - object(const T& v, msgpack::zone& z) - : v1::object(v, z) - {} - - public: - /// Convert the object - /** - * If the object can't be converted to T, msgpack::type_error would be thrown. - * @tparam T The type of v. - * @param v The value you want to get. `v` is output parameter. `v` is overwritten by converted value from the - * object. - * @return The reference of `v`. - */ - template T& convert(T& v) const { return v1::object::convert(v); } - - using v1::object::with_zone; - implicit_type convert() const; - }; +MSGPACK_API_VERSION_NAMESPACE(v2) { +/// @endcond + +struct object : v1::object { + object() {} + object(v1::object const& o):v1::object(o) {} + /// Construct object from T + /** + * If `v` is the type that is corresponding to MessegePack format str, bin, ext, array, or map, + * you need to call `object(const T& v, msgpack::zone& z)` instead of this constructor. + * + * @tparam T The type of `v`. + * @param v The value you want to convert. + */ + template + explicit object(const T& v) { + *this << v; + } + + /// Construct object from T + /** + * The object is constructed on the zone `z`. + * See https://github.com/msgpack/msgpack-c/wiki/v1_1_cpp_object + * + * @tparam T The type of `v`. + * @param v The value you want to convert. + * @param z The zone that is used by the object. + */ + template + object(const T& v, msgpack::zone& z):v1::object(v, z) {} + +public: + /// Convert the object + /** + * If the object can't be converted to T, msgpack::type_error would be thrown. + * @tparam T The type of v. + * @param v The value you want to get. `v` is output parameter. `v` is overwritten by converted value from the object. + * @return The reference of `v`. + */ + template + T& convert(T& v) const { return v1::object::convert(v); } + + using v1::object::with_zone; + implicit_type convert() const; +}; #if !defined(MSGPACK_USE_CPP03) - namespace adaptor { +namespace adaptor { - // If v1 has as specialization for T, then dispatch v1::adaptor::as. - // So I call v1::has_as meta function intentionally. - template struct as::value>::type> : v1::adaptor::as {}; +// If v1 has as specialization for T, then dispatch v1::adaptor::as. +// So I call v1::has_as meta function intentionally. +template +struct as::value>::type> : v1::adaptor::as { +}; - } // namespace adaptor +} // namespace adaptor - template struct has_as { - private: - template - static auto check_(U*) -> typename std::enable_if< +template +struct has_as { +private: + template + static auto check_(U*) -> + typename std::enable_if< // check v2 specialization - std::is_same()(std::declval())), U>::value || - // check v1 specialization - v1::has_as::value, - std::true_type>::type; - template static std::false_type check_(...); - - public: - using type = decltype(check_(MSGPACK_NULLPTR)); - static constexpr bool value = type::value; - }; + std::is_same< + decltype(adaptor::as()(std::declval())), + U + >::value + || + // check v1 specialization + v1::has_as::value, + std::true_type + >::type; + template + static std::false_type check_(...); +public: + using type = decltype(check_(MSGPACK_NULLPTR)); + static constexpr bool value = type::value; +}; #endif // !defined(MSGPACK_USE_CPP03) - /// @cond +/// @cond } // MSGPACK_API_VERSION_NAMESPACE(v2) /// @endcond diff --git a/barretenberg/cpp/src/msgpack-c/include/msgpack/v3/object_fwd.hpp b/barretenberg/cpp/src/msgpack-c/include/msgpack/v3/object_fwd.hpp index 0fa02c7a149..a0ed44aebb7 100644 --- a/barretenberg/cpp/src/msgpack-c/include/msgpack/v3/object_fwd.hpp +++ b/barretenberg/cpp/src/msgpack-c/include/msgpack/v3/object_fwd.hpp @@ -11,47 +11,57 @@ #ifndef MSGPACK_V3_OBJECT_FWD_HPP #define MSGPACK_V3_OBJECT_FWD_HPP -#include "msgpack/object_fwd.hpp" #include "msgpack/v3/object_fwd_decl.hpp" +#include "msgpack/object_fwd.hpp" namespace msgpack { /// @cond -MSGPACK_API_VERSION_NAMESPACE(v3) -{ - /// @endcond +MSGPACK_API_VERSION_NAMESPACE(v3) { +/// @endcond #if !defined(MSGPACK_USE_CPP03) - namespace adaptor { +namespace adaptor { - // If v2 has as specialization for T, then dispatch v2::adaptor::as. - // So I call v2::has_as meta function intentionally. - template struct as::value>::type> : v2::adaptor::as {}; +// If v2 has as specialization for T, then dispatch v2::adaptor::as. +// So I call v2::has_as meta function intentionally. +template +struct as::value>::type> : v2::adaptor::as { +}; - } // namespace adaptor +} // namespace adaptor - template struct has_as { - private: - template - static auto check_(U*) -> typename std::enable_if< +template +struct has_as { +private: + template + static auto check_(U*) -> + typename std::enable_if< // check v3 specialization - std::is_same()(std::declval())), U>::value || - // check v2 specialization - v2::has_as::value || - // check v1 specialization - v1::has_as::value, - std::true_type>::type; - template static std::false_type check_(...); - - public: - using type = decltype(check_(MSGPACK_NULLPTR)); - static constexpr bool value = type::value; - }; + std::is_same< + decltype(adaptor::as()(std::declval())), + U + >::value + || + // check v2 specialization + v2::has_as::value + || + // check v1 specialization + v1::has_as::value, + std::true_type + >::type; + template + static std::false_type check_(...); +public: + using type = decltype(check_(MSGPACK_NULLPTR)); + static constexpr bool value = type::value; +}; #endif // !defined(MSGPACK_USE_CPP03) - /// @cond + +/// @cond } // MSGPACK_API_VERSION_NAMESPACE(v3) /// @endcond diff --git a/barretenberg/cpp/src/msgpack-c/include/msgpack/version_master.hpp b/barretenberg/cpp/src/msgpack-c/include/msgpack/version_master.hpp index 1b8b0ec220a..ad76f7373a6 100644 --- a/barretenberg/cpp/src/msgpack-c/include/msgpack/version_master.hpp +++ b/barretenberg/cpp/src/msgpack-c/include/msgpack/version_master.hpp @@ -1,3 +1,3 @@ -#define MSGPACK_VERSION_MAJOR 6 -#define MSGPACK_VERSION_MINOR 1 +#define MSGPACK_VERSION_MAJOR 6 +#define MSGPACK_VERSION_MINOR 1 #define MSGPACK_VERSION_REVISION 0 diff --git a/barretenberg/cpp/src/msgpack-c/test/boost_variant.cpp b/barretenberg/cpp/src/msgpack-c/test/boost_variant.cpp index 22b7c5958aa..647fa474104 100644 --- a/barretenberg/cpp/src/msgpack-c/test/boost_variant.cpp +++ b/barretenberg/cpp/src/msgpack-c/test/boost_variant.cpp @@ -1,7 +1,7 @@ #include -#include #include #include +#include #define BOOST_TEST_MODULE MSGPACK_BOOST #include @@ -12,8 +12,10 @@ #if defined(MSGPACK_NO_BOOST) -BOOST_AUTO_TEST_CASE(empty) {} -#else // defined(MSGPACK_NO_BOOST) +BOOST_AUTO_TEST_CASE(empty) +{ +} +#else // defined(MSGPACK_NO_BOOST) const double kEPS = 1e-10; @@ -27,7 +29,8 @@ BOOST_AUTO_TEST_CASE(pack_convert_variant_nil) msgpack::pack(ss, val1); std::string const& str = ss.str(); - msgpack::object_handle oh = msgpack::unpack(str.data(), str.size()); + msgpack::object_handle oh = + msgpack::unpack(str.data(), str.size()); msgpack::type::variant val2 = oh.get().as(); BOOST_CHECK(val2.is_nil()); BOOST_CHECK_NO_THROW(boost::get(val2)); @@ -65,7 +68,8 @@ BOOST_AUTO_TEST_CASE(pack_convert_variant_nil_default) msgpack::pack(ss, val1); std::string const& str = ss.str(); - msgpack::object_handle oh = msgpack::unpack(str.data(), str.size()); + msgpack::object_handle oh = + msgpack::unpack(str.data(), str.size()); msgpack::type::variant val2 = oh.get().as(); BOOST_CHECK(val2.is_nil()); BOOST_CHECK_NO_THROW(boost::get(val2)); @@ -104,7 +108,8 @@ BOOST_AUTO_TEST_CASE(pack_convert_variant_bool) msgpack::pack(ss, val1); std::string const& str = ss.str(); - msgpack::object_handle oh = msgpack::unpack(str.data(), str.size()); + msgpack::object_handle oh = + msgpack::unpack(str.data(), str.size()); msgpack::type::variant val2 = oh.get().as(); BOOST_CHECK(val2.is_bool()); BOOST_CHECK(val2.as_bool()); @@ -157,7 +162,8 @@ BOOST_AUTO_TEST_CASE(pack_convert_variant_positive_integer) msgpack::pack(ss, val1); std::string const& str = ss.str(); - msgpack::object_handle oh = msgpack::unpack(str.data(), str.size()); + msgpack::object_handle oh = + msgpack::unpack(str.data(), str.size()); msgpack::type::variant val2 = oh.get().as(); BOOST_CHECK(val2.is_uint64_t()); BOOST_CHECK_EQUAL(val2.as_uint64_t(), 123U); @@ -204,7 +210,8 @@ BOOST_AUTO_TEST_CASE(pack_convert_variant_negative_integer) msgpack::pack(ss, val1); std::string const& str = ss.str(); - msgpack::object_handle oh = msgpack::unpack(str.data(), str.size()); + msgpack::object_handle oh = + msgpack::unpack(str.data(), str.size()); msgpack::type::variant val2 = oh.get().as(); BOOST_CHECK(val2.is_int64_t()); BOOST_CHECK_EQUAL(val2.as_int64_t(), -123); @@ -251,7 +258,8 @@ BOOST_AUTO_TEST_CASE(pack_convert_variant_float) msgpack::pack(ss, val1); std::string const& str = ss.str(); - msgpack::object_handle oh = msgpack::unpack(str.data(), str.size()); + msgpack::object_handle oh = + msgpack::unpack(str.data(), str.size()); msgpack::type::variant val2 = oh.get().as(); BOOST_CHECK(val2.is_double()); BOOST_CHECK(fabs(12.34 - val2.as_double()) <= kEPS); @@ -299,7 +307,8 @@ BOOST_AUTO_TEST_CASE(pack_convert_variant_float_zero_atdp_positive) msgpack::pack(ss, val1); std::string const& str = ss.str(); - msgpack::object_handle oh = msgpack::unpack(str.data(), str.size()); + msgpack::object_handle oh = + msgpack::unpack(str.data(), str.size()); msgpack::type::variant val2 = oh.get().as(); BOOST_CHECK(val2.is_uint64_t()); BOOST_CHECK_EQUAL(val2.as_uint64_t(), 12); @@ -352,7 +361,8 @@ BOOST_AUTO_TEST_CASE(pack_convert_variant_float_zero_atdp_negative) msgpack::pack(ss, val1); std::string const& str = ss.str(); - msgpack::object_handle oh = msgpack::unpack(str.data(), str.size()); + msgpack::object_handle oh = + msgpack::unpack(str.data(), str.size()); msgpack::type::variant val2 = oh.get().as(); BOOST_CHECK(val2.is_int64_t()); BOOST_CHECK_EQUAL(val2.as_int64_t(), -12); @@ -406,7 +416,8 @@ BOOST_AUTO_TEST_CASE(pack_convert_variant_str) msgpack::pack(ss, val1); std::string const& str = ss.str(); - msgpack::object_handle oh = msgpack::unpack(str.data(), str.size()); + msgpack::object_handle oh = + msgpack::unpack(str.data(), str.size()); msgpack::type::variant val2 = oh.get().as(); BOOST_CHECK(val2.is_string()); BOOST_CHECK_EQUAL(val2.as_string(), "ABC"); @@ -414,6 +425,7 @@ BOOST_AUTO_TEST_CASE(pack_convert_variant_str) BOOST_CHECK(val1 == val2); } + BOOST_AUTO_TEST_CASE(object_with_zone_variant_str) { msgpack::zone z; @@ -467,14 +479,17 @@ BOOST_AUTO_TEST_CASE(pack_convert_variant_bin) msgpack::pack(ss, val1); std::string const& str = ss.str(); - msgpack::object_handle oh = msgpack::unpack(str.data(), str.size()); + msgpack::object_handle oh = + msgpack::unpack(str.data(), str.size()); msgpack::type::variant val2 = oh.get().as(); BOOST_CHECK(val2.is_vector_char()); BOOST_CHECK(val2.as_vector_char() == v); - BOOST_CHECK_NO_THROW(boost::get>(val2)); + BOOST_CHECK_NO_THROW(boost::get >(val2)); BOOST_CHECK(val1 == val2); } + + BOOST_AUTO_TEST_CASE(object_with_zone_variant_bin) { msgpack::zone z; @@ -489,7 +504,7 @@ BOOST_AUTO_TEST_CASE(object_with_zone_variant_bin) msgpack::type::variant val2 = obj.as(); BOOST_CHECK(val2.is_vector_char()); BOOST_CHECK(val2.as_vector_char() == v); - BOOST_CHECK_NO_THROW(boost::get>(val2)); + BOOST_CHECK_NO_THROW(boost::get >(val2)); BOOST_CHECK(val1 == val2); } @@ -512,8 +527,8 @@ BOOST_AUTO_TEST_CASE(object_with_zone_variant_raw_ref) // Converted as std::vector. BOOST_CHECK(val2.is_vector_char()); BOOST_CHECK(val2.as_vector_char() == v); - BOOST_CHECK_NO_THROW(boost::get>(val2)); - // msgpack::type::raw_ref and std::vector are different. + BOOST_CHECK_NO_THROW(boost::get >(val2)); + // msgpack::type::raw_ref and std::vector are different. BOOST_CHECK(!(val1 == val2)); } @@ -536,7 +551,8 @@ BOOST_AUTO_TEST_CASE(pack_convert_variant_ext) msgpack::pack(ss, val1); std::string const& str = ss.str(); - msgpack::object_handle oh = msgpack::unpack(str.data(), str.size()); + msgpack::object_handle oh = + msgpack::unpack(str.data(), str.size()); msgpack::type::variant val2 = oh.get().as(); BOOST_CHECK(val2.is_ext()); BOOST_CHECK(val2.as_ext() == e); @@ -581,7 +597,7 @@ BOOST_AUTO_TEST_CASE(object_with_zone_variant_ext_ref) BOOST_CHECK(val2.is_ext()); BOOST_CHECK(val2.as_ext() == msgpack::type::ext(e)); BOOST_CHECK_NO_THROW(boost::get(val2)); - // msgpack::type::ext_ref and msgpack::type::ext are different. + // msgpack::type::ext_ref and msgpack::type::ext are different. BOOST_CHECK(!(val1 == val2)); } @@ -601,11 +617,12 @@ BOOST_AUTO_TEST_CASE(pack_convert_variant_array) msgpack::pack(ss, val1); std::string const& str = ss.str(); - msgpack::object_handle oh = msgpack::unpack(str.data(), str.size()); + msgpack::object_handle oh = + msgpack::unpack(str.data(), str.size()); msgpack::type::variant val2 = oh.get().as(); BOOST_CHECK(val2.is_vector()); BOOST_CHECK(val2.as_vector() == v); - BOOST_CHECK_NO_THROW(boost::get>(val2)); + BOOST_CHECK_NO_THROW(boost::get >(val2)); BOOST_CHECK(val1 == val2); } @@ -623,7 +640,7 @@ BOOST_AUTO_TEST_CASE(object_with_zone_variant_array) msgpack::type::variant val2 = obj.as(); BOOST_CHECK(val2.is_vector()); BOOST_CHECK(val2.as_vector() == v); - BOOST_CHECK_NO_THROW(boost::get>(val2)); + BOOST_CHECK_NO_THROW(boost::get >(val2)); BOOST_CHECK(val1 == val2); } @@ -643,7 +660,8 @@ BOOST_AUTO_TEST_CASE(pack_convert_variant_map) msgpack::pack(ss, val1); std::string const& str = ss.str(); - msgpack::object_handle oh = msgpack::unpack(str.data(), str.size()); + msgpack::object_handle oh = + msgpack::unpack(str.data(), str.size()); msgpack::type::variant val2 = oh.get().as(); BOOST_CHECK(val2.is_multimap()); BOOST_CHECK(val2.as_multimap() == v); @@ -687,7 +705,8 @@ BOOST_AUTO_TEST_CASE(pack_convert_variant_ref_str) msgpack::pack(ss, val1); std::string const& str = ss.str(); - msgpack::object_handle oh = msgpack::unpack(str.data(), str.size()); + msgpack::object_handle oh = + msgpack::unpack(str.data(), str.size()); msgpack::type::variant_ref val2 = oh.get().as(); BOOST_CHECK(val2.is_boost_string_ref()); BOOST_CHECK_EQUAL(val2.as_boost_string_ref(), sr); @@ -695,6 +714,8 @@ BOOST_AUTO_TEST_CASE(pack_convert_variant_ref_str) BOOST_CHECK(val1 == val2); } + + BOOST_AUTO_TEST_CASE(object_with_zone_variant_ref_str) { msgpack::zone z; @@ -730,7 +751,8 @@ BOOST_AUTO_TEST_CASE(pack_convert_variant_ref_bin) msgpack::pack(ss, val1); std::string const& str = ss.str(); - msgpack::object_handle oh = msgpack::unpack(str.data(), str.size()); + msgpack::object_handle oh = + msgpack::unpack(str.data(), str.size()); msgpack::type::variant_ref val2 = oh.get().as(); BOOST_CHECK(val2.is_raw_ref()); BOOST_CHECK(val2.as_raw_ref() == rr); @@ -738,6 +760,8 @@ BOOST_AUTO_TEST_CASE(pack_convert_variant_ref_bin) BOOST_CHECK(val1 == val2); } + + BOOST_AUTO_TEST_CASE(object_with_zone_variant_ref_bin) { msgpack::zone z; @@ -775,7 +799,8 @@ BOOST_AUTO_TEST_CASE(pack_convert_variant_ref_ext) msgpack::pack(ss, val1); std::string const& str = ss.str(); - msgpack::object_handle oh = msgpack::unpack(str.data(), str.size()); + msgpack::object_handle oh = + msgpack::unpack(str.data(), str.size()); msgpack::type::variant_ref val2 = oh.get().as(); BOOST_CHECK_NO_THROW(boost::get(val2)); BOOST_CHECK(val2.is_ext_ref()); @@ -783,6 +808,7 @@ BOOST_AUTO_TEST_CASE(pack_convert_variant_ref_ext) BOOST_CHECK(val1 == val2); } + BOOST_AUTO_TEST_CASE(object_with_zone_variant_ref_ext) { msgpack::zone z; @@ -824,11 +850,12 @@ BOOST_AUTO_TEST_CASE(pack_convert_variant_ref_array) msgpack::pack(ss, val1); std::string const& str = ss.str(); - msgpack::object_handle oh = msgpack::unpack(str.data(), str.size()); + msgpack::object_handle oh = + msgpack::unpack(str.data(), str.size()); msgpack::type::variant_ref val2 = oh.get().as(); BOOST_CHECK(val2.is_vector()); BOOST_CHECK(val2.as_vector() == v); - BOOST_CHECK_NO_THROW(boost::get>(val2)); + BOOST_CHECK_NO_THROW(boost::get >(val2)); BOOST_CHECK(val1 == val2); } @@ -851,7 +878,7 @@ BOOST_AUTO_TEST_CASE(object_with_zone_variant_ref_array) msgpack::type::variant_ref val2 = obj.as(); BOOST_CHECK(val2.is_vector()); BOOST_CHECK(val2.as_vector() == v); - BOOST_CHECK_NO_THROW(boost::get>(val2)); + BOOST_CHECK_NO_THROW(boost::get >(val2)); BOOST_CHECK(val1 == val2); } @@ -866,8 +893,7 @@ BOOST_AUTO_TEST_CASE(pack_convert_variant_ref_map) std::string s1("ABC"); std::string s2("DEF"); #if (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53 - v.insert(multimap_t::value_type(msgpack::type::variant_ref(boost::string_ref(s1)), - msgpack::type::variant_ref(boost::string_ref(s2)))); + v.insert(multimap_t::value_type(msgpack::type::variant_ref(boost::string_ref(s1)), msgpack::type::variant_ref(boost::string_ref(s2)))); #else // (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53 v.insert(multimap_t::value_type(msgpack::type::variant_ref(s1), msgpack::type::variant_ref(s2))); #endif // (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53 @@ -878,7 +904,8 @@ BOOST_AUTO_TEST_CASE(pack_convert_variant_ref_map) msgpack::pack(ss, val1); std::string const& str = ss.str(); - msgpack::object_handle oh = msgpack::unpack(str.data(), str.size()); + msgpack::object_handle oh = + msgpack::unpack(str.data(), str.size()); msgpack::type::variant_ref val2 = oh.get().as(); BOOST_CHECK(val2.is_multimap()); BOOST_CHECK(val2.as_multimap() == v); @@ -895,8 +922,7 @@ BOOST_AUTO_TEST_CASE(object_with_zone_variant_ref_map) std::string s1("ABC"); std::string s2("DEF"); #if (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53 - v.insert(multimap_t::value_type(msgpack::type::variant_ref(boost::string_ref(s1)), - msgpack::type::variant_ref(boost::string_ref(s2)))); + v.insert(multimap_t::value_type(msgpack::type::variant_ref(boost::string_ref(s1)), msgpack::type::variant_ref(boost::string_ref(s2)))); #else // (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53 v.insert(multimap_t::value_type(msgpack::type::variant_ref(s1), msgpack::type::variant_ref(s2))); #endif // (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53 diff --git a/barretenberg/cpp/src/msgpack-c/test/msgpack_cpp11.cpp b/barretenberg/cpp/src/msgpack-c/test/msgpack_cpp11.cpp index 242c21c6a8e..3375a27bfdd 100644 --- a/barretenberg/cpp/src/msgpack-c/test/msgpack_cpp11.cpp +++ b/barretenberg/cpp/src/msgpack-c/test/msgpack_cpp11.cpp @@ -9,15 +9,18 @@ #if !defined(MSGPACK_USE_CPP03) -class TestEnumClassMemberClass { - public: +class TestEnumClassMemberClass +{ +public: TestEnumClassMemberClass() - : t1(TestEnumClassType::STATE_A) - , t2(TestEnumClassType::STATE_B) - , t3(TestEnumClassType::STATE_C) - {} - - enum class TestEnumClassType : long { STATE_INVALID = 0, STATE_A = 1, STATE_B = 2, STATE_C = 3 }; + : t1(TestEnumClassType::STATE_A), t2(TestEnumClassType::STATE_B), t3(TestEnumClassType::STATE_C) {} + + enum class TestEnumClassType:long { + STATE_INVALID = 0, + STATE_A = 1, + STATE_B = 2, + STATE_C = 3 + }; TestEnumClassType t1; TestEnumClassType t2; TestEnumClassType t3; @@ -32,6 +35,7 @@ using namespace std; const unsigned int kLoop = 10000; const unsigned int kElements = 100; + // C++11 BOOST_AUTO_TEST_CASE(simple_tuple) @@ -39,8 +43,9 @@ BOOST_AUTO_TEST_CASE(simple_tuple) msgpack::sbuffer sbuf; std::tuple val1(true, "kzk", 12.3); msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); - std::tuple val2 = oh.get().as>(); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); + std::tuple val2 = oh.get().as >(); BOOST_CHECK(val1 == val2); } @@ -49,8 +54,9 @@ BOOST_AUTO_TEST_CASE(simple_tuple_empty) msgpack::sbuffer sbuf; std::tuple<> val1; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); - std::tuple<> val2 = oh.get().as>(); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); + std::tuple<> val2 = oh.get().as >(); BOOST_CHECK(val1 == val2); } @@ -59,8 +65,9 @@ BOOST_AUTO_TEST_CASE(simple_tuple_size_greater_than_as) msgpack::sbuffer sbuf; std::tuple val1(true, "kzk", 42); msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); - std::tuple val2 = oh.get().as>(); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); + std::tuple val2 = oh.get().as >(); BOOST_CHECK_EQUAL(std::get<0>(val1), std::get<0>(val2)); BOOST_CHECK_EQUAL(std::get<1>(val1), std::get<1>(val2)); BOOST_CHECK_EQUAL(std::get<2>(val1), std::get<2>(val2)); @@ -71,7 +78,8 @@ BOOST_AUTO_TEST_CASE(simple_tuple_size_greater_than_convert) msgpack::sbuffer sbuf; std::tuple val1(true, "kzk", 42); msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); std::tuple val2; oh.get().convert(val2); BOOST_CHECK_EQUAL(std::get<0>(val1), std::get<0>(val2)); @@ -84,8 +92,9 @@ BOOST_AUTO_TEST_CASE(simple_tuple_size_less_than_as) msgpack::sbuffer sbuf; std::tuple val1(true, "kzk", 42); msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); - std::tuple val2 = oh.get().as>(); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); + std::tuple val2 = oh.get().as >(); BOOST_CHECK_EQUAL(std::get<0>(val1), std::get<0>(val2)); BOOST_CHECK_EQUAL(std::get<1>(val1), std::get<1>(val2)); } @@ -95,7 +104,8 @@ BOOST_AUTO_TEST_CASE(simple_tuple_size_less_than_convert) msgpack::sbuffer sbuf; std::tuple val1(true, "kzk", 42); msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); std::tuple val2; oh.get().convert(val2); BOOST_CHECK_EQUAL(std::get<0>(val1), std::get<0>(val2)); @@ -110,9 +120,10 @@ BOOST_AUTO_TEST_CASE(simple_array) val1[i] = rand(); msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); BOOST_CHECK_EQUAL(oh.get().type, msgpack::type::ARRAY); - array val2 = oh.get().as>(); + array val2 = oh.get().as >(); BOOST_CHECK_EQUAL(val1.size(), val2.size()); BOOST_CHECK(equal(val1.begin(), val1.end(), val2.begin())); } @@ -123,35 +134,39 @@ BOOST_AUTO_TEST_CASE(simple_array_empty) array val1; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); BOOST_CHECK_EQUAL(oh.get().type, msgpack::type::ARRAY); - array val2 = oh.get().as>(); + array val2 = oh.get().as >(); BOOST_CHECK_EQUAL(val1.size(), val2.size()); BOOST_CHECK(equal(val1.begin(), val1.end(), val2.begin())); } BOOST_AUTO_TEST_CASE(simple_array_size_less_than) { - array val1{ { 1, 2 } }; + array val1 { {1 , 2} }; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); BOOST_CHECK_EQUAL(oh.get().type, msgpack::type::ARRAY); array val2; try { oh.get().convert(val2); BOOST_CHECK(false); - } catch (msgpack::type_error const&) { + } + catch (msgpack::type_error const&) { BOOST_CHECK(true); } } BOOST_AUTO_TEST_CASE(simple_array_size_greater_than) { - array val1{ { 1, 2 } }; + array val1 { {1 , 2} }; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); BOOST_CHECK_EQUAL(oh.get().type, msgpack::type::ARRAY); array val2; oh.get().convert(val2); @@ -167,9 +182,10 @@ BOOST_AUTO_TEST_CASE(simple_buffer_array_char) val1[i] = static_cast(rand()); msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); BOOST_CHECK_EQUAL(oh.get().type, msgpack::type::BIN); - array val2 = oh.get().as>(); + array val2 = oh.get().as >(); BOOST_CHECK_EQUAL(val1.size(), val2.size()); BOOST_CHECK(equal(val1.begin(), val1.end(), val2.begin())); } @@ -180,26 +196,27 @@ BOOST_AUTO_TEST_CASE(simple_buffer_array_char_empty) array val1; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); BOOST_CHECK_EQUAL(oh.get().type, msgpack::type::BIN); - array val2 = oh.get().as>(); + array val2 = oh.get().as >(); BOOST_CHECK_EQUAL(val1.size(), val2.size()); BOOST_CHECK(equal(val1.begin(), val1.end(), val2.begin())); } BOOST_AUTO_TEST_CASE(simple_buffer_array_unsigned_char) { - if (!msgpack::is_same::value) - return; + if (!msgpack::is_same::value) return; for (unsigned int k = 0; k < kLoop; k++) { array val1; for (unsigned int i = 0; i < kElements; i++) val1[i] = static_cast(rand()); msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); BOOST_CHECK_EQUAL(oh.get().type, msgpack::type::BIN); - array val2 = oh.get().as>(); + array val2 = oh.get().as >(); BOOST_CHECK_EQUAL(val1.size(), val2.size()); BOOST_CHECK(equal(val1.begin(), val1.end(), val2.begin())); } @@ -207,14 +224,14 @@ BOOST_AUTO_TEST_CASE(simple_buffer_array_unsigned_char) BOOST_AUTO_TEST_CASE(simple_buffer_array_unsigned_char_empty) { - if (!msgpack::is_same::value) - return; + if (!msgpack::is_same::value) return; array val1; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); BOOST_CHECK_EQUAL(oh.get().type, msgpack::type::BIN); - array val2 = oh.get().as>(); + array val2 = oh.get().as >(); BOOST_CHECK_EQUAL(val1.size(), val2.size()); BOOST_CHECK(equal(val1.begin(), val1.end(), val2.begin())); } @@ -222,20 +239,22 @@ BOOST_AUTO_TEST_CASE(simple_buffer_array_unsigned_char_empty) // strong typedefs namespace test { -template struct hash : std::hash { +template +struct hash : std::hash { using std::hash::hash; }; -template struct equal_to : std::equal_to { +template +struct equal_to : std::equal_to { using std::equal_to::equal_to; }; -template struct set_allocator : std::allocator { +template +struct set_allocator : std::allocator { using std::allocator::allocator; - template struct rebind { - using other = set_allocator; - }; + template + struct rebind { using other = set_allocator; }; }; // C++ named requirement Allocator implies that the first template type @@ -243,22 +262,23 @@ template struct set_allocator : std::allocator { // parameters, but the first one must match the type. // That's why this helper with exactly one template parameter representing // a whole key-value pair is required -template struct map_allocator_impl : std::allocator { +template +struct map_allocator_impl : std::allocator { using std::allocator::allocator; - template struct rebind { - using other = map_allocator_impl; - }; + template + struct rebind { using other = map_allocator_impl; }; }; -template using map_allocator = map_allocator_impl>; +template +using map_allocator = map_allocator_impl>; -template struct allocator : std::allocator { +template +struct allocator : std::allocator { using std::allocator::allocator; - template struct rebind { - using other = allocator; - }; + template + struct rebind { using other = allocator; }; }; } // namespace test @@ -272,8 +292,9 @@ BOOST_AUTO_TEST_CASE(simple_buffer_forward_list) val1.push_front(rand()); msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); - type val2 = oh.get().as(); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); + type val2 = oh.get().as(); BOOST_CHECK(val1 == val2); } } @@ -284,8 +305,9 @@ BOOST_AUTO_TEST_CASE(simple_buffer_forward_list_empty) type val1; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); - type val2 = oh.get().as(); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); + type val2 = oh.get().as(); BOOST_CHECK(val1 == val2); } @@ -298,8 +320,9 @@ BOOST_AUTO_TEST_CASE(simple_buffer_unordered_map) val1[rand()] = rand(); msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); - type val2 = oh.get().as(); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); + type val2 = oh.get().as(); BOOST_CHECK(val1 == val2); } } @@ -310,8 +333,9 @@ BOOST_AUTO_TEST_CASE(simple_buffer_unordered_map_empty) type val1; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); - type val2 = oh.get().as(); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); + type val2 = oh.get().as(); BOOST_CHECK(val1 == val2); } @@ -327,8 +351,9 @@ BOOST_AUTO_TEST_CASE(simple_buffer_unordered_multimap) } msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); - type val2 = oh.get().as(); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); + type val2 = oh.get().as(); BOOST_CHECK(val1 == val2); } @@ -340,8 +365,9 @@ BOOST_AUTO_TEST_CASE(simple_buffer_unordered_multimap_empty) type val1; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); - type val2 = oh.get().as(); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); + type val2 = oh.get().as(); BOOST_CHECK(val1 == val2); } @@ -355,7 +381,8 @@ BOOST_AUTO_TEST_CASE(simple_buffer_unordered_set) val1.insert(rand()); msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); type val2 = oh.get().as(); BOOST_CHECK(val1 == val2); } @@ -367,7 +394,8 @@ BOOST_AUTO_TEST_CASE(simple_buffer_unordered_set_empty) type val1; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); type val2 = oh.get().as(); BOOST_CHECK(val1 == val2); } @@ -381,8 +409,9 @@ BOOST_AUTO_TEST_CASE(simple_buffer_unordered_multiset) val1.insert(rand()); msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); - type val2 = oh.get().as(); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); + type val2 = oh.get().as(); BOOST_CHECK(val1 == val2); } } @@ -393,8 +422,9 @@ BOOST_AUTO_TEST_CASE(simple_buffer_unordered_multiset_empty) type val1; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); - type val2 = oh.get().as(); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); + type val2 = oh.get().as(); BOOST_CHECK(val1 == val2); } @@ -403,7 +433,8 @@ BOOST_AUTO_TEST_CASE(simple_buffer_enum_class_member) TestEnumClassMemberClass val1; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); TestEnumClassMemberClass val2 = oh.get().as(); BOOST_CHECK(val1.t1 == val2.t1); BOOST_CHECK(val1.t2 == val2.t2); @@ -412,58 +443,53 @@ BOOST_AUTO_TEST_CASE(simple_buffer_enum_class_member) struct no_def_con { no_def_con() = delete; - no_def_con(int i) - : i(i) - {} + no_def_con(int i):i(i) {} int i; MSGPACK_DEFINE(i); }; -inline bool operator==(no_def_con const& lhs, no_def_con const& rhs) -{ +inline bool operator==(no_def_con const& lhs, no_def_con const& rhs) { return lhs.i == rhs.i; } -inline bool operator!=(no_def_con const& lhs, no_def_con const& rhs) -{ +inline bool operator!=(no_def_con const& lhs, no_def_con const& rhs) { return !(lhs == rhs); } -inline bool operator<(no_def_con const& lhs, no_def_con const& rhs) -{ - return lhs.i < rhs.i; +inline bool operator<(no_def_con const& lhs, no_def_con const& rhs) { + return lhs.i < rhs.i; } namespace msgpack { -MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS) -{ +MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS) { namespace adaptor { - template <> struct as { - no_def_con operator()(msgpack::object const& o) const - { - if (o.type != msgpack::type::ARRAY) - throw msgpack::type_error(); - if (o.via.array.size != 1) - throw msgpack::type_error(); + template <> + struct as { + no_def_con operator()(msgpack::object const& o) const { + if (o.type != msgpack::type::ARRAY) throw msgpack::type_error(); + if (o.via.array.size != 1) throw msgpack::type_error(); return no_def_con(o.via.array.ptr[0].as()); } }; - } // namespace adaptor + } // adaptor } // MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS) -} // namespace msgpack +} // msgpack namespace std { template <> struct hash { - size_t operator()(const no_def_con& x) const { return hash()(x.i); } + size_t operator()(const no_def_con & x) const { + return hash()(x.i); + } }; -} // namespace std +} // std BOOST_AUTO_TEST_CASE(no_def_con_simple_buffer) { no_def_con val1(42); msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); no_def_con val2 = oh.get().as(); BOOST_CHECK(val1 == val2); @@ -471,224 +497,230 @@ BOOST_AUTO_TEST_CASE(no_def_con_simple_buffer) struct no_def_con_composite { no_def_con_composite() = delete; - no_def_con_composite(int i) - : ndc(i) - {} - no_def_con_composite(no_def_con const& a) - : ndc(a) - {} + no_def_con_composite(int i):ndc(i) {} + no_def_con_composite(no_def_con const& a):ndc(a) {} no_def_con ndc; MSGPACK_DEFINE(ndc); }; -inline bool operator==(no_def_con_composite const& lhs, no_def_con_composite const& rhs) -{ +inline bool operator==(no_def_con_composite const& lhs, no_def_con_composite const& rhs) { return lhs.ndc == rhs.ndc; } -inline bool operator!=(no_def_con_composite const& lhs, no_def_con_composite const& rhs) -{ +inline bool operator!=(no_def_con_composite const& lhs, no_def_con_composite const& rhs) { return !(lhs == rhs); } -inline bool operator<(no_def_con_composite const& lhs, no_def_con_composite const& rhs) -{ +inline bool operator<(no_def_con_composite const& lhs, no_def_con_composite const& rhs) { return lhs.ndc < rhs.ndc; } namespace msgpack { -MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS) -{ +MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS) { namespace adaptor { - template <> struct as { - no_def_con_composite operator()(msgpack::object const& o) const - { - if (o.type != msgpack::type::ARRAY) - throw msgpack::type_error(); - if (o.via.array.size != 1) - throw msgpack::type_error(); + template <> + struct as { + no_def_con_composite operator()(msgpack::object const& o) const { + if (o.type != msgpack::type::ARRAY) throw msgpack::type_error(); + if (o.via.array.size != 1) throw msgpack::type_error(); return no_def_con_composite(o.via.array.ptr[0].as()); } }; - } // namespace adaptor + } // adaptor } // MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS) -} // namespace msgpack +} // msgpack BOOST_AUTO_TEST_CASE(no_def_con_composite_simple_buffer) { no_def_con_composite val1(42); msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); no_def_con_composite val2 = oh.get().as(); BOOST_CHECK(val1 == val2); } struct no_def_con_inherit : no_def_con { no_def_con_inherit() = delete; - no_def_con_inherit(no_def_con const& a) - : no_def_con(a) - {} + no_def_con_inherit(no_def_con const& a):no_def_con(a) {} MSGPACK_DEFINE(MSGPACK_BASE(no_def_con)); }; namespace msgpack { -MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS) -{ +MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS) { namespace adaptor { - template <> struct as { - no_def_con_inherit operator()(msgpack::object const& o) const - { - if (o.type != msgpack::type::ARRAY) - throw msgpack::type_error(); - if (o.via.array.size != 1) - throw msgpack::type_error(); + template <> + struct as { + no_def_con_inherit operator()(msgpack::object const& o) const { + if (o.type != msgpack::type::ARRAY) throw msgpack::type_error(); + if (o.via.array.size != 1) throw msgpack::type_error(); return no_def_con_inherit(o.via.array.ptr[0].as()); } }; - } // namespace adaptor + } // adaptor } // MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS) -} // namespace msgpack +} // msgpack BOOST_AUTO_TEST_CASE(no_def_con_inherit_simple_buffer) { no_def_con_inherit val1(42); msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); no_def_con_inherit val2 = oh.get().as(); BOOST_CHECK(val1 == val2); } BOOST_AUTO_TEST_CASE(no_def_con_vector_simple_buffer) { - std::vector val1{ 1, 2, 3 }; + std::vector val1 { 1, 2, 3 }; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); std::vector val2 = oh.get().as>(); BOOST_CHECK(val1 == val2); } BOOST_AUTO_TEST_CASE(no_def_con_list_simple_buffer) { - std::list val1{ 1, 2, 3 }; + std::list val1 { 1, 2, 3 }; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); std::list val2 = oh.get().as>(); BOOST_CHECK(val1 == val2); } BOOST_AUTO_TEST_CASE(no_def_con_set_simple_buffer) { - std::set val1{ 1, 2, 3 }; + std::set val1 { 1, 2, 3 }; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); std::set val2 = oh.get().as>(); BOOST_CHECK(val1 == val2); } BOOST_AUTO_TEST_CASE(no_def_con_multiset_simple_buffer) { - std::multiset val1{ 1, 2, 3 }; + std::multiset val1 { 1, 2, 3 }; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); std::multiset val2 = oh.get().as>(); BOOST_CHECK(val1 == val2); } BOOST_AUTO_TEST_CASE(no_def_con_assoc_vector_simple_buffer) { - msgpack::type::assoc_vector val1{ { 1, 2 }, { 3, 4 }, { 5, 6 } }; + msgpack::type::assoc_vector val1 { {1, 2}, {3, 4}, {5, 6}}; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); - msgpack::type::assoc_vector val2 = - oh.get().as>(); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::type::assoc_vector val2 + = oh.get().as>(); BOOST_CHECK(val1 == val2); } BOOST_AUTO_TEST_CASE(no_def_con_def_con_assoc_vector_simple_buffer) { - msgpack::type::assoc_vector val1{ { 1, 2 }, { 3, 4 }, { 5, 6 } }; + msgpack::type::assoc_vector val1 { {1, 2}, {3, 4}, {5, 6}}; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); - msgpack::type::assoc_vector val2 = oh.get().as>(); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::type::assoc_vector val2 + = oh.get().as>(); BOOST_CHECK(val1 == val2); } BOOST_AUTO_TEST_CASE(no_def_con_map_simple_buffer) { - std::map val1{ { 1, 2 }, { 3, 4 }, { 5, 6 } }; + std::map val1 { {1, 2}, {3, 4}, {5, 6}}; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); - std::map val2 = oh.get().as>(); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); + std::map val2 + = oh.get().as>(); BOOST_CHECK(val1 == val2); } BOOST_AUTO_TEST_CASE(no_def_con_def_con_map_simple_buffer) { - std::map val1{ { 1, 2 }, { 3, 4 }, { 5, 6 } }; + std::map val1 { {1, 2}, {3, 4}, {5, 6}}; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); - std::map val2 = oh.get().as>(); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); + std::map val2 + = oh.get().as>(); BOOST_CHECK(val1 == val2); } BOOST_AUTO_TEST_CASE(no_def_con_multimap_simple_buffer) { - std::multimap val1{ { 1, 2 }, { 3, 4 }, { 5, 6 } }; + std::multimap val1 { {1, 2}, {3, 4}, {5, 6}}; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); - std::multimap val2 = - oh.get().as>(); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); + std::multimap val2 + = oh.get().as>(); BOOST_CHECK(val1 == val2); } BOOST_AUTO_TEST_CASE(no_def_con_def_con_multimap_simple_buffer) { - std::multimap val1{ { 1, 2 }, { 3, 4 }, { 5, 6 } }; + std::multimap val1 { {1, 2}, {3, 4}, {5, 6}}; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); - std::multimap val2 = oh.get().as>(); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); + std::multimap val2 + = oh.get().as>(); BOOST_CHECK(val1 == val2); } BOOST_AUTO_TEST_CASE(no_def_con_deque_simple_buffer) { - std::deque val1{ 1, 2, 3 }; + std::deque val1 { 1, 2, 3 }; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); std::deque val2 = oh.get().as>(); BOOST_CHECK(val1 == val2); } BOOST_AUTO_TEST_CASE(no_def_con_pair_simple_buffer) { - std::pair val1{ 1, 2 }; + std::pair val1 {1, 2}; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); - std::pair val2 = oh.get().as>(); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); + std::pair val2 + = oh.get().as>(); BOOST_CHECK(val1 == val2); } BOOST_AUTO_TEST_CASE(no_def_con_def_con_pair_simple_buffer) { - std::pair val1{ 1, 2 }; + std::pair val1 {1, 2}; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); - std::pair val2 = oh.get().as>(); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); + std::pair val2 + = oh.get().as>(); BOOST_CHECK(val1 == val2); } @@ -698,44 +730,49 @@ BOOST_AUTO_TEST_CASE(no_def_con_def_con_pair_simple_buffer) BOOST_AUTO_TEST_CASE(no_def_con_tuple_simple_buffer) { - std::tuple val1{ 1, 2, 3 }; + std::tuple val1 {1, 2, 3}; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); - std::tuple val2 = - oh.get().as>(); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); + std::tuple val2 + = oh.get().as>(); BOOST_CHECK(val1 == val2); } BOOST_AUTO_TEST_CASE(no_def_con_def_con_tuple_simple_buffer) { - std::tuple val1{ 1, 2, 3 }; + std::tuple val1 {1, 2, 3}; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); - std::tuple val2 = oh.get().as>(); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); + std::tuple val2 + = oh.get().as>(); BOOST_CHECK(val1 == val2); } BOOST_AUTO_TEST_CASE(no_def_con_msgpack_tuple_simple_buffer) { - msgpack::type::tuple val1{ 1, 2, 3 }; + msgpack::type::tuple val1 {1, 2, 3}; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); - msgpack::type::tuple val2 = - oh.get().as>(); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::type::tuple val2 + = oh.get().as>(); BOOST_CHECK(val1 == val2); } BOOST_AUTO_TEST_CASE(no_def_con_def_con_msgpack_tuple_simple_buffer) { - msgpack::type::tuple val1{ 1, 2, 3 }; + msgpack::type::tuple val1 {1, 2, 3}; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); - msgpack::type::tuple val2 = - oh.get().as>(); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::type::tuple val2 + = oh.get().as>(); BOOST_CHECK(val1 == val2); } @@ -743,82 +780,92 @@ BOOST_AUTO_TEST_CASE(no_def_con_def_con_msgpack_tuple_simple_buffer) BOOST_AUTO_TEST_CASE(no_def_forward_list_simple_buffer) { - std::forward_list val1{ 1, 2, 3 }; + std::forward_list val1 { 1, 2, 3 }; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); std::forward_list val2 = oh.get().as>(); BOOST_CHECK(val1 == val2); } BOOST_AUTO_TEST_CASE(no_def_con_unordered_set_simple_buffer) { - std::unordered_set val1{ 1, 2, 3 }; + std::unordered_set val1 { 1, 2, 3 }; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); std::unordered_set val2 = oh.get().as>(); BOOST_CHECK(val1 == val2); } BOOST_AUTO_TEST_CASE(no_def_con_unordered_multiset_simple_buffer) { - std::unordered_multiset val1{ 1, 2, 3 }; + std::unordered_multiset val1 { 1, 2, 3 }; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); std::unordered_multiset val2 = oh.get().as>(); BOOST_CHECK(val1 == val2); } BOOST_AUTO_TEST_CASE(no_def_con_unordered_map_simple_buffer) { - std::unordered_map val1{ { 1, 2 }, { 3, 4 }, { 5, 6 } }; + std::unordered_map val1 { {1, 2}, {3, 4}, {5, 6}}; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); - std::unordered_map val2 = - oh.get().as>(); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); + std::unordered_map val2 + = oh.get().as>(); BOOST_CHECK(val1 == val2); } BOOST_AUTO_TEST_CASE(no_def_con_def_con_unordered_map_simple_buffer) { - std::unordered_map val1{ { 1, 2 }, { 3, 4 }, { 5, 6 } }; + std::unordered_map val1 { {1, 2}, {3, 4}, {5, 6}}; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); - std::unordered_map val2 = oh.get().as>(); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); + std::unordered_map val2 + = oh.get().as>(); BOOST_CHECK(val1 == val2); } BOOST_AUTO_TEST_CASE(no_def_con_unordered_multimap_simple_buffer) { - std::unordered_multimap val1{ { 1, 2 }, { 3, 4 }, { 5, 6 } }; + std::unordered_multimap val1 { {1, 2}, {3, 4}, {5, 6}}; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); - std::unordered_multimap val2 = - oh.get().as>(); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); + std::unordered_multimap val2 + = oh.get().as>(); BOOST_CHECK(val1 == val2); } BOOST_AUTO_TEST_CASE(no_def_con_def_con_unordered_multimap_simple_buffer) { - std::unordered_multimap val1{ { 1, 2 }, { 3, 4 }, { 5, 6 } }; + std::unordered_multimap val1 { {1, 2}, {3, 4}, {5, 6}}; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); - std::unordered_multimap val2 = oh.get().as>(); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); + std::unordered_multimap val2 + = oh.get().as>(); BOOST_CHECK(val1 == val2); } BOOST_AUTO_TEST_CASE(no_def_con_array_simple_buffer) { - std::array val1{ { 1, 2, 3 } }; + std::array val1 { { 1, 2, 3 } }; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); std::array val2 = oh.get().as>(); BOOST_CHECK(val1 == val2); } @@ -829,7 +876,8 @@ BOOST_AUTO_TEST_CASE(system_clock) msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); std::chrono::system_clock::time_point val2 = oh.get().as(); BOOST_CHECK(val1 == val2); @@ -843,11 +891,18 @@ BOOST_AUTO_TEST_CASE(system_clock_32) std::chrono::system_clock::time_point val1(std::chrono::seconds(0x12345678L)); msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - char packed[] = { static_cast(0xd6u), static_cast(-1), static_cast(0x12), - static_cast(0x34), static_cast(0x56), static_cast(0x78) }; + char packed[] = { + static_cast(0xd6u), + static_cast(-1), + static_cast(0x12), + static_cast(0x34), + static_cast(0x56), + static_cast(0x78) + }; BOOST_CHECK_EQUAL(memcmp(sbuf.data(), packed, sizeof(packed)), 0); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); std::chrono::system_clock::time_point val2 = oh.get().as(); BOOST_CHECK(val1 == val2); @@ -861,11 +916,18 @@ BOOST_AUTO_TEST_CASE(system_clock_32_max) std::chrono::system_clock::time_point val1(std::chrono::seconds(0xffffffffL)); msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - char packed[] = { static_cast(0xd6u), static_cast(-1), static_cast(0xffu), - static_cast(0xffu), static_cast(0xffu), static_cast(0xffu) }; + char packed[] = { + static_cast(0xd6u), + static_cast(-1), + static_cast(0xffu), + static_cast(0xffu), + static_cast(0xffu), + static_cast(0xffu) + }; BOOST_CHECK_EQUAL(memcmp(sbuf.data(), packed, sizeof(packed)), 0); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); std::chrono::system_clock::time_point val2 = oh.get().as(); BOOST_CHECK(val1 == val2); @@ -874,14 +936,19 @@ BOOST_AUTO_TEST_CASE(system_clock_32_max) BOOST_CHECK(val1 == val3); } + BOOST_AUTO_TEST_CASE(system_clock_64) { std::chrono::system_clock::time_point val1(std::chrono::seconds(0x31234567L)); - val1 += std::chrono::duration_cast(std::chrono::nanoseconds(0x312345678L)); + val1 += + std::chrono::duration_cast( + std::chrono::nanoseconds(0x312345678L) + ); msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); std::chrono::system_clock::time_point val2 = oh.get().as(); BOOST_CHECK(val1 == val2); @@ -894,28 +961,45 @@ BOOST_AUTO_TEST_CASE(system_clock_64_max) { std::chrono::system_clock::time_point val1(std::chrono::seconds(0xffffffffL)); - val1 += std::chrono::duration_cast( - std::chrono::nanoseconds(0x3b9ac9ffL) // 999,999,999 - ); - msgpack::sbuffer sbuf; - msgpack::pack(sbuf, val1); - char packed_nano[] = { static_cast(0xd7u), static_cast(-1), - static_cast(0xeeu), // 999,999,999 << 2 - static_cast(0x6b), static_cast(0x27), static_cast(0xfcu), - static_cast(0xffu), // 32 bit sec - static_cast(0xffu), static_cast(0xffu), static_cast(0xffu) }; - char packed_micro[] = { static_cast(0xd7u), static_cast(-1), - static_cast(0xeeu), // 999,999,000 << 2 - static_cast(0x6b), static_cast(0x18), static_cast(0x60), - static_cast(0xffu), // 32 bit sec - static_cast(0xffu), static_cast(0xffu), static_cast(0xffu) }; + val1 += + std::chrono::duration_cast( + std::chrono::nanoseconds(0x3b9ac9ffL) // 999,999,999 + ); + msgpack::sbuffer sbuf; + msgpack::pack(sbuf, val1); + char packed_nano[] = { + static_cast(0xd7u), + static_cast(-1), + static_cast(0xeeu), // 999,999,999 << 2 + static_cast(0x6b), + static_cast(0x27), + static_cast(0xfcu), + static_cast(0xffu), // 32 bit sec + static_cast(0xffu), + static_cast(0xffu), + static_cast(0xffu) + }; + char packed_micro[] = { + static_cast(0xd7u), + static_cast(-1), + static_cast(0xeeu), // 999,999,000 << 2 + static_cast(0x6b), + static_cast(0x18), + static_cast(0x60), + static_cast(0xffu), // 32 bit sec + static_cast(0xffu), + static_cast(0xffu), + static_cast(0xffu) + }; if (std::chrono::system_clock::duration::period::ratio::den == 1000000000) { BOOST_CHECK_EQUAL(memcmp(sbuf.data(), packed_nano, sizeof(packed_nano)), 0); - } else if (std::chrono::system_clock::duration::period::ratio::den == 1000000) { + } + else if (std::chrono::system_clock::duration::period::ratio::den == 1000000) { BOOST_CHECK_EQUAL(memcmp(sbuf.data(), packed_micro, sizeof(packed_micro)), 0); } - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); std::chrono::system_clock::time_point val2 = oh.get().as(); BOOST_CHECK(val1 == val2); @@ -930,7 +1014,8 @@ BOOST_AUTO_TEST_CASE(system_clock_impl_min) msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); std::chrono::system_clock::time_point val2 = oh.get().as(); BOOST_CHECK(val1 == val2); @@ -946,7 +1031,8 @@ BOOST_AUTO_TEST_CASE(system_clock_impl_max) msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); std::chrono::system_clock::time_point val2 = oh.get().as(); BOOST_CHECK(val1 == val2); @@ -962,7 +1048,8 @@ BOOST_AUTO_TEST_CASE(system_clock_impl_now) msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); std::chrono::system_clock::time_point val2 = oh.get().as(); BOOST_CHECK(val1 == val2); @@ -977,7 +1064,8 @@ BOOST_AUTO_TEST_CASE(steady_clock) msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); std::chrono::steady_clock::time_point val2 = oh.get().as(); BOOST_CHECK(val1 == val2); @@ -991,11 +1079,18 @@ BOOST_AUTO_TEST_CASE(steady_clock_32) std::chrono::steady_clock::time_point val1(std::chrono::seconds(0x12345678L)); msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - char packed[] = { static_cast(0xd6u), static_cast(-1), static_cast(0x12), - static_cast(0x34), static_cast(0x56), static_cast(0x78) }; + char packed[] = { + static_cast(0xd6u), + static_cast(-1), + static_cast(0x12), + static_cast(0x34), + static_cast(0x56), + static_cast(0x78) + }; BOOST_CHECK_EQUAL(memcmp(sbuf.data(), packed, sizeof(packed)), 0); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); std::chrono::steady_clock::time_point val2 = oh.get().as(); BOOST_CHECK(val1 == val2); @@ -1009,11 +1104,18 @@ BOOST_AUTO_TEST_CASE(steady_clock_32_max) std::chrono::steady_clock::time_point val1(std::chrono::seconds(0xffffffffL)); msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - char packed[] = { static_cast(0xd6u), static_cast(-1), static_cast(0xffu), - static_cast(0xffu), static_cast(0xffu), static_cast(0xffu) }; + char packed[] = { + static_cast(0xd6u), + static_cast(-1), + static_cast(0xffu), + static_cast(0xffu), + static_cast(0xffu), + static_cast(0xffu) + }; BOOST_CHECK_EQUAL(memcmp(sbuf.data(), packed, sizeof(packed)), 0); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); std::chrono::steady_clock::time_point val2 = oh.get().as(); BOOST_CHECK(val1 == val2); @@ -1022,14 +1124,19 @@ BOOST_AUTO_TEST_CASE(steady_clock_32_max) BOOST_CHECK(val1 == val3); } + BOOST_AUTO_TEST_CASE(steady_clock_64) { std::chrono::steady_clock::time_point val1(std::chrono::seconds(0x31234567L)); - val1 += std::chrono::duration_cast(std::chrono::nanoseconds(0x312345678L)); + val1 += + std::chrono::duration_cast( + std::chrono::nanoseconds(0x312345678L) + ); msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); std::chrono::steady_clock::time_point val2 = oh.get().as(); BOOST_CHECK(val1 == val2); @@ -1042,28 +1149,45 @@ BOOST_AUTO_TEST_CASE(steady_clock_64_max) { std::chrono::steady_clock::time_point val1(std::chrono::seconds(0xffffffffL)); - val1 += std::chrono::duration_cast( - std::chrono::nanoseconds(0x3b9ac9ffL) // 999,999,999 - ); - msgpack::sbuffer sbuf; - msgpack::pack(sbuf, val1); - char packed_nano[] = { static_cast(0xd7u), static_cast(-1), - static_cast(0xeeu), // 999,999,999 << 2 - static_cast(0x6b), static_cast(0x27), static_cast(0xfcu), - static_cast(0xffu), // 32 bit sec - static_cast(0xffu), static_cast(0xffu), static_cast(0xffu) }; - char packed_micro[] = { static_cast(0xd7u), static_cast(-1), - static_cast(0xeeu), // 999,999,000 << 2 - static_cast(0x6b), static_cast(0x18), static_cast(0x60), - static_cast(0xffu), // 32 bit sec - static_cast(0xffu), static_cast(0xffu), static_cast(0xffu) }; + val1 += + std::chrono::duration_cast( + std::chrono::nanoseconds(0x3b9ac9ffL) // 999,999,999 + ); + msgpack::sbuffer sbuf; + msgpack::pack(sbuf, val1); + char packed_nano[] = { + static_cast(0xd7u), + static_cast(-1), + static_cast(0xeeu), // 999,999,999 << 2 + static_cast(0x6b), + static_cast(0x27), + static_cast(0xfcu), + static_cast(0xffu), // 32 bit sec + static_cast(0xffu), + static_cast(0xffu), + static_cast(0xffu) + }; + char packed_micro[] = { + static_cast(0xd7u), + static_cast(-1), + static_cast(0xeeu), // 999,999,000 << 2 + static_cast(0x6b), + static_cast(0x18), + static_cast(0x60), + static_cast(0xffu), // 32 bit sec + static_cast(0xffu), + static_cast(0xffu), + static_cast(0xffu) + }; if (std::chrono::steady_clock::duration::period::ratio::den == 1000000000) { BOOST_CHECK_EQUAL(memcmp(sbuf.data(), packed_nano, sizeof(packed_nano)), 0); - } else if (std::chrono::steady_clock::duration::period::ratio::den == 1000000) { + } + else if (std::chrono::steady_clock::duration::period::ratio::den == 1000000) { BOOST_CHECK_EQUAL(memcmp(sbuf.data(), packed_micro, sizeof(packed_micro)), 0); } - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); std::chrono::steady_clock::time_point val2 = oh.get().as(); BOOST_CHECK(val1 == val2); @@ -1078,7 +1202,8 @@ BOOST_AUTO_TEST_CASE(steady_clock_impl_min) msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); std::chrono::steady_clock::time_point val2 = oh.get().as(); BOOST_CHECK(val1 == val2); @@ -1094,7 +1219,8 @@ BOOST_AUTO_TEST_CASE(steady_clock_impl_max) msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); std::chrono::steady_clock::time_point val2 = oh.get().as(); BOOST_CHECK(val1 == val2); @@ -1110,7 +1236,8 @@ BOOST_AUTO_TEST_CASE(steady_clock_impl_now) msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); std::chrono::steady_clock::time_point val2 = oh.get().as(); BOOST_CHECK(val1 == val2); @@ -1119,13 +1246,15 @@ BOOST_AUTO_TEST_CASE(steady_clock_impl_now) BOOST_CHECK(val1 == val3); } + BOOST_AUTO_TEST_CASE(high_resolution_clock) { std::chrono::high_resolution_clock::time_point val1; msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); std::chrono::high_resolution_clock::time_point val2 = oh.get().as(); BOOST_CHECK(val1 == val2); @@ -1139,11 +1268,18 @@ BOOST_AUTO_TEST_CASE(high_resolution_clock_32) std::chrono::high_resolution_clock::time_point val1(std::chrono::seconds(0x12345678L)); msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - char packed[] = { static_cast(0xd6u), static_cast(-1), static_cast(0x12), - static_cast(0x34), static_cast(0x56), static_cast(0x78) }; + char packed[] = { + static_cast(0xd6u), + static_cast(-1), + static_cast(0x12), + static_cast(0x34), + static_cast(0x56), + static_cast(0x78) + }; BOOST_CHECK_EQUAL(memcmp(sbuf.data(), packed, sizeof(packed)), 0); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); std::chrono::high_resolution_clock::time_point val2 = oh.get().as(); BOOST_CHECK(val1 == val2); @@ -1157,11 +1293,18 @@ BOOST_AUTO_TEST_CASE(high_resolution_clock_32_max) std::chrono::high_resolution_clock::time_point val1(std::chrono::seconds(0xffffffffL)); msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - char packed[] = { static_cast(0xd6u), static_cast(-1), static_cast(0xffu), - static_cast(0xffu), static_cast(0xffu), static_cast(0xffu) }; + char packed[] = { + static_cast(0xd6u), + static_cast(-1), + static_cast(0xffu), + static_cast(0xffu), + static_cast(0xffu), + static_cast(0xffu) + }; BOOST_CHECK_EQUAL(memcmp(sbuf.data(), packed, sizeof(packed)), 0); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); std::chrono::high_resolution_clock::time_point val2 = oh.get().as(); BOOST_CHECK(val1 == val2); @@ -1170,15 +1313,19 @@ BOOST_AUTO_TEST_CASE(high_resolution_clock_32_max) BOOST_CHECK(val1 == val3); } + BOOST_AUTO_TEST_CASE(high_resolution_clock_64) { std::chrono::high_resolution_clock::time_point val1(std::chrono::seconds(0x31234567L)); - val1 += std::chrono::duration_cast( - std::chrono::nanoseconds(0x312345678L)); + val1 += + std::chrono::duration_cast( + std::chrono::nanoseconds(0x312345678L) + ); msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); std::chrono::high_resolution_clock::time_point val2 = oh.get().as(); BOOST_CHECK(val1 == val2); @@ -1191,28 +1338,45 @@ BOOST_AUTO_TEST_CASE(high_resolution_clock_64_max) { std::chrono::high_resolution_clock::time_point val1(std::chrono::seconds(0xffffffffL)); - val1 += std::chrono::duration_cast( - std::chrono::nanoseconds(0x3b9ac9ffL) // 999,999,999 - ); - msgpack::sbuffer sbuf; - msgpack::pack(sbuf, val1); - char packed_nano[] = { static_cast(0xd7u), static_cast(-1), - static_cast(0xeeu), // 999,999,999 << 2 - static_cast(0x6b), static_cast(0x27), static_cast(0xfcu), - static_cast(0xffu), // 32 bit sec - static_cast(0xffu), static_cast(0xffu), static_cast(0xffu) }; - char packed_micro[] = { static_cast(0xd7u), static_cast(-1), - static_cast(0xeeu), // 999,999,000 << 2 - static_cast(0x6b), static_cast(0x18), static_cast(0x60), - static_cast(0xffu), // 32 bit sec - static_cast(0xffu), static_cast(0xffu), static_cast(0xffu) }; + val1 += + std::chrono::duration_cast( + std::chrono::nanoseconds(0x3b9ac9ffL) // 999,999,999 + ); + msgpack::sbuffer sbuf; + msgpack::pack(sbuf, val1); + char packed_nano[] = { + static_cast(0xd7u), + static_cast(-1), + static_cast(0xeeu), // 999,999,999 << 2 + static_cast(0x6b), + static_cast(0x27), + static_cast(0xfcu), + static_cast(0xffu), // 32 bit sec + static_cast(0xffu), + static_cast(0xffu), + static_cast(0xffu) + }; + char packed_micro[] = { + static_cast(0xd7u), + static_cast(-1), + static_cast(0xeeu), // 999,999,000 << 2 + static_cast(0x6b), + static_cast(0x18), + static_cast(0x60), + static_cast(0xffu), // 32 bit sec + static_cast(0xffu), + static_cast(0xffu), + static_cast(0xffu) + }; if (std::chrono::high_resolution_clock::duration::period::ratio::den == 1000000000) { BOOST_CHECK_EQUAL(memcmp(sbuf.data(), packed_nano, sizeof(packed_nano)), 0); - } else if (std::chrono::high_resolution_clock::duration::period::ratio::den == 1000000) { + } + else if (std::chrono::high_resolution_clock::duration::period::ratio::den == 1000000) { BOOST_CHECK_EQUAL(memcmp(sbuf.data(), packed_micro, sizeof(packed_micro)), 0); } - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); std::chrono::high_resolution_clock::time_point val2 = oh.get().as(); BOOST_CHECK(val1 == val2); @@ -1227,7 +1391,8 @@ BOOST_AUTO_TEST_CASE(high_resolution_clock_impl_min) msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); std::chrono::high_resolution_clock::time_point val2 = oh.get().as(); BOOST_CHECK(val1 == val2); @@ -1243,7 +1408,8 @@ BOOST_AUTO_TEST_CASE(high_resolution_clock_impl_max) msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); std::chrono::high_resolution_clock::time_point val2 = oh.get().as(); BOOST_CHECK(val1 == val2); @@ -1259,7 +1425,8 @@ BOOST_AUTO_TEST_CASE(high_resolution_clock_impl_now) msgpack::sbuffer sbuf; msgpack::pack(sbuf, val1); - msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size()); + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); std::chrono::high_resolution_clock::time_point val2 = oh.get().as(); BOOST_CHECK(val1 == val2); @@ -1268,6 +1435,7 @@ BOOST_AUTO_TEST_CASE(high_resolution_clock_impl_now) BOOST_CHECK(val1 == val3); } + BOOST_AUTO_TEST_CASE(timespec_pack_convert_zero) { std::stringstream ss; @@ -1297,9 +1465,7 @@ BOOST_AUTO_TEST_CASE(timespec_object_with_zone_zero) BOOST_AUTO_TEST_CASE(timespec_pack_convert_32bit_sec) { std::stringstream ss; - timespec val1{ std::numeric_limits().tv_sec)>::is_signed ? time_t(INT32_MAX) - : time_t(UINT32_MAX), - 0 }; + timespec val1{ std::numeric_limits().tv_sec)>::is_signed ? time_t(INT32_MAX) : time_t(UINT32_MAX), 0 }; msgpack::pack(ss, val1); std::string const& str = ss.str(); @@ -1315,9 +1481,7 @@ BOOST_AUTO_TEST_CASE(timespec_pack_convert_32bit_sec) BOOST_AUTO_TEST_CASE(timespec_object_with_zone_32bit_sec) { msgpack::zone z; - timespec val1{ std::numeric_limits().tv_sec)>::is_signed ? time_t(INT32_MAX) - : time_t(UINT32_MAX), - 0 }; + timespec val1{ std::numeric_limits().tv_sec)>::is_signed ? time_t(INT32_MAX) : time_t(UINT32_MAX), 0 }; msgpack::object obj(val1, z); timespec val2 = obj.as(); BOOST_CHECK_EQUAL(val1.tv_sec, val2.tv_sec); @@ -1351,8 +1515,7 @@ BOOST_AUTO_TEST_CASE(timespec_object_with_zone_max_nano) BOOST_AUTO_TEST_CASE(timespec_pack_convert_34bit_sec_max_nano) { - if (sizeof(decltype(std::declval().tv_sec)) <= 4) - return; + if (sizeof(decltype(std::declval().tv_sec)) <= 4) return; std::stringstream ss; timespec val1{ static_cast().tv_sec)>(0x3ffffffffULL), 999999999 }; @@ -1369,8 +1532,7 @@ BOOST_AUTO_TEST_CASE(timespec_pack_convert_34bit_sec_max_nano) BOOST_AUTO_TEST_CASE(timespec_object_with_zone_34bit_sec_max_nano) { - if (sizeof(decltype(std::declval().tv_sec)) <= 4) - return; + if (sizeof(decltype(std::declval().tv_sec)) <= 4) return; msgpack::zone z; timespec val1{ static_cast().tv_sec)>(0x3ffffffffULL), 999999999 }; msgpack::object obj(val1, z); @@ -1381,8 +1543,7 @@ BOOST_AUTO_TEST_CASE(timespec_object_with_zone_34bit_sec_max_nano) BOOST_AUTO_TEST_CASE(timespec_pack_convert_35bit_sec_max_nano) { - if (sizeof(decltype(std::declval().tv_sec)) <= 4) - return; + if (sizeof(decltype(std::declval().tv_sec)) <= 4) return; std::stringstream ss; timespec val1{ static_cast().tv_sec)>(0x7ffffffffULL), 999999999 }; @@ -1399,8 +1560,7 @@ BOOST_AUTO_TEST_CASE(timespec_pack_convert_35bit_sec_max_nano) BOOST_AUTO_TEST_CASE(timespec_object_with_zone_35bit_sec_max_nano) { - if (sizeof(decltype(std::declval().tv_sec)) <= 4) - return; + if (sizeof(decltype(std::declval().tv_sec)) <= 4) return; msgpack::zone z; timespec val1{ static_cast().tv_sec)>(0x7ffffffffULL), 999999999 }; msgpack::object obj(val1, z); @@ -1411,8 +1571,7 @@ BOOST_AUTO_TEST_CASE(timespec_object_with_zone_35bit_sec_max_nano) BOOST_AUTO_TEST_CASE(timespec_pack_convert_64bit_sec_max_nano) { - if (sizeof(decltype(std::declval().tv_sec)) <= 4) - return; + if (sizeof(decltype(std::declval().tv_sec)) <= 4) return; std::stringstream ss; timespec val1{ std::numeric_limits().tv_sec)>::max(), 999999999 }; @@ -1437,4 +1596,5 @@ BOOST_AUTO_TEST_CASE(timespec_object_with_zone_64bit_sec_max_nano) BOOST_CHECK_EQUAL(val1.tv_nsec, val2.tv_nsec); } + #endif // !defined(MSGPACK_USE_CPP03) diff --git a/barretenberg/cpp/src/msgpack-c/test/msgpack_cpp17.cpp b/barretenberg/cpp/src/msgpack-c/test/msgpack_cpp17.cpp index 5d0ebf6af4e..b20c04ccd7e 100644 --- a/barretenberg/cpp/src/msgpack-c/test/msgpack_cpp17.cpp +++ b/barretenberg/cpp/src/msgpack-c/test/msgpack_cpp17.cpp @@ -8,7 +8,9 @@ #endif // For C++ standards lower than C++17 -BOOST_AUTO_TEST_CASE(dummy) {} +BOOST_AUTO_TEST_CASE(dummy) +{ +} #if MSGPACK_CPP_VERSION >= 201703 @@ -22,8 +24,9 @@ BOOST_AUTO_TEST_CASE(optional_pack_convert_nil) std::optional val1; msgpack::pack(ss, val1); std::string const& str = ss.str(); - msgpack::object_handle oh = msgpack::unpack(str.data(), str.size()); - std::optional val2 = oh.get().as>(); + msgpack::object_handle oh = + msgpack::unpack(str.data(), str.size()); + std::optional val2 = oh.get().as >(); BOOST_CHECK(val1 == val2); } @@ -33,14 +36,15 @@ BOOST_AUTO_TEST_CASE(optional_pack_convert_int) std::optional val1 = 1; msgpack::pack(ss, val1); std::string const& str = ss.str(); - msgpack::object_handle oh = msgpack::unpack(str.data(), str.size()); - std::optional val2 = oh.get().as>(); + msgpack::object_handle oh = + msgpack::unpack(str.data(), str.size()); + std::optional val2 = oh.get().as >(); BOOST_CHECK(val1 == val2); } BOOST_AUTO_TEST_CASE(optional_pack_convert_vector) { - typedef std::optional> ovi_t; + typedef std::optional > ovi_t; std::stringstream ss; ovi_t val1; std::vector v; @@ -50,14 +54,15 @@ BOOST_AUTO_TEST_CASE(optional_pack_convert_vector) val1 = v; msgpack::pack(ss, val1); std::string const& str = ss.str(); - msgpack::object_handle oh = msgpack::unpack(str.data(), str.size()); - ovi_t val2 = oh.get().as(); + msgpack::object_handle oh = + msgpack::unpack(str.data(), str.size()); + ovi_t val2 = oh.get().as(); BOOST_CHECK(val1 == val2); } BOOST_AUTO_TEST_CASE(optional_pack_convert_vector_optional) { - typedef std::vector> voi_t; + typedef std::vector > voi_t; std::stringstream ss; voi_t val1; val1.resize(3); @@ -65,8 +70,9 @@ BOOST_AUTO_TEST_CASE(optional_pack_convert_vector_optional) val1[2] = 3; msgpack::pack(ss, val1); std::string const& str = ss.str(); - msgpack::object_handle oh = msgpack::unpack(str.data(), str.size()); - voi_t val2 = oh.get().as(); + msgpack::object_handle oh = + msgpack::unpack(str.data(), str.size()); + voi_t val2 = oh.get().as(); BOOST_CHECK(val1 == val2); } @@ -74,7 +80,7 @@ BOOST_AUTO_TEST_CASE(optional_object_nil) { std::optional val1; msgpack::object obj(val1); - std::optional val2 = obj.as>(); + std::optional val2 = obj.as >(); BOOST_CHECK(val1 == val2); } @@ -82,7 +88,7 @@ BOOST_AUTO_TEST_CASE(optional_object_int) { std::optional val1 = 1; msgpack::object obj(val1); - std::optional val2 = obj.as>(); + std::optional val2 = obj.as >(); BOOST_CHECK(val1 == val2); } @@ -108,7 +114,7 @@ BOOST_AUTO_TEST_CASE(optional_object_with_zone_nil) msgpack::zone z; std::optional val1; msgpack::object obj(val1, z); - std::optional val2 = obj.as>(); + std::optional val2 = obj.as >(); BOOST_CHECK(val1 == val2); } @@ -117,61 +123,54 @@ BOOST_AUTO_TEST_CASE(optional_object_with_zone_int) msgpack::zone z; std::optional val1 = 1; msgpack::object obj(val1, z); - std::optional val2 = obj.as>(); + std::optional val2 = obj.as >(); BOOST_CHECK(val1 == val2); } BOOST_AUTO_TEST_CASE(optional_object_with_zone_vector_optional) { - typedef std::vector> voi_t; + typedef std::vector > voi_t; msgpack::zone z; voi_t val1; val1.resize(3); val1[0] = 1; val1[2] = 3; msgpack::object obj(val1, z); - voi_t val2 = obj.as(); + voi_t val2 = obj.as(); BOOST_CHECK(val1 == val2); } struct no_def_con { no_def_con() = delete; - no_def_con(int i) - : i(i) - {} + no_def_con(int i):i(i) {} int i; MSGPACK_DEFINE(i); }; -inline bool operator==(no_def_con const& lhs, no_def_con const& rhs) -{ +inline bool operator==(no_def_con const& lhs, no_def_con const& rhs) { return lhs.i == rhs.i; } -inline bool operator!=(no_def_con const& lhs, no_def_con const& rhs) -{ +inline bool operator!=(no_def_con const& lhs, no_def_con const& rhs) { return !(lhs == rhs); } namespace msgpack { -MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS) -{ - namespace adaptor { - - template <> struct as { - no_def_con operator()(msgpack::object const& o) const - { - if (o.type != msgpack::type::ARRAY) - throw msgpack::type_error(); - if (o.via.array.size != 1) - throw msgpack::type_error(); - return no_def_con(o.via.array.ptr[0].as()); - } - }; +MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS) { +namespace adaptor { + +template <> +struct as { + no_def_con operator()(msgpack::object const& o) const { + if (o.type != msgpack::type::ARRAY) throw msgpack::type_error(); + if (o.via.array.size != 1) throw msgpack::type_error(); + return no_def_con(o.via.array.ptr[0].as()); + } +}; - } // namespace adaptor +} // adaptor } // MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS) -} // namespace msgpack +} // msgpack BOOST_AUTO_TEST_CASE(optional_pack_convert_no_def_con) { @@ -179,7 +178,8 @@ BOOST_AUTO_TEST_CASE(optional_pack_convert_no_def_con) std::optional val1 = no_def_con(1); msgpack::pack(ss, val1); std::string const& str = ss.str(); - msgpack::object_handle oh = msgpack::unpack(str.data(), str.size()); + msgpack::object_handle oh = + msgpack::unpack(str.data(), str.size()); std::optional val2 = oh.get().as>(); BOOST_CHECK(val1 == val2); } @@ -227,7 +227,7 @@ BOOST_AUTO_TEST_CASE(string_view_object_with_zone) BOOST_AUTO_TEST_CASE(byte_pack_convert) { std::stringstream ss; - std::byte val1{ 0xff }; + std::byte val1{0xff}; msgpack::pack(ss, val1); @@ -240,7 +240,7 @@ BOOST_AUTO_TEST_CASE(byte_pack_convert) BOOST_AUTO_TEST_CASE(byte_object) { - std::byte val1{ 0x00 }; + std::byte val1{0x00}; msgpack::object obj(val1); std::byte val2 = obj.as(); BOOST_CHECK(val1 == val2); @@ -249,7 +249,7 @@ BOOST_AUTO_TEST_CASE(byte_object) BOOST_AUTO_TEST_CASE(byte_object_with_zone) { msgpack::zone z; - std::byte val1{ 80 }; + std::byte val1{80}; msgpack::object obj(val1, z); std::byte val2 = obj.as(); BOOST_CHECK(val1 == val2); @@ -259,7 +259,7 @@ BOOST_AUTO_TEST_CASE(vector_byte_pack_convert) { std::stringstream ss; std::vector val1{ - std::byte{ 0x01 }, std::byte{ 0x02 }, std::byte{ 0x7f }, std::byte{ 0x80 }, std::byte{ 0xff } + std::byte{0x01}, std::byte{0x02}, std::byte{0x7f}, std::byte{0x80}, std::byte{0xff} }; msgpack::pack(ss, val1); @@ -280,7 +280,7 @@ BOOST_AUTO_TEST_CASE(vector_byte_pack_convert) BOOST_AUTO_TEST_CASE(vector_byte_object) { std::vector val1{ - std::byte{ 0x01 }, std::byte{ 0x02 }, std::byte{ 0x7f }, std::byte{ 0x80 }, std::byte{ 0xff } + std::byte{0x01}, std::byte{0x02}, std::byte{0x7f}, std::byte{0x80}, std::byte{0xff} }; // Caller need to manage val1's lifetime. The Data is not copied. @@ -294,7 +294,7 @@ BOOST_AUTO_TEST_CASE(vector_byte_object_with_zone) { msgpack::zone z; std::vector val1{ - std::byte{ 0x01 }, std::byte{ 0x02 }, std::byte{ 0x7f }, std::byte{ 0x80 }, std::byte{ 0xff } + std::byte{0x01}, std::byte{0x02}, std::byte{0x7f}, std::byte{0x80}, std::byte{0xff} }; msgpack::object obj(val1, z); @@ -306,7 +306,7 @@ BOOST_AUTO_TEST_CASE(array_byte_pack_convert) { std::stringstream ss; std::array val1{ - std::byte{ 0x01 }, std::byte{ 0x02 }, std::byte{ 0x7f }, std::byte{ 0x80 }, std::byte{ 0xff } + std::byte{0x01}, std::byte{0x02}, std::byte{0x7f}, std::byte{0x80}, std::byte{0xff} }; msgpack::pack(ss, val1); @@ -327,8 +327,8 @@ BOOST_AUTO_TEST_CASE(array_byte_pack_convert) { msgpack::object_handle oh; msgpack::unpack(oh, str.data(), str.size()); - BOOST_CHECK_THROW((oh.get().as>()), msgpack::type_error); - BOOST_CHECK_THROW((oh.get().as>()), msgpack::type_error); + BOOST_CHECK_THROW((oh.get().as>()), msgpack::type_error); + BOOST_CHECK_THROW((oh.get().as>()), msgpack::type_error); BOOST_CHECK_THROW((oh.get().as>()), msgpack::type_error); } } @@ -336,7 +336,7 @@ BOOST_AUTO_TEST_CASE(array_byte_pack_convert) BOOST_AUTO_TEST_CASE(array_byte_object) { std::array val1{ - std::byte{ 0x01 }, std::byte{ 0x02 }, std::byte{ 0x7f }, std::byte{ 0x80 }, std::byte{ 0xff } + std::byte{0x01}, std::byte{0x02}, std::byte{0x7f}, std::byte{0x80}, std::byte{0xff} }; // Caller need to manage val1's lifetime. The Data is not copied. @@ -345,8 +345,8 @@ BOOST_AUTO_TEST_CASE(array_byte_object) auto val2 = obj.as>(); BOOST_CHECK(val1 == val2); - BOOST_CHECK_THROW((obj.as>()), msgpack::type_error); - BOOST_CHECK_THROW((obj.as>()), msgpack::type_error); + BOOST_CHECK_THROW((obj.as>()), msgpack::type_error); + BOOST_CHECK_THROW((obj.as>()), msgpack::type_error); BOOST_CHECK_THROW((obj.as>()), msgpack::type_error); } @@ -354,15 +354,15 @@ BOOST_AUTO_TEST_CASE(array_byte_object_with_zone) { msgpack::zone z; std::array val1{ - std::byte{ 0x01 }, std::byte{ 0x02 }, std::byte{ 0x7f }, std::byte{ 0x80 }, std::byte{ 0xff } + std::byte{0x01}, std::byte{0x02}, std::byte{0x7f}, std::byte{0x80}, std::byte{0xff} }; msgpack::object obj(val1, z); auto val2 = obj.as>(); BOOST_CHECK(val1 == val2); - BOOST_CHECK_THROW((obj.as>()), msgpack::type_error); - BOOST_CHECK_THROW((obj.as>()), msgpack::type_error); + BOOST_CHECK_THROW((obj.as>()), msgpack::type_error); + BOOST_CHECK_THROW((obj.as>()), msgpack::type_error); BOOST_CHECK_THROW((obj.as>()), msgpack::type_error); } @@ -389,7 +389,7 @@ BOOST_AUTO_TEST_CASE(array_byte_empty_pack_convert) { msgpack::object_handle oh; msgpack::unpack(oh, str.data(), str.size()); - BOOST_CHECK_THROW((oh.get().as>()), msgpack::type_error); + BOOST_CHECK_THROW((oh.get().as>()), msgpack::type_error); BOOST_CHECK_THROW((oh.get().as>()), msgpack::type_error); } } @@ -404,7 +404,7 @@ BOOST_AUTO_TEST_CASE(array_byte_empty_object) auto val2 = obj.as>(); BOOST_CHECK(val1 == val2); - BOOST_CHECK_THROW((obj.as>()), msgpack::type_error); + BOOST_CHECK_THROW((obj.as>()), msgpack::type_error); BOOST_CHECK_THROW((obj.as>()), msgpack::type_error); } @@ -417,7 +417,7 @@ BOOST_AUTO_TEST_CASE(array_byte_empty_object_with_zone) auto val2 = obj.as>(); BOOST_CHECK(val1 == val2); - BOOST_CHECK_THROW((obj.as>()), msgpack::type_error); + BOOST_CHECK_THROW((obj.as>()), msgpack::type_error); BOOST_CHECK_THROW((obj.as>()), msgpack::type_error); } @@ -425,7 +425,7 @@ BOOST_AUTO_TEST_CASE(carray_byte_pack_convert) { std::stringstream ss; std::byte val1[] = { - std::byte{ 0x01 }, std::byte{ 0x02 }, std::byte{ 0x7f }, std::byte{ 0x80 }, std::byte{ 0xff } + std::byte{0x01}, std::byte{0x02}, std::byte{0x7f}, std::byte{0x80}, std::byte{0xff} }; msgpack::pack(ss, val1); @@ -450,7 +450,7 @@ BOOST_AUTO_TEST_CASE(carray_byte_object_with_zone) { msgpack::zone z; std::byte val1[] = { - std::byte{ 0x01 }, std::byte{ 0x02 }, std::byte{ 0x7f }, std::byte{ 0x80 }, std::byte{ 0xff } + std::byte{0x01}, std::byte{0x02}, std::byte{0x7f}, std::byte{0x80}, std::byte{0xff} }; msgpack::object obj(val1, z); @@ -463,22 +463,22 @@ BOOST_AUTO_TEST_CASE(carray_byte_object_with_zone) #if defined(MSGPACK_USE_STD_VARIANT_ADAPTOR) -BOOST_AUTO_TEST_CASE(variant_pack_unpack_as) -{ +BOOST_AUTO_TEST_CASE(variant_pack_unpack_as) { std::stringstream ss; - std::variant val1{ 1.0 }; + std::variant val1{1.0}; msgpack::pack(ss, val1); std::string const& str = ss.str(); - msgpack::object_handle oh = msgpack::unpack(str.data(), str.size()); - std::variant val2 = oh.get().as>(); + msgpack::object_handle oh = + msgpack::unpack(str.data(), str.size()); + std::variant val2 = + oh.get().as >(); BOOST_CHECK(val1 == val2); BOOST_CHECK_THROW((oh.get().as>()), msgpack::type_error); } -BOOST_AUTO_TEST_CASE(variant_with_zone) -{ +BOOST_AUTO_TEST_CASE(variant_with_zone) { msgpack::zone z; - std::variant val1{ 1.0 }; + std::variant val1{1.0}; msgpack::object obj(val1, z); std::variant val2 = obj.as>(); BOOST_CHECK(val1 == val2); From a69a9c4d0526b96b37bc8a79f30095f59cf7ea1a Mon Sep 17 00:00:00 2001 From: ludamad Date: Mon, 16 Oct 2023 20:31:34 +0000 Subject: [PATCH 4/6] revert yarn-project --- .../src/artifacts/ecdsa_account_contract.json | 699 ++++++++++++++++++ .../artifacts/schnorr_account_contract.json | 687 +++++++++++++++++ .../schnorr_single_key_account_contract.json | 622 ++++++++++++++++ 3 files changed, 2008 insertions(+) create mode 100644 yarn-project/aztec.js/src/artifacts/ecdsa_account_contract.json create mode 100644 yarn-project/aztec.js/src/artifacts/schnorr_account_contract.json create mode 100644 yarn-project/aztec.js/src/artifacts/schnorr_single_key_account_contract.json diff --git a/yarn-project/aztec.js/src/artifacts/ecdsa_account_contract.json b/yarn-project/aztec.js/src/artifacts/ecdsa_account_contract.json new file mode 100644 index 00000000000..06e4e33b3c2 --- /dev/null +++ b/yarn-project/aztec.js/src/artifacts/ecdsa_account_contract.json @@ -0,0 +1,699 @@ +{ + "name": "EcdsaAccount", + "functions": [ + { + "name": "compute_note_hash_and_nullifier", + "functionType": "unconstrained", + "isInternal": false, + "parameters": [ + { + "name": "contract_address", + "type": { + "kind": "field" + }, + "visibility": "private" + }, + { + "name": "nonce", + "type": { + "kind": "field" + }, + "visibility": "private" + }, + { + "name": "storage_slot", + "type": { + "kind": "field" + }, + "visibility": "private" + }, + { + "name": "preimage", + "type": { + "kind": "array", + "length": 5, + "type": { + "kind": "field" + } + }, + "visibility": "private" + } + ], + "returnTypes": [ + { + "kind": "array", + "length": 4, + "type": { + "kind": "field" + } + } + ], + "bytecode": "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", + "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" + }, + { + "name": "constructor", + "functionType": "secret", + "isInternal": false, + "parameters": [ + { + "name": "signing_pub_key_x", + "type": { + "kind": "array", + "length": 32, + "type": { + "kind": "integer", + "sign": "unsigned", + "width": 8 + } + }, + "visibility": "public" + }, + { + "name": "signing_pub_key_y", + "type": { + "kind": "array", + "length": 32, + "type": { + "kind": "integer", + "sign": "unsigned", + "width": 8 + } + }, + "visibility": "public" + } + ], + "returnTypes": [], + "bytecode": "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", + "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" + }, + { + "name": "entrypoint", + "functionType": "secret", + "isInternal": false, + "parameters": [ + { + "name": "payload", + "type": { + "kind": "struct", + "path": "authwit::entrypoint::EntrypointPayload", + "fields": [ + { + "name": "function_calls", + "type": { + "kind": "array", + "length": 4, + "type": { + "kind": "struct", + "path": "authwit::entrypoint::FunctionCall", + "fields": [ + { + "name": "args_hash", + "type": { + "kind": "field" + } + }, + { + "name": "function_selector", + "type": { + "kind": "field" + } + }, + { + "name": "target_address", + "type": { + "kind": "field" + } + }, + { + "name": "is_public", + "type": { + "kind": "boolean" + } + } + ] + } + } + }, + { + "name": "nonce", + "type": { + "kind": "field" + } + } + ] + }, + "visibility": "public" + } + ], + "returnTypes": [], + "bytecode": "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", + "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" + }, + { + "name": "is_valid", + "functionType": "secret", + "isInternal": false, + "parameters": [ + { + "name": "message_hash", + "type": { + "kind": "field" + }, + "visibility": "private" + } + ], + "returnTypes": [], + "bytecode": "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", + "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" + }, + { + "name": "is_valid_public", + "functionType": "open", + "isInternal": false, + "parameters": [ + { + "name": "message_hash", + "type": { + "kind": "field" + }, + "visibility": "private" + } + ], + "returnTypes": [ + { + "kind": "struct", + "path": "aztec::abi::PublicCircuitPublicInputs", + "fields": [ + { + "name": "call_context", + "type": { + "kind": "struct", + "path": "aztec::abi::CallContext", + "fields": [ + { + "name": "msg_sender", + "type": { + "kind": "field" + } + }, + { + "name": "storage_contract_address", + "type": { + "kind": "field" + } + }, + { + "name": "portal_contract_address", + "type": { + "kind": "field" + } + }, + { + "name": "function_selector", + "type": { + "kind": "field" + } + }, + { + "name": "is_delegate_call", + "type": { + "kind": "boolean" + } + }, + { + "name": "is_static_call", + "type": { + "kind": "boolean" + } + }, + { + "name": "is_contract_deployment", + "type": { + "kind": "boolean" + } + } + ] + } + }, + { + "name": "args_hash", + "type": { + "kind": "field" + } + }, + { + "name": "return_values", + "type": { + "kind": "array", + "length": 4, + "type": { + "kind": "field" + } + } + }, + { + "name": "contract_storage_update_requests", + "type": { + "kind": "array", + "length": 16, + "type": { + "kind": "struct", + "path": "aztec::abi::ContractStorageUpdateRequest", + "fields": [ + { + "name": "storage_slot", + "type": { + "kind": "field" + } + }, + { + "name": "old_value", + "type": { + "kind": "field" + } + }, + { + "name": "new_value", + "type": { + "kind": "field" + } + } + ] + } + } + }, + { + "name": "contract_storage_read", + "type": { + "kind": "array", + "length": 16, + "type": { + "kind": "struct", + "path": "aztec::abi::ContractStorageRead", + "fields": [ + { + "name": "storage_slot", + "type": { + "kind": "field" + } + }, + { + "name": "value", + "type": { + "kind": "field" + } + } + ] + } + } + }, + { + "name": "public_call_stack", + "type": { + "kind": "array", + "length": 4, + "type": { + "kind": "field" + } + } + }, + { + "name": "new_commitments", + "type": { + "kind": "array", + "length": 16, + "type": { + "kind": "field" + } + } + }, + { + "name": "new_nullifiers", + "type": { + "kind": "array", + "length": 16, + "type": { + "kind": "field" + } + } + }, + { + "name": "new_l2_to_l1_msgs", + "type": { + "kind": "array", + "length": 2, + "type": { + "kind": "field" + } + } + }, + { + "name": "unencrypted_logs_hash", + "type": { + "kind": "array", + "length": 2, + "type": { + "kind": "field" + } + } + }, + { + "name": "unencrypted_log_preimages_length", + "type": { + "kind": "field" + } + }, + { + "name": "block_data", + "type": { + "kind": "struct", + "path": "aztec::abi::HistoricBlockData", + "fields": [ + { + "name": "private_data_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "nullifier_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "contract_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "l1_to_l2_messages_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "blocks_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "public_data_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "global_variables_hash", + "type": { + "kind": "field" + } + } + ] + } + }, + { + "name": "prover_address", + "type": { + "kind": "field" + } + } + ] + } + ], + "bytecode": "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", + "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" + }, + { + "name": "set_is_valid_storage", + "functionType": "open", + "isInternal": true, + "parameters": [ + { + "name": "message_hash", + "type": { + "kind": "field" + }, + "visibility": "private" + }, + { + "name": "value", + "type": { + "kind": "boolean" + }, + "visibility": "private" + } + ], + "returnTypes": [ + { + "kind": "struct", + "path": "aztec::abi::PublicCircuitPublicInputs", + "fields": [ + { + "name": "call_context", + "type": { + "kind": "struct", + "path": "aztec::abi::CallContext", + "fields": [ + { + "name": "msg_sender", + "type": { + "kind": "field" + } + }, + { + "name": "storage_contract_address", + "type": { + "kind": "field" + } + }, + { + "name": "portal_contract_address", + "type": { + "kind": "field" + } + }, + { + "name": "function_selector", + "type": { + "kind": "field" + } + }, + { + "name": "is_delegate_call", + "type": { + "kind": "boolean" + } + }, + { + "name": "is_static_call", + "type": { + "kind": "boolean" + } + }, + { + "name": "is_contract_deployment", + "type": { + "kind": "boolean" + } + } + ] + } + }, + { + "name": "args_hash", + "type": { + "kind": "field" + } + }, + { + "name": "return_values", + "type": { + "kind": "array", + "length": 4, + "type": { + "kind": "field" + } + } + }, + { + "name": "contract_storage_update_requests", + "type": { + "kind": "array", + "length": 16, + "type": { + "kind": "struct", + "path": "aztec::abi::ContractStorageUpdateRequest", + "fields": [ + { + "name": "storage_slot", + "type": { + "kind": "field" + } + }, + { + "name": "old_value", + "type": { + "kind": "field" + } + }, + { + "name": "new_value", + "type": { + "kind": "field" + } + } + ] + } + } + }, + { + "name": "contract_storage_read", + "type": { + "kind": "array", + "length": 16, + "type": { + "kind": "struct", + "path": "aztec::abi::ContractStorageRead", + "fields": [ + { + "name": "storage_slot", + "type": { + "kind": "field" + } + }, + { + "name": "value", + "type": { + "kind": "field" + } + } + ] + } + } + }, + { + "name": "public_call_stack", + "type": { + "kind": "array", + "length": 4, + "type": { + "kind": "field" + } + } + }, + { + "name": "new_commitments", + "type": { + "kind": "array", + "length": 16, + "type": { + "kind": "field" + } + } + }, + { + "name": "new_nullifiers", + "type": { + "kind": "array", + "length": 16, + "type": { + "kind": "field" + } + } + }, + { + "name": "new_l2_to_l1_msgs", + "type": { + "kind": "array", + "length": 2, + "type": { + "kind": "field" + } + } + }, + { + "name": "unencrypted_logs_hash", + "type": { + "kind": "array", + "length": 2, + "type": { + "kind": "field" + } + } + }, + { + "name": "unencrypted_log_preimages_length", + "type": { + "kind": "field" + } + }, + { + "name": "block_data", + "type": { + "kind": "struct", + "path": "aztec::abi::HistoricBlockData", + "fields": [ + { + "name": "private_data_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "nullifier_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "contract_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "l1_to_l2_messages_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "blocks_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "public_data_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "global_variables_hash", + "type": { + "kind": "field" + } + } + ] + } + }, + { + "name": "prover_address", + "type": { + "kind": "field" + } + } + ] + } + ], + "bytecode": "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", + "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" + } + ], + "events": [] +} diff --git a/yarn-project/aztec.js/src/artifacts/schnorr_account_contract.json b/yarn-project/aztec.js/src/artifacts/schnorr_account_contract.json new file mode 100644 index 00000000000..c3957122241 --- /dev/null +++ b/yarn-project/aztec.js/src/artifacts/schnorr_account_contract.json @@ -0,0 +1,687 @@ +{ + "name": "SchnorrAccount", + "functions": [ + { + "name": "compute_note_hash_and_nullifier", + "functionType": "unconstrained", + "isInternal": false, + "parameters": [ + { + "name": "contract_address", + "type": { + "kind": "field" + }, + "visibility": "private" + }, + { + "name": "nonce", + "type": { + "kind": "field" + }, + "visibility": "private" + }, + { + "name": "storage_slot", + "type": { + "kind": "field" + }, + "visibility": "private" + }, + { + "name": "preimage", + "type": { + "kind": "array", + "length": 3, + "type": { + "kind": "field" + } + }, + "visibility": "private" + } + ], + "returnTypes": [ + { + "kind": "array", + "length": 4, + "type": { + "kind": "field" + } + } + ], + "bytecode": "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", + "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" + }, + { + "name": "constructor", + "functionType": "secret", + "isInternal": false, + "parameters": [ + { + "name": "signing_pub_key_x", + "type": { + "kind": "field" + }, + "visibility": "public" + }, + { + "name": "signing_pub_key_y", + "type": { + "kind": "field" + }, + "visibility": "public" + } + ], + "returnTypes": [], + "bytecode": "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", + "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" + }, + { + "name": "entrypoint", + "functionType": "secret", + "isInternal": false, + "parameters": [ + { + "name": "payload", + "type": { + "kind": "struct", + "path": "authwit::entrypoint::EntrypointPayload", + "fields": [ + { + "name": "function_calls", + "type": { + "kind": "array", + "length": 4, + "type": { + "kind": "struct", + "path": "authwit::entrypoint::FunctionCall", + "fields": [ + { + "name": "args_hash", + "type": { + "kind": "field" + } + }, + { + "name": "function_selector", + "type": { + "kind": "field" + } + }, + { + "name": "target_address", + "type": { + "kind": "field" + } + }, + { + "name": "is_public", + "type": { + "kind": "boolean" + } + } + ] + } + } + }, + { + "name": "nonce", + "type": { + "kind": "field" + } + } + ] + }, + "visibility": "public" + } + ], + "returnTypes": [], + "bytecode": "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", + "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" + }, + { + "name": "is_valid", + "functionType": "secret", + "isInternal": false, + "parameters": [ + { + "name": "message_hash", + "type": { + "kind": "field" + }, + "visibility": "private" + } + ], + "returnTypes": [], + "bytecode": "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", + "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" + }, + { + "name": "is_valid_public", + "functionType": "open", + "isInternal": false, + "parameters": [ + { + "name": "message_hash", + "type": { + "kind": "field" + }, + "visibility": "private" + } + ], + "returnTypes": [ + { + "kind": "struct", + "path": "aztec::abi::PublicCircuitPublicInputs", + "fields": [ + { + "name": "call_context", + "type": { + "kind": "struct", + "path": "aztec::abi::CallContext", + "fields": [ + { + "name": "msg_sender", + "type": { + "kind": "field" + } + }, + { + "name": "storage_contract_address", + "type": { + "kind": "field" + } + }, + { + "name": "portal_contract_address", + "type": { + "kind": "field" + } + }, + { + "name": "function_selector", + "type": { + "kind": "field" + } + }, + { + "name": "is_delegate_call", + "type": { + "kind": "boolean" + } + }, + { + "name": "is_static_call", + "type": { + "kind": "boolean" + } + }, + { + "name": "is_contract_deployment", + "type": { + "kind": "boolean" + } + } + ] + } + }, + { + "name": "args_hash", + "type": { + "kind": "field" + } + }, + { + "name": "return_values", + "type": { + "kind": "array", + "length": 4, + "type": { + "kind": "field" + } + } + }, + { + "name": "contract_storage_update_requests", + "type": { + "kind": "array", + "length": 16, + "type": { + "kind": "struct", + "path": "aztec::abi::ContractStorageUpdateRequest", + "fields": [ + { + "name": "storage_slot", + "type": { + "kind": "field" + } + }, + { + "name": "old_value", + "type": { + "kind": "field" + } + }, + { + "name": "new_value", + "type": { + "kind": "field" + } + } + ] + } + } + }, + { + "name": "contract_storage_read", + "type": { + "kind": "array", + "length": 16, + "type": { + "kind": "struct", + "path": "aztec::abi::ContractStorageRead", + "fields": [ + { + "name": "storage_slot", + "type": { + "kind": "field" + } + }, + { + "name": "value", + "type": { + "kind": "field" + } + } + ] + } + } + }, + { + "name": "public_call_stack", + "type": { + "kind": "array", + "length": 4, + "type": { + "kind": "field" + } + } + }, + { + "name": "new_commitments", + "type": { + "kind": "array", + "length": 16, + "type": { + "kind": "field" + } + } + }, + { + "name": "new_nullifiers", + "type": { + "kind": "array", + "length": 16, + "type": { + "kind": "field" + } + } + }, + { + "name": "new_l2_to_l1_msgs", + "type": { + "kind": "array", + "length": 2, + "type": { + "kind": "field" + } + } + }, + { + "name": "unencrypted_logs_hash", + "type": { + "kind": "array", + "length": 2, + "type": { + "kind": "field" + } + } + }, + { + "name": "unencrypted_log_preimages_length", + "type": { + "kind": "field" + } + }, + { + "name": "block_data", + "type": { + "kind": "struct", + "path": "aztec::abi::HistoricBlockData", + "fields": [ + { + "name": "private_data_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "nullifier_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "contract_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "l1_to_l2_messages_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "blocks_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "public_data_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "global_variables_hash", + "type": { + "kind": "field" + } + } + ] + } + }, + { + "name": "prover_address", + "type": { + "kind": "field" + } + } + ] + } + ], + "bytecode": "H4sIAAAAAAAA/+2dCZxdyVXe3+3WVirt+67Wrtk03SVpFmlm1KPR0+yrZt81WmYfeUaSx7s93jfZM+N9N4QQYpYQFtsB2xjjgHHAGDAOGAeMQwghhBBCCCGEUHVffejTUfn29G/q0Lfpqt/v6FXV7Vvf/5yv3n679X2dTqfq9Fq/j/md0xuOD8fbwRfXhqp8aw1qcvaNE87+ccI5aZxwTh4nnFPGCefUccI5bZxwmnHCOX2ccNpxwjljnHDOHCecs8YJ5+xxwjlnnHDOHSec88YJ5/yMnEuJc0G8XRhvF8XbxfF2SbzFOcvi7fKY46Q4XuFjpY9VPlbHYyjIgI81Ptb6WOdjvY8NPjb62ORjs48zfJzp4ywfZ/s4x8cWH+fGdYZ8OB9bfWzzsd3HeT7O93GBjwt97PCx08dFPi72cYmPXbFul/rY7eMyH3t8dH3s9XG5jyt8XOnjKh9X+7jGx7U+rvNxfcxlIOZyg48bfdzkY5+Pm33c4uNWH7f5uN3HHT7u9HGXj7t93OPjXh/3+bjfx34fD/g44OOgj0M+Dvt40MdDPh728YiPR3085uNxH0/4OCJq/hIfT/p4ysfReGxOPHbMx3EfL/XxtI+X+Xi5j1f4eKWPV/l4tY/X+Hitj9f5eMbH6328Qaz1Rh9v8vFmH2/x8VYfb/Pxdh/v8PFOHyd8vMvHu3086+M5H8/7eE9cqy+u9V4f7xNz7/fxgdj/YLz9ULz9cLz9SLz9aLz9WLz9eLz9RLz9ZOdk+7nZvdvwWg77fF7n5Bzeh8+lORyfQ3M4PpvmcHwWzeH4TJrD8Rk0h+OW5nB8Os3xcdzi+DSaw/GpNIfjU2gOxyfTHI5Pojkc76c5HO+jORyvaA7HO0I/tOF4O/gi25RO9sfXwZDzIOXRSeTLn+HIfCcl6jI5UT/2A8fZNxxnf/k4bnGc9wuO877Bcd5/OM77FMd5P+M473sc5/sHjvP9CMf5/obj82kOxxfQHI4vpDkcX0RzOL6Y5nB8Cc3h+FKaw3E8n4W8Qu2Xx/FwvB18cc0Z0kCrxHiY+tAPLCsVWFaMgmUlsazKy1K/v14d11pGOgOZdSrSwboYQ8sSwypFFpvQ1tDh2qI1+TxALGvystQPqWtJC1xrqPY4voA41mauSUWaWBdjaBmaWzHGLJYYVtMcfm5Aj88ZwRda0/5ZSyzrs7IMDQaWdaNgWU8sG7Ky9F53bMy8ZlhjE/EjV7BbOr6RctuUl6Pekxs6p9YUY+YrrIW1sBbWwlpYC2thLawTm9XQ3JoxZuH3R+vUWIYGbUJb4/0Gf8aFtcPniB8hzdWZc+PvOvDZBBig1U8/86OzTnLhM/jpdHyNGqs7oPUZGT4DQnuhn5GtyOxF+Ex2KtVSfh4Azj5iWJaV4fTPb6AJneA1PrPkz1HwOSyOhf3xw8TZls9Z+TNR/hwy876qH79WCBaMocWfQ/YpstiEdps+b+b7IH8Ol/fxo+fJKsGCMX/mBoZ+RRab0FbQGfXjG/TDeQOxz5+RZ/68eIiff7AuxvyZMRgmKbLYTvp5LLOO49qiNXkC/XAeHnMHiG9d5jpUnVOfA4ZpDC2u1WRFFpvQVtBxRuQcWpMn0A/n4TNo/lw882vD2pP1ggVjfp/ADFosNqGtoOOMyDm0Jk+gH87D+yT+fkDjPcpGwYIxv0cBw1RFFpvQVtBxRuQcWpMn/L5xc+zze9gzMtehIh2sizG0uFbTFFlsQltBxxmRc2hNnkA/nHdm7G8mvrMy16EiHayLMbS4VkaRxSa0FXScETmH1uTJWZT72bF/JvGdk7kOFelgXYyhxbWarshiE9oKOs6InENr8gT64bwtsX828Z2buQ4V6WBdjKHFtbKKLDahraDjjMg5tCZPoB/Ow/V7W4hvKHMd+LpmrIvxEPkAhhmKLDahraDjjMg5tCZPoB/Oc2Agvq2Z61CRDtbFGFpcq5mKLDahraDjjMg5tCZPoB/O2xb7jvi2Z65DRTpYF2Noca1mKbLYhLaCjjMi59CaPIF+OO+82N9GfOdnrkNFOlgXY2hxrWYrstiEtoKOMyLn0Jo8gX4474LYP4/4Lsxch4p0sC7G0OJazVFksQltBR1nRM6hNXkC/XDejti/gPh2Zq5DRTpYF2Noca3mKrLYhLaCjjMi59CaPIF+OO+i2N9BfBdnrkNFOlgXY2hxreYpstiEtoKOMyLn0Jo8gX4475LYv4j4dmWuQ0U6WBdjaHGt5iuy2IS2go4zIufQmjyBPv89gUuI79LMdaiE/jCNocW1WqTIYhPaCjqOa4vW5AmzXJaXZVtg2T0KlsuIZU9elvp69W7mNcMae4kfuYLd0vEu5bY3L0e9z/d0Tq0pxsxXWCc2q+mcfr8aKxZ+PNytx7LNJrQVdJwROYfW9FjHnlwe+3uI74q8fLUnlwsWjKHFteoqstiEtoKOMyLn0Jo8YZarsrJsra9fvHIULFcRy9VZWXrPW9eQFrigY+k474Nr8nLUe/JqkT/GzFdYC2thLayFtbAW1sJaWAtrYS2shbWwFtbCWlgLa2EtrIW1sBbWwlpYC2thLayFtbAW1vyshuYuH2MWSwxXqrFsrf/OldRWyNkZkXNoTdeJsCfXxv7VxHddXr7ak2sFC8bQ4lp1FVlsQltBxxmRc2hNnjDLDVlZXH0d0fWjYLmBWG7MytK7jugm0gIXdCwd531wU16Oek/eKPLHmPkKa2EtrIW1sBbWwlpYC2thLayFtbAW1sJaWAtrYS2shXW8sBqau3aMWfiz+OvVWFz9PYzUVsjZGZFzaE2fs7Mn+2L/RuK7OS9f7ck+wYIxtLhWXUUWm9BW0HFG5BxakyfMcmtelvpvm9wyCpZbieW2vCz19zC3kxa4oGPpOO+D2/Ny1HvyNpE/xsxXWCc2q6G5fWPMwo9dt+ix1H+HRGor6Dgjcg6t6XGJPbkj9m8jvjvz8tWe3CFYMIYW16qryGIT2go6zoicQ2vyhFnuzsrS+z+k7xoFy93Eck9Wlt7z1r2kBS7oWDrO++DevBz1nrxH5I8x8xXWwlpYC2thLayFtbAW1onNamjujjFm4fcyd6mx9P6/Z6mtkLMzIufQmt6nsCf3xf49xHd/Xr7ak/sEC8bQ4lp1FVlsQltBx3Ft0Zo8uZ9YHsjK0nsfu38ULA8Qy4GsLL33sQdJC1zQsXSc98HBvBz1njwg8seY+QprYS2shbWwFtbCWlgL68RmNTR33xiz8HuZ/WosvfexUlshZ2dEzqE1vU9hTw7F/gHiO5yXr/bkkGDBGFpcq64ii01oK+g4I3IOrckTZnlIgeXBUbA8RCwP52Wp38c+Qlrggo6l47wPHsnLUe/Jh0X+GDPfeGE1NHdojFn4PvagHouzCW0NHSNyDq3p/sOePBr7DxPfY3n5ak8eFSwYQ4tr1VVksQltBR1nRM6hNXnCLE8osDw+CpYniOVIXpb68fUlpAUu6Fg6zvvgJXk56j15ROSPMfONF1ZDc4+OMQvfxx7XY6kfX6W2ho4ROYfWdP9hT56M/SPE91RevtqTJwULxtDiWnUVWWxCW0HHGZFzaE2eQD+cdzT2nyS+Y5nrUJEO1sUYWlyrriKLTWgr6Dgjcg6tyRPoh/OOx/5R4ntp5jpUpIN1MYYW18oostiEtoKOMyLn0Jo8eSnl/nTsHye+l2WuQ0U6WBdjaHGtpiuy2IS2go4zIufQmjyBfjjv5bH/NPG9InMdKtLBuhhDi2tlFVlsQltBxxmRc2hNnkA/nPfK2H858b0qcx0q0sG6GL+KfADDDEUWm9BW0HFG5BxakyfQD+e9OvZfSXyvyVyHinSwLsbQ4lrNVGSxCW0FHWdEzqE1eQL9cN5rY//VxPe6zHWoSAfrYgwtrtUsRRab0FbQcVxbtCZPXhdvw3nPxP5rie/1metQkQ7WxRhaXKvZiiw2oa2g44zIObQmT6AfzntD7D9DfG/MXIeKdLAuxtDiWnUVWWxCW0HHGZFzaE2eQD+c96bYfwPxvTlzHSrSwboYQ4tr1VVksQltBR1nRM6hNXkC/XDeW2L/TcT31sx1qEgH62IMLa5VV5HFJrQVdJwROYfW5An0w3lvi/23EN/bM9ehIh2sizG0uFZdRRab0FbQcUbkHFqTJ9AP570j9t9GfO/MXIeKdLAuxtDiWnUVWWxCW0HHGZFzaE2eMMuJvCz1teDvimu9g3Tenbm2FelgXYyhxfU/ochiE9oKOs6InENr8hn64bxnY/9dxPdc5jpUpIN1MYYW1+qEIotNaCvoOCNyDq3JE+iH856P/WeJ7z2Z61CRDtbFGFpcqxOKLDahraDjjMg5tCZPoB/Oe2/sP09878tch4p0sC7G0OJadRVZbEJbQccZkXNoTZ5AP5z3/th/L/F9IHMdKtLBuhhDi2vVVWSxCW0FHWdEzqE1eQL9cN4HY//9xPehzHWoSAfrYgwtrlVXkcUmtBV0nBE5h9bkCfTDeR+O/Q8S30cy16EiHayLMbS4Vl1FFpvQVtBxRuQcWpMn0A/nfTT2P0x8H8tch4p0sC7G0OJadRVZbEJbQccZkXNoTZ5AP5z38dj/KPF9InMdKtLBuhhDi2vVVWSxCW0FHWdEzqE1eQL9cN4nY//jxPd9metQkQ7WxRhaXKuuIotNaCvoOK4tWpMn0A/nfX/sf5L4/lnmOlSkg3UxhhbXqqvIYhPaCjrOiJxDa/IE+uG8H4j97ye+f565DhXpYF2MocW16iqy2IS2go4zIufQmjyBfjjvB2P/B4jvX2SuQ0U6WBdjaHGtuoosNqGtoOOMyDm0Jk+gH877odj/QeL7l5nrUJEO1sUYWlyrriKLTWgr6Dgjcg6tyRPoh/M+Ffs/RHw/nLkOFelgXYyhxbXqKrLYhLaCjjMi59CaPIF+OO9HYv9TxPejmetQkQ7WxRhaXKuuIotNaCvoOCNyDq3JE+iH834s9n+E+P5V5jpUpIN1MYYW16qryGIT2go6zoicQ2vyBPrhvB+P/R8jvn+duQ4V6WBdjKHFteoqstiEtoKOMyLn0Jo8gX447ydi/8eJ7ycz16EiHayLMbS4Vl1FFpvQVtBxRuQcWpMnzPLTeVnq/9vhp0bB8tPE8um8LPXvDH6GtMAFHUvHeR98Ji9HvSc/LfLHmPkK68RmNTT3E2PMwo9dP6XHUv/fDlJbQccZkXNoTY9L7MlnY//TxPdv8vLVnnxWsGAMLa5VV5HFJrQVdJwROYfW5Amz/GxWFldfB/Uzo2D5WWL5XFaW3vPW50kLXNCxdJz3wefzctR78nMif4yZr7AW1sJaWAtrYS2shbWwFtbPF9bCWlgLa2EtrIW1sBbWwjpOWA3NfXaMWfiz+J9RY3H133SX2go5OyNyDq3pc3b25Aux/zni+7m8fLUnXxAsGEOLa9VVZLEJbQUdZ0TOoTV5wiw/n5Wl93+TfXEULD9PLF/KytL7HuYXSOuL8RY6lo7zPviFvBz1nvySyB9j5iushbWwFtbCWlgLa2EtrBOb1dDcF8aYhd/LfFGNpfd/k0lthZydETmH1vQ+hT35cux/ifj+bV6+2pMvCxaMocW16iqy2IS2go4zIufQmjxhll/KytJ7H/uLo2D5JWL5SlaW3vvYXyYtcEHH0nHeB7+cl6Pek18R+WPMfIW1sBbWwlpYC2thLayFdWKzGpr78hiz8HuZX1Rj6b2PldoKOTsjcg6t6X0Ke/LV2P8K8f27vHy1J18VLBhDi2vVVWSxCW0FHWdEzqE1ecIsv5qVpfc+9ldGwfKrxPK1rCy997G/Rlrggo6l47wPfi0vR70nvybyx5j5CmthLayFtbAW1sJaWAvrxGY1NPfVMWbh9zK/osbSex8rtRVydkbkHFrT+xT25Oux/zXi+/W8fLUnXxcsGEOLa9VVZLEJbQUdZ0TOoTV5wiy/mZel/rtkvzEKlt8klm/kZanfx/4WaYELOpaO8z74rbwc9Z78hsgfY+YrrBOb1dDc18eYhR+7fkOPpf67ZFJbQccZkXNoTY9L7Mk3Y/8bxPfv8/LVnnxTsGAMLa5VV5HFJrQVdJwROYfW5Amz/E5elvp567dHwfI7xPKtvCz189bvkha4oGPpOO+D383LUe/Jb4n8MWa+wjqxWQ3NfXOMWfix67f1WOrnLamtoOOMyDm0pscl9uTbsf8t4vsPeflqT74tWDCGFteqq8hiE9oKOs6InENr8oRZfl+B5fdGwfL7xPKdvCz189YfkBa4oGPpOO+DP8jLUe/J74j8MWa+8cJqaO7bY8zC97Hf02NxNqGtocO1RWu6/7An34397xDff8zLV3vyXcGCMbS4Vl1FFpvQVtBxRuQcWpMn0A/n/WHsf5f4/lPmOlSkg3UxhhbXqqvIYhPaCjrOiJxDa/IE+uG8P4r9PyS+/5y5DhXpYF2MocW16iqy2IS2go4zIufQmjyBfjjvj2P/j4jvv2SuQ0U6WBdjaHGtuoosNqGtoOOMyDm0Jk+gH877k9j/Y+L7r5nrUJEO1sUYWlyrriKLTWgr6Dgjcg6tyRPoh/P+NPb/hPj+W+Y6VKSDdTGGFteqq8hiE9oKOs6InENr8gT64bw/i/0/Jb7/nrkOFelgXYyhxbXqKrLYhLaCjjMi59CaPIF+OO/PY//PiO9/ZK5DRTpYF2Noca26iiw2oa2g44zIObQmT6AfzvuL2P9z4vufmetQkQ7WxRhaXKuuIotNaCvoOCNyDq3JE+iH8/4y9v+C+P5X5jpUpIN1MYYW16qryGIT2go6zoicQ2vyBPrhvL+K/b8kvv+duQ4V6WBdjKHFteoqstiEtoKOMyLn0Jo8gX44769j/6+I7/9krkNFOlgXY2hxrbqKLDahraDjjMg5tCZPoB/O+5vY/2vi+7+Z61CRDtbFGFpcqxOKLDahraDjjMg5tCZPoB/O+9vY/xvi+3+Z61CRDtbFGFpcqxOKLDahraDjjMg5tCZPoB/O+7vY/1vi+/+Z61CRDtbFGFpcqxOKLDahraDjjMg5tCZPoG/oB/+O+Koqbx0qATRMY2hxrbqKLDahraDjjMg5MTzFE+iH8/qqU08IfP0KnvQJTzDuJ0/AwJ70K3gitRV0nBE5U3qn1AGtnzyZFPt9xDdZwZNJwhOMJ5MnfQlPJit4IrUVdJwROY/kyWTyZErsTyK+qQqeTBGeYDyVPJmU8GSqgidSW0HHGZHzSJ5MJU+mgYv4jIIn04QnGBvyZErCE6PgidRW0HFG5DySJ4Y8mR7704jPKngyXXiCsSVPpiU8sQqeSG0FHWdEziN5YsmTGbE/nfhmKngyQ3iC8UzyZHrCk5kKnkhtBR1nRM4jeTKTPJkV+zOIb7aCJ7OEJxjPJk9mJDyZreCJ1FbQcUbkPJIns8mTObE/i/jmKngyR3iC8VzyZFbCk7kKnkhtBR1nRM4jeTKXPJkX+3OIb76CJ/OEJxjPJ0/mJDyZr+CJ1FbQcUbkPJIn88mTBbE/j/gWKniyQHiC8ULyZF7Ck4UKnkhtBR1nRM4jebKQPFkU+wuIb7GCJ4uEJxgvJk8WJDxZrOCJ1FbQcUbkPJIni8mTJbG/iPiWKniyRHiC8VLyZFHCk6UKnkhtBR1nRM4jebKUPFkW+0uIb7mCJ8uEJxgvJ0+WJDxZruCJ1FbQcUbkPJIny8mTFbG/jPhWKniyQniC8UryZFnCk5UKnkhtBR1nRM4jebKSPFkV+yuIb7WCJ6uEJxivJk9WJDxZreCJ1FbQcUbkPJInzLImL0v9+7YDo2BZQyxr87LUv7e0jsTBtZb2wbrEPlinsCfXij2JMfMV1onNamhuVTW2LPzYNaDHUv++rdRW0HFG5Bxa0+MSe7Je7JnAt0HBk/XCE4w3kCdrE3s1N4tNaCvoOCNyHskTZtmUlcXVf6d34yhYNhHL5rx1qZ+3ziBxcG2mfXBGYh+cobAnN4s9iTHzFdbCWlgLa2EtrIW1sBbWwlpYC2thLayFtbAW1sJaWAvreGE1NIfPp8eKhT+L36jG4ur/Z0JqK+TsjMg5NDE85XN29uRMsWcC31kKnpwpPMH4LPJkc2Kv5maxCW0FHWdEziN5wiznZGXp/X+JZ4+C5Rxi2ZK3LvX3MOeSOLi20D44N7EPzlXYk1vEnsSY+QprYS2shbWwFtbCWlgL68RmNTSH1/djxcLvZc5WY+n9f4lSWyFnZ0TOoYnhKe9T2JNBsWcC35CCJ4PCE4yHyJMtib2am8UmtBV0nBE5j+QJs2zNvA8DixsFy1Zi2Za3LvX72O0kDq5ttA+2J/bBdoU9uU3sSYyZr7AW1sJaWAtrYS2shbWwTmxWQ3N4fT9WLPxexqmx9N7HSm2FnJ0ROYcmhqe8T2FPzhN7JvCdr+DJecITjM8nT7Yl9mpuFpvQVtBxRuQ8kifMcmHmfRhYLhgFy4XEsiNvXer3sTtJHFw7aB/sTOyDnQp7cofYkxgzX2EtrIW1sBbWwlpYC2thndishubw+n6sWPi9zAVqLL33sVJbIWdnRM6hieEp71PYk4vEngl8Fyt4cpHwBOOLyZMdib2am8UmtBV0nBE5j+QJs+zKy1L/XbJLRsGyi1iG87LU72MvJXFwDdM+uDSxDy5V2JPDYk9izHyFdWKzGpq7qBpbFn7sukSPpf67ZFJbQccZkXNoTY9L7MlusWcC32UKnuwWnmB8GXkynNiruVlsQltBxxmR80ieMEtX4XlrzyhYusSyNy9L/bx1OYmDay/tg8sT++ByhT25V+xJjJmvsE5sVkNzu6uxZeHHrj16LPXzltRW0HFG5Bxa0+MSe3KF2DOB70oFT64QnmB8JXmyN7FXc7PYhLaCjjMi55E8YZarFViuGgXL1cRyTV6W+nnrWhIH1zW0D65N7INrFfbkNWJPYsx844XV0NwV1diy8H3sKj0WZxPaGjpG5Bxa0/2HPblO7JnAd72CJ9cJTzC+njy5JrFXc7PYhLaCjjMi55E8uZ48uSH2ryO+GxU8uUF4gvGN5Ml1CU9uVPBEaivoOCNyHsmTG8mTm2L/BuLbp+DJTcITjPeRJzckPNmn4InUVtBxRuQ8kif7yJObY/8m4rtFwZObhScY30Ke3JTw5BYFT6S2go4zIueRPLmFPLk19m8mvtsUPLlVeILxbeTJzQlPblPwRGor6Dgjch7Jk9vIk9tj/1biu0PBk9uFJxjfQZ7cmvDkDgVPpLaCjjMi55E8uYM8uTP2bye+uxQ8uVN4gvFd5MntCU/uUvBEaivoOCNyHsmTu8iTu2P/TuK7R8GTu4UnGN9DntyZ8OQeBU+ktoKOMyLnkTxhlnvzsgyGNe/LnF9Y435KCLneS37i+H2U2/0Ke+tesbcwZr4XyrqgM7asWv7vV9jf949if++n/B7IzDLDrzGVfH1A+AvOPuI5mNgbeNyZ7uNAdfrPoT+JjvNj1WGF/XIorlnFOCy4gu6DCrrQmRx1wQGtfvqZX5/eu53Z6d2X0PqUa8NtmPqH6X6NtqRFLAeq9rDMblFdZrSIxbSIZUqLWPpbxDLcIpbFLWKZ2SKW6S1imdoilkktYlnaIpY9LWJZ1CKWhS1iWdAillktYrEtYpnWIpbJLWKpxpjFdE5/n2zo+AH6uT5xbqjjZ2afPP6QeF/L6zxUnf5znPvDCrmzzjCNoTWdGB6qxp5lcotYprWIxbaIZVaLWBa0iGVhi1gWtYhlT4tYlraIZVKLWKa2iGV6i1hmtohlcYtYhlvE0t8iliktYjEtYpnRIpbZLWLBe4s2sCxpUV36EiyP5GWpr7F/NK4ZGt6nPUIcYHqUOB7LzFEJjop0odVPP/NUfDMQXj8csSe5Luvk5QqPH3jOwdpB87iC5qELztv/wLbDh1+I5u68edbfm0OLPeA2TH3o179bm5elvi5gV+b8whqXED9yBbul47sot0vyctT3/Us7p9YUY+Z7oawLxphVy/+L865Z72+uaWhN+/tiyu+izCy4LgS+Yn1ZW75OYUdehvpx/0LKF5rQCY/7O2Offw79SXR8B3Gen5ez3oMXxLWqGOcLlqB7noIudHCtCTig1U8/83x8bG661kSjNtyGqQ+t73WtyVizzGsRy+wWscxoEYtpEcuUFrH0t4hluEUsO1vEsrhFLPNbxDKnRSwzW8QyvUUsU1vEMqlFLEtbxLKnRSyLWsSysEUsc1vEMqtFLLZFLNNaxDK5RSzVGLN8r+uBcHwnzfWJc+X1QNvjfF9ine2d03+Oc9+mkDvrDNMYWnw90PYWsExuEcu0FrHYFrHMahHL3BaxLGwRy6IWsexpEcvSFrFMahHL1BaxTG8Ry8wWscxpEcv8FrEsbhHLzhaxDLeIpb9FLFNaxGJaxDKjRSyzW8Qyr0UsS1rE0pdg2ZqXpf7u3nVONryX3kocYHLEMZSZoxIcFelCq59+phvvTOE13u4ZJ7k0rtnCnuDrp65Q0ORrtkbS3J03z21tumYrrLGLtFLXLOE4X4eQ+TqvxmuWdunp1vn/U7y+rLC+cFbTOf1+NVYslvQu02Op/279P8I1gUN8/R5/95b5OsG6tpeI2mJ8MdUWDJcqstiEtoLOthZdG9n7v6JJC1wXUe1xnJ9HdmaufUWaWBdj5nuhrLsK6z9J1vy6W+vXr6wbWtP9kVm0rxMGF3QsHWcvLszLUXuxQ+SPcer65MJaWAtrYS2shbWwFtbCWlgLa2EtrIW1sBbWwlpYC2thLayFtbAW1sJaWAtrYS2shbWw5mPNr+vq6yNYN7Sm6yOY5YKsLL3rI84nLXBBx9Jx9kLz76RhXYyZr7AW1sJaWAtrYS2shbWwFtbCWlgLa2EtrIW1sBbWwlpYxwurgm79+7CsG1rT58vMkvn/oag/X95OWvL/oLB0nL3Ynpej9uI8kT/GzFdYJzZrft2h+vse1g2t6f6o+HeA6vvjVtICF3QsHWcvMv8NoCH+WztYF2PmK6yFtbAW1sJaWAtrYS2sE5s1v27v9Tnrhtb0+pxZXFaW3uvzIdKSfwfT0nH2IvPfxqy9cCJ/jJmvsBbWwlpYC2thLayFtbBObFYF3fr/vmfd0JpenzPLYF6WerlzSQtc0LF0nL04Ny9H7cWgyB9j5hsvrAq69b5h3dCa9g2zbMnLUmOcQ1rggo6l4+zFOXk5ai+2iPwxZr7xwmporo/mcLyf5s6O/Uk0d1bsT6a5MyknzJ0R+1NpbnPsT6O5TbG/iOY2xj7/nfUNsX8Rza2P/R00ty72L6C5tbF/Hs2tif1tNDcQ+47mVsf+IM2tiv1dNLeS+rhdEfvTaW557Fua68b+DJrbG/szae7y2J9Fc1fE/myauzLBB6+30By85r0Br8+mOXh9Fs3B6zNpDl6fQXPwejPNoUabaA412khzqNEGmkON1tMcarSO5lCjtTSHGq2hOfx/YgM0Nzf2V9PcvNhfRXPzY5+9XxD7K2huYewvpzns9y7NLY79vTS3JPYvp7mlsX8FzS2LfXgfvJhCOQzH28EX1xzfT9CaniOgH1hW5WUZ5PvdAOmsyKtTP66uFPlhDC1LDKsUWWxCO7+OG+Sc+2JuC4UuP56tJJa1mXMOLMto/QHShVY//cwX4p0/PJYdnH3yvMz7z/HzA1rTfUFvX7hT7gsvhIX3zvKsLIODYc1lmdcMa6wlfuTKz6c4zntFYy8u75xaU7kXC2thLayFtbAW1sJaWAtrYS2shbWwFtbCWlgLa2EtrIV1PLHyZ/2rx5jFEoPe9w5u0Ca0NT4v5+/0sHb47uJ6+u5iZebcQp35+4gBYoBWP/3MM7NPcu2L/el0nPdEZtYDCjV3/P08WtP3Jcspv7zfbbjB8J32VKrlMuEDOPuIYV1Wht73K+tPpvsPmtAJXuM+wN+9oz9AbBvystWPCcw2TGNo8fevaxVZbEKbv2cMdcJ9YQ3VblWiTnm/Axx6Ud8B5v6+rhI+DJMG62bex0OsW8WABub7qX8cF4XQz4UGD8EcPFye+DnurxTnWDq+XDnnZcQxTGNohT36COW6PMG9kLhxnJ8jMj8G19z8GDzQSV8rg1zWEIvG647vVUN+3bFG1Cw/y1D9ukNq83VEqFnw9CPEofkaoU/4w9c8gQc/K1/DDdDPLKXzkKP2fYMfhwY6p983+PHg7fQ65ydHeJ2jeZ2RZOXHTM3X3OFaP+bgx0z8zHOxLjMjz/rMPHwdJ1rT89h6qk3m5/v6ddFG0gIXv+7A8QXEsTFzTSrSxLoYM9+GBGvqOWyDGmvvWiTmCK3Jv43EsjkrS+91yBm0/jBpsO6ZeXWHWBevQ6CB+X7qf4qem8882f2Hxx0wBw83JX6O+xvEOZaOb1LOeTNxDNMYWuFx9ROU66YE91LixnF+PQDf+LF4k0IuG0UuGwUzfw6xQY2l9zmE1Obnp/zP/b38V3VOtoHO6Z8P8OcWq4iLP7foz8wV1pyceU2+7h2t6fEK+uHadlyjfvTYkaf2P3jopkP7D1a0xCSxXB8tw33+tYspVErM8Vv/0KZ2TkfMVo/5BN0X4SbFvKdE8Wmdk9fthxqEzzDC64Fw6W2wP1xXH66jD9fNzyfGE/E2PFeG15LhOvhw3Xu4zj3spfBcFe7r4fVO2GdhX4X72ECn99o7vB4Jz2vhOT/c58L9ItwnwuNMeCwNjzNndXq/vxB+ryH8vkP4PaXwRB5+zy38bkf4exTh9z7C340LvxMS/p5j+H2R8P8G7fCxs9P7PZOLO73fQdkVa3upj90+LvOxp9O7dn9vp3dtfrgWP1x7f5WPq31c4+NaH9f5uN7HDT5u9HGTj30+bvZxi49bfdzm43Yfd/i408ddPu72cY+Pe33c5+N+H/t9PODjgI+DPg75OOzjQR8P+XjYxyM+HvXxmI/HfTzh44iPl/h40sdTPo76OObjuI+X+njax8t8vNzHK3y80serfLzax2t8vNbH63w84+P1Pt7g440+3uTjzT7e4uOtPt7m4+0+3uHjnZ2e1+/y8W4fz/p4zsfzPt7j470+3ufj/T4+4OODPj7k48Od3nuaj/r4mI+P+/iEj092Tt5JeON/Pf7iCH4vaF/vfjhw9LEjxwYGB57w/+5/7LEjTx86uGWAjx0dePz40WMDR4/tf+rYwOGnjjw+MLSF133O6qz7bHxsxH3iyicOHnrZwJHjxwaOHB544MjxJw4e/XvnnPJ1/8QCAA==", + "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" + }, + { + "name": "set_is_valid_storage", + "functionType": "open", + "isInternal": true, + "parameters": [ + { + "name": "message_hash", + "type": { + "kind": "field" + }, + "visibility": "private" + }, + { + "name": "value", + "type": { + "kind": "boolean" + }, + "visibility": "private" + } + ], + "returnTypes": [ + { + "kind": "struct", + "path": "aztec::abi::PublicCircuitPublicInputs", + "fields": [ + { + "name": "call_context", + "type": { + "kind": "struct", + "path": "aztec::abi::CallContext", + "fields": [ + { + "name": "msg_sender", + "type": { + "kind": "field" + } + }, + { + "name": "storage_contract_address", + "type": { + "kind": "field" + } + }, + { + "name": "portal_contract_address", + "type": { + "kind": "field" + } + }, + { + "name": "function_selector", + "type": { + "kind": "field" + } + }, + { + "name": "is_delegate_call", + "type": { + "kind": "boolean" + } + }, + { + "name": "is_static_call", + "type": { + "kind": "boolean" + } + }, + { + "name": "is_contract_deployment", + "type": { + "kind": "boolean" + } + } + ] + } + }, + { + "name": "args_hash", + "type": { + "kind": "field" + } + }, + { + "name": "return_values", + "type": { + "kind": "array", + "length": 4, + "type": { + "kind": "field" + } + } + }, + { + "name": "contract_storage_update_requests", + "type": { + "kind": "array", + "length": 16, + "type": { + "kind": "struct", + "path": "aztec::abi::ContractStorageUpdateRequest", + "fields": [ + { + "name": "storage_slot", + "type": { + "kind": "field" + } + }, + { + "name": "old_value", + "type": { + "kind": "field" + } + }, + { + "name": "new_value", + "type": { + "kind": "field" + } + } + ] + } + } + }, + { + "name": "contract_storage_read", + "type": { + "kind": "array", + "length": 16, + "type": { + "kind": "struct", + "path": "aztec::abi::ContractStorageRead", + "fields": [ + { + "name": "storage_slot", + "type": { + "kind": "field" + } + }, + { + "name": "value", + "type": { + "kind": "field" + } + } + ] + } + } + }, + { + "name": "public_call_stack", + "type": { + "kind": "array", + "length": 4, + "type": { + "kind": "field" + } + } + }, + { + "name": "new_commitments", + "type": { + "kind": "array", + "length": 16, + "type": { + "kind": "field" + } + } + }, + { + "name": "new_nullifiers", + "type": { + "kind": "array", + "length": 16, + "type": { + "kind": "field" + } + } + }, + { + "name": "new_l2_to_l1_msgs", + "type": { + "kind": "array", + "length": 2, + "type": { + "kind": "field" + } + } + }, + { + "name": "unencrypted_logs_hash", + "type": { + "kind": "array", + "length": 2, + "type": { + "kind": "field" + } + } + }, + { + "name": "unencrypted_log_preimages_length", + "type": { + "kind": "field" + } + }, + { + "name": "block_data", + "type": { + "kind": "struct", + "path": "aztec::abi::HistoricBlockData", + "fields": [ + { + "name": "private_data_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "nullifier_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "contract_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "l1_to_l2_messages_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "blocks_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "public_data_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "global_variables_hash", + "type": { + "kind": "field" + } + } + ] + } + }, + { + "name": "prover_address", + "type": { + "kind": "field" + } + } + ] + } + ], + "bytecode": "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", + "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" + } + ], + "events": [] +} diff --git a/yarn-project/aztec.js/src/artifacts/schnorr_single_key_account_contract.json b/yarn-project/aztec.js/src/artifacts/schnorr_single_key_account_contract.json new file mode 100644 index 00000000000..cf5457aae8f --- /dev/null +++ b/yarn-project/aztec.js/src/artifacts/schnorr_single_key_account_contract.json @@ -0,0 +1,622 @@ +{ + "name": "SchnorrSingleKeyAccount", + "functions": [ + { + "name": "constructor", + "functionType": "secret", + "isInternal": false, + "parameters": [], + "returnTypes": [], + "bytecode": "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", + "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" + }, + { + "name": "entrypoint", + "functionType": "secret", + "isInternal": false, + "parameters": [ + { + "name": "payload", + "type": { + "kind": "struct", + "path": "authwit::entrypoint::EntrypointPayload", + "fields": [ + { + "name": "function_calls", + "type": { + "kind": "array", + "length": 4, + "type": { + "kind": "struct", + "path": "authwit::entrypoint::FunctionCall", + "fields": [ + { + "name": "args_hash", + "type": { + "kind": "field" + } + }, + { + "name": "function_selector", + "type": { + "kind": "field" + } + }, + { + "name": "target_address", + "type": { + "kind": "field" + } + }, + { + "name": "is_public", + "type": { + "kind": "boolean" + } + } + ] + } + } + }, + { + "name": "nonce", + "type": { + "kind": "field" + } + } + ] + }, + "visibility": "public" + } + ], + "returnTypes": [], + "bytecode": "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", + "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" + }, + { + "name": "is_valid", + "functionType": "secret", + "isInternal": false, + "parameters": [ + { + "name": "message_hash", + "type": { + "kind": "field" + }, + "visibility": "private" + } + ], + "returnTypes": [], + "bytecode": "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", + "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" + }, + { + "name": "is_valid_public", + "functionType": "open", + "isInternal": false, + "parameters": [ + { + "name": "message_hash", + "type": { + "kind": "field" + }, + "visibility": "private" + } + ], + "returnTypes": [ + { + "kind": "struct", + "path": "aztec::abi::PublicCircuitPublicInputs", + "fields": [ + { + "name": "call_context", + "type": { + "kind": "struct", + "path": "aztec::abi::CallContext", + "fields": [ + { + "name": "msg_sender", + "type": { + "kind": "field" + } + }, + { + "name": "storage_contract_address", + "type": { + "kind": "field" + } + }, + { + "name": "portal_contract_address", + "type": { + "kind": "field" + } + }, + { + "name": "function_selector", + "type": { + "kind": "field" + } + }, + { + "name": "is_delegate_call", + "type": { + "kind": "boolean" + } + }, + { + "name": "is_static_call", + "type": { + "kind": "boolean" + } + }, + { + "name": "is_contract_deployment", + "type": { + "kind": "boolean" + } + } + ] + } + }, + { + "name": "args_hash", + "type": { + "kind": "field" + } + }, + { + "name": "return_values", + "type": { + "kind": "array", + "length": 4, + "type": { + "kind": "field" + } + } + }, + { + "name": "contract_storage_update_requests", + "type": { + "kind": "array", + "length": 16, + "type": { + "kind": "struct", + "path": "aztec::abi::ContractStorageUpdateRequest", + "fields": [ + { + "name": "storage_slot", + "type": { + "kind": "field" + } + }, + { + "name": "old_value", + "type": { + "kind": "field" + } + }, + { + "name": "new_value", + "type": { + "kind": "field" + } + } + ] + } + } + }, + { + "name": "contract_storage_read", + "type": { + "kind": "array", + "length": 16, + "type": { + "kind": "struct", + "path": "aztec::abi::ContractStorageRead", + "fields": [ + { + "name": "storage_slot", + "type": { + "kind": "field" + } + }, + { + "name": "value", + "type": { + "kind": "field" + } + } + ] + } + } + }, + { + "name": "public_call_stack", + "type": { + "kind": "array", + "length": 4, + "type": { + "kind": "field" + } + } + }, + { + "name": "new_commitments", + "type": { + "kind": "array", + "length": 16, + "type": { + "kind": "field" + } + } + }, + { + "name": "new_nullifiers", + "type": { + "kind": "array", + "length": 16, + "type": { + "kind": "field" + } + } + }, + { + "name": "new_l2_to_l1_msgs", + "type": { + "kind": "array", + "length": 2, + "type": { + "kind": "field" + } + } + }, + { + "name": "unencrypted_logs_hash", + "type": { + "kind": "array", + "length": 2, + "type": { + "kind": "field" + } + } + }, + { + "name": "unencrypted_log_preimages_length", + "type": { + "kind": "field" + } + }, + { + "name": "block_data", + "type": { + "kind": "struct", + "path": "aztec::abi::HistoricBlockData", + "fields": [ + { + "name": "private_data_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "nullifier_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "contract_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "l1_to_l2_messages_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "blocks_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "public_data_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "global_variables_hash", + "type": { + "kind": "field" + } + } + ] + } + }, + { + "name": "prover_address", + "type": { + "kind": "field" + } + } + ] + } + ], + "bytecode": "H4sIAAAAAAAA/+2dCbxdVXXG73nvZdjZLwMZyXwzhwDhvZOBkATygFxmZJ7HkIE5AZIwCAiICIggIiICIlprrVprrVOd6lSnOtWpTnWqtdZaO6iltVa717n7833sHI95P/bqO8+39++3cvdwz/7+a619z73n3P1uXtNoNLJGu3Q6m9TYs2C8zz/2PLvSm8Wbq0eTs2OIcHYOEc6uIcI5YohwjhwinKOGCOfoIcJphgjnmCHCaYcIZ/cQ4Rw7RDjHDRHO8UOEc8IQ4dxniHBOHCKckyJyTifOyf5xin+c6h+n+cd9/SOOmeEfZ3ofu3x7lrPZzuY4m+vHEJCms3nO5jtb4Gyhs0XOFjtb4myps/2cLXO2v7MDnB3obLmzg/w8vc5yZyucrXS2ytlqZwc7W+PsEGdrna1ztt7Zoc4Oc7bBx+1wZ0c4O9LZRmctZ0c5O9rZMc6OdXacs+OdneDsRGfPcXaS96XpfTnZ2SnOTnV2mrPTnZ3h7ExnZzk729k5zs51dp6z851d4OxCZxc5u9jZJmeXONvsbIuzrc62ObvU2WXOLnd2hbMrnV3l7Gpn253tCGJ+jbNrnV3nbKcfm+DHdjnb7ex6Zzc4u9HZTc6e6+xmZ7c4u9XZ85zd5ux2Z3c4e76zO4O5XuDsLmcvdHa3s3uc3evsRc7uc/ZiZ/c7e8DZS5w96Oylzh5y9jI/V4ef62FnLw/6HnH2Cl9/1D++0j8+5h8f949P+MdX+ccn/eOr/eNTjf5yb3f7UT7LYZ1PbPT34Tp8H+rD+ATqw/h46sP4OOrD+Fjqw3g39WHcUh/Gx1Afj+MR46OpD+OjqA/jI6kP4yOoD+Nd1IfxTurDeAf1YTyjPow3An0pff6x51mWkY3o59ce8bmH/GiU+Mv3cEJ/u0riMqIkfpwPjHPeMM755XE8YpzXC8Z53WCc1x/GeZ1inNczxnndY5xfHxjn1xHG+fWG8UnUh/HJ1IfxKdSH8anUh/Fp1IfxfakP49OpD+N4PxO/JPYzfbvPP/Y8u5Ib0kDJgnYf1aEvLLMVWGYNgGU2scyJy1JcX8/1c80gnWZknYx0MC/a0LLEMEeRxZZoa+hwbFGq8twklnlxWYpT6nzSAtc8ij3GJxPH/MgxyUgT86INLUN9swaZxRLDXOrD85p6fLkJ+KRUrZ/5xLIwKktvj7AsGADLQmJZFJWl/bljceQ5ZY4lxA9fwW5pfDH5tiQuR7EmFzWeGVO0mS+xJtbEmlgTa2JNrIk1sQ5vVkN98waZha+PFqix9PbYEm2N6w2+x4W55T7i46Q5N7Jv/F0H7k2AAVqd9JwbbD8X7sGPofF5aqz5Zq17ZLgHhLK398hmRc6F3JMdRbEM7weAs4MYZkRl2PP+DTShI7nGPUu+j4L7sBiT9fEm4qzLfVa+J8r3ISOvq+L8NStgQRtafB+yQ5HFlmjX6X4zvwb5Plzc80c7J3MCFrT5nhsYOhVZbIm2gs6Az2/Ql+Oavs73yCPfL+7l9x/MizbfMwZDlyKLbZS/j0XWyTm2KFU5gb4ch3Nuk/gWRI5D1njme0AftaHFsRqhyGJLtBV0chP4LKUqJ9CX43APmu+LR/5sWORkYcCCNl8nMIMWiy3RVtDJTeCzlKqcQF+Ow3USfz+gcY2yOGBBm69RwDBKkcWWaCvo5CbwWUpVTvi6camv8zXsfpHjkJEO5kUbWhyr0YostkRbQSc3gc9SqnICfTluma8vJb79I8chIx3Miza0OFZGkcWWaCvo5CbwWUpVTvYn3w/w9WXEd2DkOGSkg3nRhhbHaowiiy3RVtDJTeCzlKqcQF+OW+7rBxDfQZHjkJEO5kUbWhwrq8hiS7QVdHIT+CylKifQl+Owf2858fVGjgPva8a8aPdSHsDQrchiS7QVdHIT+CylKifQl+NyMBDfishxyEgH86INLY7VWEUWW6KtoJObwGcpVTmBvhy30tdz4lsVOQ4Z6WBetKHFsRqnyGJLtBV0chP4LKUqJ9CX41b7+kriOzhyHDLSwbxoQ4tjNV6RxZZoK+jkJvBZSlVOoC/HrfH11cR3SOQ4ZKSDedGGFsdqgiKLLdFW0MlN4LOUqpxAX45b6+triG9d5DhkpIN50YYWx2ofRRZboq2gk5vAZylVOYG+HLfe19cS36GR45CRDuZFG1ocq4mKLLZEW0EnN4HPUqpyAn057jBfX098GyLHISMdzIs2tDhWkxRZbIm2gk5uAp+lVOUE+vx7AocR3+GR45AF+n3UhhbHaqoiiy3RVtDJObYoVTlhliPjsqwUliMGwHIksWyMy1LsV29FnlPmOIr44SvYLY23yLej4nIU63xj45kxRZv5EuvwZjWNPV9Xg8XC58Mj9FhW2hJtBZ3cBD5LqTrXcU6O9vWNxHdMXL4iJ0cHLGhDi2PVUmSxJdoKOrkJfJZSlRNmOS4qy4pi/+KxA2A5jliOj8rSft86gbTABR1L47wOTojLUazJ4wP/0Wa+xJpYE2tiTayJNbEm1sSaWBNrYk2siTWxJtbEmlgTa2JNrIk1sSbWxJpYE2tiTayJNbHGZzXUd/Qgs1hiOFaNZUXxO1ehtoLPuQl8llK1T4RzcqKvH098z4nLV+TkxIAFbWhxrFqKLLZEW0EnN4HPUqpywiwnR2XJi31EJw2A5WRiOSUqS3sf0amkBS7oWBrndXBqXI5iTZ4S+I828yXWxJpYE2tiTayJNbEm1sSaWBNrYk2siTWxJtbEmlgT61BhNdR34iCz8L34k9RY8uJ7mFBbwefcBD5LqbrPzjk5zddPIb7T4/IVOTktYEEbWhyrliKLLdFW0MlN4LOUqpwwy5lxWYrfNjljACxnEstZcVmK72HOJi1wQcfSOK+Ds+NyFGvyrMB/tJkvsQ5vVkN9pw0yC5+7ztBjKX6HJNRW0MlN4LOUqvMS5+QcXz+L+M6Ny1fk5JyABW1ocaxaiiy2RFtBJzeBz1KqcsIs50dlaf8f0ucNgOV8YrkgKkv7fetC0gIXdCyN8zq4MC5HsSYvCPxHm/kSa2JNrIk1sSbWxJpYE+vwZjXUd84gs/C1zHlqLO3/7znUVvA5N4HPUqquUzgnF/n6BcR3cVy+IicXBSxoQ4tj1VJksSXaCjo5xxalKicXE8slUVna17GbBsByCbFsjsrSvo7dQlrggo6lcV4HW+JyFGtyc+A/2syXWBNrYk2siTWxJtbEmliHN6uhvosGmYWvZTapsbSvY0NtBZ9zE/gspeo6hXOy1dc3E9+2uHxFTrYGLGhDi2PVUmSxJdoKOrkJfJZSlRNmuUyB5dIBsFxGLJfHZSmuY68gLXBBx9I4r4Mr4nIUa/LywH+0mW+osBrq2zrILPwau1SPJbcl2ho6JvBZStXrh3Nypa9fTnxXxeUrcnJlwII2tDhWLUUWW6KtoJObwGcpVTlhlu0KLFcPgGU7seyIy1KcX68hLXBBx9I4r4Nr4nIUa3JH4D/azDdUWA31XTnILPwau1qPpTi/htoaOibwWUrV64dzcq2v7yC+6+LyFTm5NmBBG1ocq5Yiiy3RVtDJTeCzlKqcQF+O2+nr1xLfrshxyEgH86INLY5VS5HFlmgr6OQm8FlKVU6gL8ft9vWdxHd95DhkpIN50YYWx8oostgSbQWd3AQ+S6nKyfXk+w2+vpv4bowch4x0MC/a0OJYjVFksSXaCjq5CXyWUpUT6MtxN/n6DcT33MhxyEgH86INLY6VVWSxJdoKOrkJfJZSlRPoy3E3+/pNxHdL5DhkpIN50b6F8gCGbkUWW6KtoJObwGcpVTmBvhx3q6/fTHzPixyHjHQwL9rQ4liNVWSxJdoKOrkJfJZSlRPoy3G3+fqtxHd75DhkpIN50YYWx2qcIost0VbQyTm2KFU5ud0/ynF3+PptxPf8yHHISAfzog0tjtV4RRZboq2gk5vAZylVOYG+HHenr99BfC+IHIeMdDAv2tDiWLUUWWyJtoJObgKfpVTlBPpy3F2+fifxvTByHDLSwbxoQ4tj1VJksSXaCjq5CXyWUpUT6Mtxd/v6XcR3T+Q4ZKSDedGGFseqpchiS7QVdHIT+CylKifQl+Pu9fW7ie9FkeOQkQ7mRRtaHKuWIost0VbQyU3gs5SqnEBfjrvP1+8lvhdHjkNGOpgXbWhxrFqKLLZEW0EnN4HPUqpywiz3x2Up9oI/4Oe6j3ReEjm2GelgXrShxfG/X5HFlmgr6OQm8FlKVZ6hL8c96OsPEN9LI8chIx3Miza0OFb3K7LYEm0FndwEPkupygn05biHfP1B4ntZ5DhkpIN50YYWx+p+RRZboq2gk5vAZylVOYG+HPewrz9EfC+PHIeMdDAv2tDiWLUUWWyJtoJObgKfpVTlBPpy3CO+/jDxvSJyHDLSwbxoQ4tj1VJksSXaCjq5CXyWUpUT6Mtxj/r6I8T3yshxyEgH86INLY5VS5HFlmgr6OQm8FlKVU6gL8c95uuPEt/jkeOQkQ7mRRtaHKuWIost0VbQyU3gs5SqnEBfjnvC1x8jvldFjkNGOpgXbWhxrFqKLLZEW0EnN4HPUqpyAn057klff4L4Xh05DhnpYF60ocWxaimy2BJtBZ3cBD5LqcoJ9OW4p3z9SeJ7TeQ4ZKSDedGGFseqpchiS7QVdHKOLUpVTqAvx73W158ivj+IHIeMdDAv2tDiWLUUWWyJtoJObgKfpVTlBPpy3Ot8/bXE94eR45CRDuZFG1ocq5Yiiy3RVtDJTeCzlKqcQF+Oe72vv474/ihyHDLSwbxoQ4tj1VJksSXaCjq5CXyWUpUT6Mtxb/D11xPfH0eOQ0Y6mBdtaHGsWoostkRbQSc3gc9SqnICfTnujb7+BuJ7U+Q4ZKSDedGGFseqpchiS7QVdHIT+CylKifQl+Pe7OtvJL4/iRyHjHQwL9rQ4li1FFlsibaCTm4Cn6VU5QT6ctxbfP3NxPenkeOQkQ7mRRtaHKuWIost0VbQyU3gs5SqnEBfjnurr7+F+P4schwy0sG8aEOLY9VSZLEl2go6uQl8llKVE+jLcW/z9bcS359HjkNGOpgXbWhxrFqKLLZEW0EnN4HPUqpywizviMtS/N8Obx8AyzuI5Z1xWYq/GXwXaYELOpbGeR28Ky5HsSbfGfiPNvMl1uHNaqjvbYPMwueut+uxFP+3Q6itoJObwGcpVeclzsm7ff2dxPcXcfmKnLw7YEEbWhyrliKLLdFW0MlN4LOUqpwwy3ujsuTFPqj3DIDlvcTyvqgs7fet95MWuKBjaZzXwfvjchRr8n2B/2gzX2JNrIk1sSbWxJpYE2tiTazvT6yJNbEm1sSaWBNrYk2siXWIsBrqe/cgs/C9+PeoseTFb7qH2go+5ybwWUrVfXbOyQd8/X3E95dx+YqcfCBgQRtaHKuWIost0VbQyU3gs5SqnDDLh6KytP9vsg8OgOVDxPLhqCzt72E+Qlof9I/QsTTO6+AjcTmKNfnhwH+0mS+xJtbEmlgTa2JNrIk1sQ5vVkN9HxhkFr6W+aAaS/v/Jgu1FXzOTeCzlKrrFM7JR339w8T3V3H5ipx8NGBBG1ocq5Yiiy3RVtDJTeCzlKqcMMvHo7K0r2M/NgCWjxPLJ6KytK9jP0la4IKOpXFeB5+My1GsyU8E/qPNfIk1sSbWxJpYE2tiTayJdXizGur76CCz8LXMx9RY2texobaCz7kJfJZSdZ3COfmUr3+C+P46Ll+Rk08FLGhDi2PVUmSxJdoKOrkJfJZSlRNm+UxUlvZ17KcHwPIZYvlsVJb2deznSAtc0LE0zuvgc3E5ijX52cB/tJkvsSbWxJpYE2tiTayJNbEOb1ZDfZ8aZBa+lvm0Gkv7OjbUVvA5N4HPUqquUzgnn/f1zxLf38TlK3Ly+YAFbWhxrFqKLLZEW0EnN4HPUqpywixfjMtS/C7ZFwbA8kVi+VJcluI69sukBS7oWBrndfDluBzFmvxS4D/azJdYhzerob7PDzILn7u+oMdS/C5ZqK2gk5vAZylV5yXOyVd8/UvE97dx+YqcfCVgQRtaHKuWIost0VbQyU3gs5SqnDDL1+KyFO9bXx0Ay9eI5etxWYr3rW+QFrigY2mc18E34nIUa/Lrgf9oM19iHd6shvq+MsgsfO76qh5L8b4Vaivo5CbwWUrVeYlz8k1f/zrx/V1cviIn3wxY0IYWx6qlyGJLtBV0chP4LKUqJ8zybQWWbw2A5dvE8p24LMX71ndJC1zQsTTO6+C7cTmKNfmdwH+0mW+osBrq++Ygs/Br7Ft6LLkt0dbQ4diiVL1+OCff8/XvEN/fx+UrcvK9gAVtaHGsWoostkRbQSc3gc9SqnICfTnu+77+PeL7h8hxyEgH86INLY5VS5HFlmgr6OQm8FlKVU6gL8f9wNe/T3z/GDkOGelgXrShxbFqKbLYEm0FndwEPkupygn05bgf+voPiO+fIschIx3Miza0OFYtRRZboq2gk5vAZylVOYG+HPcjX/8h8f1z5DhkpIN50YYWx6qlyGJLtBV0chP4LKUqJ9CX437s6z8ivn+JHIeMdDAv2tDiWLUUWWyJtoJObgKfpVTlBPpy3E98/cfE96+R45CRDuZFG1ocq5Yiiy3RVtDJTeCzlKqcQF+O+zdf/wnx/XvkOGSkg3nRhhbHqqXIYku0FXRyE/gspSonzPIfcVl6ZM6fRo6jzPEz4oevYLc0/lPy7WeROTLSxLxoM9/esk4eZFat/P887pzF+uaYSqla3z8n//4zMku3m2NUoz+vmD+MbQfx/BfVMY7zzhhnT5c8D/UuGudz1S/i+lWsl//2c2XefhGwiO7/KOhCZ4TXBQe0Ouk5j49qP45ttF9LKB3KseHSR3VoMcu+NWIZXyOW7hqxmBqxjKwRS2eNWPpqxDKtRiwba8QytkYsY2rEMqpGLF01YpleI5apNWKZUiOWp2vEMrlGLONqxGJrxDK6RiwjasSSDTKLaex5nWxo/Gnq6wiOlTje0d0//kvf31Eyzy8bez6Pff9fBd9Zp4/a0BpDDL+sAcuIGrGMrhGLrRHLuBqxTK4Ry9M1YplSI5apNWKZXiOWrhqxjKoRy5gasYytEcvGGrFMqxFLX41YOmvEMrJGLKZGLN01YhlfI5Z9a8TSUcLyq7gsxR77Xzf6C67TfkUcYPo1ceCCqS8SRxZwZKQLrU56znp/YSKfHw4Z3c91ZOT4yGsW53nMLZobFDS3rlm96ZKV27btjeYRcf0svjeHVhD235Q+qkNfWA6Py1LsC9gQd85iX8hhxA9fwW5pfAP5dlhkjow0MS/azLe3rJMHmVUr/4fGnbNY3xxTKVXr+1Dyb31kFuwLQV4xfxhb3qewNi5Dcd4/hPyFJnTkvL/O1/l5qHfR+FriPDguZ7EG1/i5sNfk4IBFdFcr6EIHe03AAa1Oes75/txctddEIzZc+qgOrd+212SwWdbViGVijVj6asTSXSMWUyOWkTVi6awRy/gasUyrEcukGrFsrBHL2BqxjKkRy6gasXTViGVCjVim14hlao1YptSIZZ8asYyrEYutEcvoGrGMqBFLNsgsv20/EMbXUV9HcGy4H2iV7+8omWdVY8/nse8rFXxnnT5qQ4v3A62qAcuIGrGMrhGLrRHLuBqx7FMjlik1YplaI5bpNWKZUCOWrhqxjKoRy5gasYytEcvGGrFMqhHLtBqxjK8RS2eNWEbWiMXUiKW7Rix9NWKZWCOWdTVi2bdGLB0lLCvishTf3eeN/oJr6RXEAaacOHojc2QBR0a60Oqk54z3Jxn5jNdt+rk09mxhTfD+qYkKmrxn63dpHhHXz5V12rMlc2wgrbI9SxjnfQix93lV7VnaoKdb+P/7uL8sse49q2ns+boaLBZLekfqsRS/W///sCewl/fv8XfYkfcJFrE9LIgt2odSbMFwuCKLLdFW0FlZo72RxXl0HWmBaz3FHuP8PrIucuwz0sS8aDPf3rJuSKy/l6zxdVcUn19ZV0rV65FZtPcJgws6lsY5F4fE5ShysTbwH+2y/cmJNbEm1sSaWBNrYk2siTWxJtbEmlgTa2JNrIk1sSbWxJpYE2tiTayJNbEm1sSaWBNrYo3HGl83L/ZHsK6Uqv0RzLImKkt7f8TBpAUu6Fga51xo/k4a5kWb+RJrYk2siTWxJtbEmlgTa2JNrIk1sSbWxJpYE2tiTayJdaiwKugWfw/LulKq7i8zS+T/h6K4v7yKtML/g8LSOOdiVVyOIherA//RZr7EOrxZ4+v2Ft/3sK6Uqtej4u8AFa/HFaQFLuhYGudcRP4NoF7+rR3MizbzJdbEmlgTa2JNrIk1sSbW4c0aX7f9+Zx1pVR9PmeWPCpL+/N5L2mFv4NpaZxzEfm3MYtc5IH/aDNfYk2siTWxJtbEmlgTa2Id3qwKusX/fc+6Uqo+nzNLT1yWYrqDSAtc0LE0zrk4KC5HkYuewH+0mW+osCroFuuGdaVUrRtmWR6XpcA4kLTABR1L45yLA+NyFLlYHviPNvMNFVZDfR3Uh/FO6jvA17uob39fH0F9y8gn9O3n66Oob6mvj6a+Jb4+lfoW+zr/zvoiX19PfQt9fS31LfD1NdQ339dXU988X19JfU1fz6lvrq/3UN8cX99AfbOpjsdZvj6G+mb6uqW+lq93U99Rvj6W+o729XHUd4yvj6e+Y0v4kOvl1Idc89pArg+gPuR6f+pDrpdRH3K9H/Uh10upDzFaQn2I0WLqQ4wWUR9itJD6EKMF1IcYzac+xGge9U3w9Sb17ePrc6lvoq/Pob5Jvs65n+zrs6hviq/PpD6s9xb1TfP1o6hvX18/mvqm+/ox1DfD15F7ycVI8qHPP/Y8u5Lz6wSl6j0C+sIyJy5LD7/umqQzK65OcV6dHfiHNrQsMcxRZLEl2vF18h72ucP7NiXQ5fPZbGKZH9lnYZlB8zdJF1qd9Jx7/IlDzmXLu/uPi7z+cn5/QKl6Leiti/wZr4W9YeG1MzMqS0+PzDkj8pwyx3zih6/8fopxXisaa3Fm45kxDddiYk2siTWxJtbEmlgTa2JNrIk1sSbWxJpYE2tiTayJNbEOJVa+1z93kFksMeh975D32BJtjfvl/J0e5pbvLqbTdxezI/smcebvI5rEAK1Oes7x3f1cs319DI3zmojMulkh5jl/P49S9X3JTPIv7ncbeY+EcxTFckaQB3B2EMOCqAzt71cW9rv7G03oSK7xGuDv3lFvEtuiuGzFOYHZ+qgNLf7+db4iiy3R5u8ZJU54Lcyj2M0piVPc7wB7n9V3gLG/r8uCPPSRButGXse9rJt5gwb6O6m+ARtK6HlSkEMwSw5nljyP67ODYyyNz1T2eQZx9FEbWrJGV5KvM0u4pxA3xvk9IvI5uODmc3CzUb5XBr7MIxaNzx2/LYb8uWNeELP4LL3F545Qm/cRIWaS08eJQ/MzQkeQH97zBB48N/wM16TnTKfj4KP2a4PPQ83Gnq8NPh+cTp9zbv0dn3M09xmFrHzO1PzMLXv9mIPPmXjOeT4uYz3Pwsg8vI8Tpep9bCHFJvL7ffG5aDFpgYs/d2B8MnEsjhyTjDQxL9rMt6iEtew9bJEaa3svEnNIqcrfYmJZGpWl/TlkP5q/jzRYd1lc3V7WxecQaKC/k+q76L15WX/1N+cdMEsOl5Q8j+uLgmMsjS9R9nkpcfRRG1pyXr2cfF1Swj2duDHOnweQNz4XL1HwZXHgy+KAme9DLFJjad+HCLX5/Sn+e3/b/zmN/tJs7Hl/gO9bzCEuvm/RGZlL5hwReU7e945Sdb6Cvuxtxx71nbt2XLfp0q2nbt20JaMpuoLpOmgarvOfXYykUKKPL/2ljGrsiRgtHpMIusPDdXm/R3rx0Y3+ffsSA0m5fB6Qffeyz1721cs+etk3P4kY7/eP8l4pnyVlH7zse5d97rKW5L1KXuvyeUfWmawreY01G+3P3vJ5RN7X5D1fXnPyupDXhJxn5Fwq55n9G+2/X5C/a5C/d5C/U5I3cvk7N/nbDvk9Cvm7D/ndOPmbEPk9R/l7Efl/g9Y6W9do/53JoY3236Bs8LE93NkRzo50trHR3rt/VKO9N1/24sve++OcHe/sBGcnOnuOs5OcnezsFGenOjvN2enOznB2prOznJ3t7Bxn5zo7z9n5zi5wdqGzi5xd7GyTs0ucbXa2xdlWZ9ucXersMmeXO7vC2ZXOrnJ2tbPtznY4u8bZtc6uc7bT2S5nu51d7+wGZzc6u8nZc53d7OwWZ7c6e56z25zd7uwOZ893dqezFzi7y9kLnd3t7B5n9zp7kbP7nL240c71A85e4uxBZy919pCzlzl72NnLnT3i7BXOHnX2SmePNdrXNE84e5WzJ5292tlTjf4XCS/8x/wfneDvgk5rvw6bO6/asavZ09zu/t101VU7bti6ZXmTx3Y2r969c1dz565N1+1qbrtux9XN3uU873mjdeY9158b8Zo4dvuWrTc2d+ze1dyxrXnJjt3bt+z8P626Jfk/NgIA", + "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" + }, + { + "name": "set_is_valid_storage", + "functionType": "open", + "isInternal": true, + "parameters": [ + { + "name": "message_hash", + "type": { + "kind": "field" + }, + "visibility": "private" + }, + { + "name": "value", + "type": { + "kind": "boolean" + }, + "visibility": "private" + } + ], + "returnTypes": [ + { + "kind": "struct", + "path": "aztec::abi::PublicCircuitPublicInputs", + "fields": [ + { + "name": "call_context", + "type": { + "kind": "struct", + "path": "aztec::abi::CallContext", + "fields": [ + { + "name": "msg_sender", + "type": { + "kind": "field" + } + }, + { + "name": "storage_contract_address", + "type": { + "kind": "field" + } + }, + { + "name": "portal_contract_address", + "type": { + "kind": "field" + } + }, + { + "name": "function_selector", + "type": { + "kind": "field" + } + }, + { + "name": "is_delegate_call", + "type": { + "kind": "boolean" + } + }, + { + "name": "is_static_call", + "type": { + "kind": "boolean" + } + }, + { + "name": "is_contract_deployment", + "type": { + "kind": "boolean" + } + } + ] + } + }, + { + "name": "args_hash", + "type": { + "kind": "field" + } + }, + { + "name": "return_values", + "type": { + "kind": "array", + "length": 4, + "type": { + "kind": "field" + } + } + }, + { + "name": "contract_storage_update_requests", + "type": { + "kind": "array", + "length": 16, + "type": { + "kind": "struct", + "path": "aztec::abi::ContractStorageUpdateRequest", + "fields": [ + { + "name": "storage_slot", + "type": { + "kind": "field" + } + }, + { + "name": "old_value", + "type": { + "kind": "field" + } + }, + { + "name": "new_value", + "type": { + "kind": "field" + } + } + ] + } + } + }, + { + "name": "contract_storage_read", + "type": { + "kind": "array", + "length": 16, + "type": { + "kind": "struct", + "path": "aztec::abi::ContractStorageRead", + "fields": [ + { + "name": "storage_slot", + "type": { + "kind": "field" + } + }, + { + "name": "value", + "type": { + "kind": "field" + } + } + ] + } + } + }, + { + "name": "public_call_stack", + "type": { + "kind": "array", + "length": 4, + "type": { + "kind": "field" + } + } + }, + { + "name": "new_commitments", + "type": { + "kind": "array", + "length": 16, + "type": { + "kind": "field" + } + } + }, + { + "name": "new_nullifiers", + "type": { + "kind": "array", + "length": 16, + "type": { + "kind": "field" + } + } + }, + { + "name": "new_l2_to_l1_msgs", + "type": { + "kind": "array", + "length": 2, + "type": { + "kind": "field" + } + } + }, + { + "name": "unencrypted_logs_hash", + "type": { + "kind": "array", + "length": 2, + "type": { + "kind": "field" + } + } + }, + { + "name": "unencrypted_log_preimages_length", + "type": { + "kind": "field" + } + }, + { + "name": "block_data", + "type": { + "kind": "struct", + "path": "aztec::abi::HistoricBlockData", + "fields": [ + { + "name": "private_data_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "nullifier_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "contract_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "l1_to_l2_messages_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "blocks_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "public_data_tree_root", + "type": { + "kind": "field" + } + }, + { + "name": "global_variables_hash", + "type": { + "kind": "field" + } + } + ] + } + }, + { + "name": "prover_address", + "type": { + "kind": "field" + } + } + ] + } + ], + "bytecode": "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", + "verificationKey": "0000000200000800000000740000000f00000003515f3109623eb3c25aa5b16a1a79fd558bac7a7ce62c4560a8c537c77ce80dd339128d1d37b6582ee9e6df9567efb64313471dfa18f520f9ce53161b50dbf7731bc5f900000003515f322bc4cce83a486a92c92fd59bd84e0f92595baa639fc2ed86b00ffa0dfded2a092a669a3bdb7a273a015eda494457cc7ed5236f26cee330c290d45a33b9daa94800000003515f332729426c008c085a81bd34d8ef12dd31e80130339ef99d50013a89e4558eee6d0fa4ffe2ee7b7b62eb92608b2251ac31396a718f9b34978888789042b790a30100000003515f342be6b6824a913eb7a57b03cb1ee7bfb4de02f2f65fe8a4e97baa7766ddb353a82a8a25c49dc63778cd9fe96173f12a2bc77f3682f4c4448f98f1df82c75234a100000003515f351f85760d6ab567465aadc2f180af9eae3800e6958fec96aef53fd8a7b195d7c000c6267a0dd5cfc22b3fe804f53e266069c0e36f51885baec1e7e67650c62e170000000c515f41524954484d455449430d9d0f8ece2aa12012fa21e6e5c859e97bd5704e5c122064a66051294bc5e04213f61f54a0ebdf6fee4d4a6ecf693478191de0c2899bcd8e86a636c8d3eff43400000003515f43224a99d02c86336737c8dd5b746c40d2be6aead8393889a76a18d664029096e90f7fe81adcc92a74350eada9622ac453f49ebac24a066a1f83b394df54dfa0130000000c515f46495845445f42415345060e8a013ed289c2f9fd7473b04f6594b138ddb4b4cf6b901622a14088f04b8d2c83ff74fce56e3d5573b99c7b26d85d5046ce0c6559506acb7a675e7713eb3a00000007515f4c4f4749430721a91cb8da4b917e054f72147e1760cfe0ef3d45090ac0f4961d84ec1996961a25e787b26bd8b50b1a99450f77a424a83513c2b33af268cd253b0587ff50c700000003515f4d05dbd8623b8652511e1eb38d38887a69eceb082f807514f09e127237c5213b401b9325b48c6c225968002318095f89d0ef9cf629b2b7f0172e03bc39aacf6ed800000007515f52414e474504b57a3805e41df328f5ca9aefa40fad5917391543b7b65c6476e60b8f72e9ad07c92f3b3e11c8feae96dedc4b14a6226ef3201244f37cfc1ee5b96781f48d2b000000075349474d415f3125001d1954a18571eaa007144c5a567bb0d2be4def08a8be918b8c05e3b27d312c59ed41e09e144eab5de77ca89a2fd783be702a47c951d3112e3de02ce6e47c000000075349474d415f3223994e6a23618e60fa01c449a7ab88378709197e186d48d604bfb6931ffb15ad11c5ec7a0700570f80088fd5198ab5d5c227f2ad2a455a6edeec024156bb7beb000000075349474d415f3300cda5845f23468a13275d18bddae27c6bb189cf9aa95b6a03a0cb6688c7e8d829639b45cf8607c525cc400b55ebf90205f2f378626dc3406cc59b2d1b474fba000000075349474d415f342d299e7928496ea2d37f10b43afd6a80c90a33b483090d18069ffa275eedb2fc2f82121e8de43dc036d99b478b6227ceef34248939987a19011f065d8b5cef5c0000000010000000000000000100000002000000030000000400000005000000060000000700000008000000090000000a0000000b0000000c0000000d0000000e0000000f" + } + ], + "events": [] +} From cd638c3e74899af33aa225b838b31dfab81f3f61 Mon Sep 17 00:00:00 2001 From: ludamad Date: Mon, 16 Oct 2023 21:49:25 +0000 Subject: [PATCH 5/6] Fix union parsing --- .../msgpack/v1/adaptor/cpp17/variant.hpp | 194 ++++++++---------- .../circuits.js/src/cbind/compiler.ts | 19 +- yarn-project/circuits.js/src/cbind/types.ts | 22 -- 3 files changed, 84 insertions(+), 151 deletions(-) diff --git a/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/adaptor/cpp17/variant.hpp b/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/adaptor/cpp17/variant.hpp index 7c1b595e2b8..d8bb33dc33a 100644 --- a/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/adaptor/cpp17/variant.hpp +++ b/barretenberg/cpp/src/msgpack-c/include/msgpack/v1/adaptor/cpp17/variant.hpp @@ -24,125 +24,93 @@ #include namespace msgpack { -MSGPACK_API_VERSION_NAMESPACE(v1) { -namespace adaptor { -namespace detail { -template < - typename Variant, - typename T, - typename... Ts, - std::size_t current_index, - std::size_t... indices -> -Variant construct_variant( - std::size_t index, - msgpack::object& object, - std::index_sequence -) { - if constexpr(sizeof...(Ts) == 0) { - return object.as(); - } - else { - if (index == current_index) { +MSGPACK_API_VERSION_NAMESPACE(v1) +{ + namespace adaptor { + namespace detail { + template + Variant construct_variant(std::size_t index, + msgpack::object& object, + std::index_sequence) + { + if constexpr (sizeof...(Ts) == 0) { return object.as(); + } else { + if (index == current_index) { + return object.as(); + } + return construct_variant(index, object, std::index_sequence()); } - return construct_variant( - index, - object, - std::index_sequence() - ); } -} -struct object_variant_overload { - object_variant_overload(msgpack::object& obj, msgpack::zone& zone) - : obj{obj} - , zone{zone} {} - - template - void operator()(T const& value) { - obj = msgpack::object(value, zone); - } - - msgpack::object& obj; - msgpack::zone& zone; -}; -} // namespace detail - -template -struct as, typename std::enable_if<(msgpack::has_as::value && ...)>::type> { - std::variant operator()(msgpack::object const& o) const { - if ( o.type != msgpack::type::ARRAY - || o.via.array.size != 2 - || o.via.array.ptr[0].type != msgpack::type::POSITIVE_INTEGER - || o.via.array.ptr[0].via.u64 >= sizeof...(Ts)) { - THROW msgpack::type_error{}; + struct object_variant_overload { + object_variant_overload(msgpack::object& obj, msgpack::zone& zone) + : obj{ obj } + , zone{ zone } + {} + + template void operator()(T const& value) { obj = msgpack::object(value, zone); } + + msgpack::object& obj; + msgpack::zone& zone; + }; + } // namespace detail + + template + struct as, typename std::enable_if<(msgpack::has_as::value && ...)>::type> { + std::variant operator()(msgpack::object const& o) const + { + if (o.type != msgpack::type::ARRAY || o.via.array.size != 2 || + o.via.array.ptr[0].type != msgpack::type::POSITIVE_INTEGER || + o.via.array.ptr[0].via.u64 >= sizeof...(Ts)) { + THROW msgpack::type_error{}; + } + + return detail::construct_variant, Ts...>( + o.via.array.ptr[0].as(), o.via.array.ptr[1], std::make_index_sequence()); } - - return detail::construct_variant, Ts...>( - o.via.array.ptr[0].as(), - o.via.array.ptr[1], - std::make_index_sequence() - ); - } -}; - -template -struct convert> { - msgpack::object const& operator()(msgpack::object const& o, std::variant& v) const { - if ( o.type != msgpack::type::ARRAY - || o.via.array.size != 2 - || o.via.array.ptr[0].type != msgpack::type::POSITIVE_INTEGER - || o.via.array.ptr[0].via.u64 >= sizeof...(Ts)) { - THROW msgpack::type_error{}; + }; + + template struct convert> { + msgpack::object const& operator()(msgpack::object const& o, std::variant& v) const + { + if (o.type != msgpack::type::ARRAY || o.via.array.size != 2 || + o.via.array.ptr[0].type != msgpack::type::POSITIVE_INTEGER || + o.via.array.ptr[0].via.u64 >= sizeof...(Ts)) { + THROW msgpack::type_error{}; + } + + v = detail::construct_variant, Ts...>( + o.via.array.ptr[0].as(), o.via.array.ptr[1], std::make_index_sequence()); + return o; } - - v = detail::construct_variant, Ts...>( - o.via.array.ptr[0].as(), - o.via.array.ptr[1], - std::make_index_sequence() - ); - return o; - } -}; - -template -struct pack>{ - template - msgpack::packer& operator()( - msgpack::packer& o, - std::variant const& v - ) const { - o.pack_array(2); - o.pack_uint64(v.index()); - std::visit([&o](auto const& value){o.pack(value);}, v); - return o; - } -}; - - -template -struct object_with_zone> { - void operator()( - msgpack::object::with_zone& o, - std::variant const& v - ) const { - msgpack::object *p = - static_cast( - o.zone.allocate_align( - sizeof(msgpack::object) * 2, - MSGPACK_ZONE_ALIGNOF(msgpack::object) - ) - ); - - o.type = msgpack::type::ARRAY; - o.via.array.size = 2; - o.via.array.ptr = p; - o.via.array.ptr[0]= msgpack::object(v.index(), o.zone); - std::visit(detail::object_variant_overload(o.via.array.ptr[1], o.zone), v); - } -}; -} // namespace adaptor + }; + + template struct pack> { + template + msgpack::packer& operator()(msgpack::packer& o, std::variant const& v) const + { + o.pack_array(2); + o.pack_uint64(v.index()); + std::visit([&o](auto const& value) { o.pack(value); }, v); + return o; + } + }; + + template struct object_with_zone> { + void operator()(msgpack::object::with_zone& o, std::variant const& v) const + { + msgpack::object* p = static_cast( + o.zone.allocate_align(sizeof(msgpack::object) * 2, MSGPACK_ZONE_ALIGNOF(msgpack::object))); + + o.type = msgpack::type::ARRAY; + o.via.array.size = 2; + o.via.array.ptr = p; + o.via.array.ptr[0] = msgpack::object(v.index(), o.zone); + std::visit(detail::object_variant_overload(o.via.array.ptr[1], o.zone), v); + } + }; + } // namespace adaptor } } // namespace msgpack diff --git a/yarn-project/circuits.js/src/cbind/compiler.ts b/yarn-project/circuits.js/src/cbind/compiler.ts index 832ee9d925c..2601a02efd3 100644 --- a/yarn-project/circuits.js/src/cbind/compiler.ts +++ b/yarn-project/circuits.js/src/cbind/compiler.ts @@ -78,13 +78,6 @@ export interface TypeInfo { * If so, stores the variant's subtype elements. */ variantSubtypes?: TypeInfo[]; - /** - * Was this used in a variant type? - * Typically a variant in C++ will have an easy to distinguish type as - * one of two structs e.g. [Error, T]. In that case, a isError method would be imported. Only if a third type was - * added would we need to distinguish T as well. - */ - usedInDiscriminatedVariant?: boolean; /** * Key-value pair of types that represent the keys and values in a map schema. */ @@ -136,14 +129,11 @@ function msgpackConverterExpr(typeInfo: TypeInfo, value: string): string { } } else if (typeInfo.variantSubtypes) { const { variantSubtypes } = typeInfo; - // Handle the last variant type: just assume it is this type... - let expr = msgpackConverterExpr(variantSubtypes[variantSubtypes.length - 1], 'v'); - // ... because we check every other type: + // Handle the last variant type: we assume it is this type after checking everything else + let expr = msgpackConverterExpr(variantSubtypes[variantSubtypes.length - 1], 'v[1]'); for (let i = 0; i < variantSubtypes.length - 1; i++) { - // mark this as needing an import - variantSubtypes[i].usedInDiscriminatedVariant = true; // make the expr a compound expression with a discriminator - expr = `(is${variantSubtypes[i].typeName}(v) ? ${msgpackConverterExpr(variantSubtypes[i], 'v')} : ${expr})`; + expr = `(v[0] == ${i} ? ${msgpackConverterExpr(variantSubtypes[i], 'v[1]')} : ${expr})`; } return `((v: ${typeInfo.msgpackTypeName}) => ${expr})(${value})`; } else if (typeInfo.mapSubtypes) { @@ -495,9 +485,6 @@ import { IWasmModule } from '@aztec/foundation/wasm'; if (typeInfo.isImport) { imports.push(typeInfo.typeName); } - if (typeInfo.usedInDiscriminatedVariant) { - imports.push(`is${typeInfo.typeName}`); - } if (typeInfo.declaration) { outputs.push(typeInfo.declaration); outputs.push('\n'); diff --git a/yarn-project/circuits.js/src/cbind/types.ts b/yarn-project/circuits.js/src/cbind/types.ts index e30ef43cc1f..3900db0c5a3 100644 --- a/yarn-project/circuits.js/src/cbind/types.ts +++ b/yarn-project/circuits.js/src/cbind/types.ts @@ -139,25 +139,3 @@ export type RawPointerProverBase = number & { */ __RawPointerProverBaseBrand: any; }; - -/** - * Type representing raw error messages returned by circuits. - */ -type RawError = { - /** - * An error code representing the specific issue encountered by the circuit. - */ - code: number; - /** - * A descriptive error message providing details about the encountered issue in the circuit. - */ - message: string; -}; - -/** - * Distinguisher function for union types. - * @param v - the distinguished type. - */ -export function isCircuitError(v: any): v is RawError { - return v.code !== undefined && v.message !== undefined; -} From fe0b98cc7adef495372302d1c74bd14a51b2291d Mon Sep 17 00:00:00 2001 From: ludamad Date: Mon, 16 Oct 2023 21:57:35 +0000 Subject: [PATCH 6/6] Update bindings --- .../circuits.js/src/cbind/circuits.gen.ts | 43 ++++++++++++------- .../circuits.js/src/cbind/compiler.ts | 16 +++++-- 2 files changed, 40 insertions(+), 19 deletions(-) diff --git a/yarn-project/circuits.js/src/cbind/circuits.gen.ts b/yarn-project/circuits.js/src/cbind/circuits.gen.ts index abeec9a7c91..d754fbad677 100644 --- a/yarn-project/circuits.js/src/cbind/circuits.gen.ts +++ b/yarn-project/circuits.js/src/cbind/circuits.gen.ts @@ -61,7 +61,6 @@ import { TxContext, TxRequest, VerificationKeyData, - isCircuitError, toBuffer, } from './types.js'; @@ -3218,8 +3217,10 @@ export function privateKernelSimInit( wasm: IWasmModule, arg0: PrivateKernelInputsInit, ): CircuitError | KernelCircuitPublicInputs { - return ((v: MsgpackCircuitError | MsgpackKernelCircuitPublicInputs) => - isCircuitError(v) ? toCircuitError(v) : toKernelCircuitPublicInputs(v))( + return ((v: [number, MsgpackCircuitError | MsgpackKernelCircuitPublicInputs]) => + v[0] == 0 + ? toCircuitError(v[1] as MsgpackCircuitError) + : toKernelCircuitPublicInputs(v[1] as MsgpackKernelCircuitPublicInputs))( callCbind(wasm, 'private_kernel__sim_init', [fromPrivateKernelInputsInit(arg0)]), ); } @@ -3227,8 +3228,10 @@ export function privateKernelSimInner( wasm: IWasmModule, arg0: PrivateKernelInputsInner, ): CircuitError | KernelCircuitPublicInputs { - return ((v: MsgpackCircuitError | MsgpackKernelCircuitPublicInputs) => - isCircuitError(v) ? toCircuitError(v) : toKernelCircuitPublicInputs(v))( + return ((v: [number, MsgpackCircuitError | MsgpackKernelCircuitPublicInputs]) => + v[0] == 0 + ? toCircuitError(v[1] as MsgpackCircuitError) + : toKernelCircuitPublicInputs(v[1] as MsgpackKernelCircuitPublicInputs))( callCbind(wasm, 'private_kernel__sim_inner', [fromPrivateKernelInputsInner(arg0)]), ); } @@ -3236,20 +3239,26 @@ export function privateKernelSimOrdering( wasm: IWasmModule, arg0: PrivateKernelInputsOrdering, ): CircuitError | KernelCircuitPublicInputsFinal { - return ((v: MsgpackCircuitError | MsgpackKernelCircuitPublicInputsFinal) => - isCircuitError(v) ? toCircuitError(v) : toKernelCircuitPublicInputsFinal(v))( + return ((v: [number, MsgpackCircuitError | MsgpackKernelCircuitPublicInputsFinal]) => + v[0] == 0 + ? toCircuitError(v[1] as MsgpackCircuitError) + : toKernelCircuitPublicInputsFinal(v[1] as MsgpackKernelCircuitPublicInputsFinal))( callCbind(wasm, 'private_kernel__sim_ordering', [fromPrivateKernelInputsOrdering(arg0)]), ); } export function publicKernelSim(wasm: IWasmModule, arg0: PublicKernelInputs): CircuitError | KernelCircuitPublicInputs { - return ((v: MsgpackCircuitError | MsgpackKernelCircuitPublicInputs) => - isCircuitError(v) ? toCircuitError(v) : toKernelCircuitPublicInputs(v))( + return ((v: [number, MsgpackCircuitError | MsgpackKernelCircuitPublicInputs]) => + v[0] == 0 + ? toCircuitError(v[1] as MsgpackCircuitError) + : toKernelCircuitPublicInputs(v[1] as MsgpackKernelCircuitPublicInputs))( callCbind(wasm, 'public_kernel__sim', [fromPublicKernelInputs(arg0)]), ); } export function baseRollupSim(wasm: IWasmModule, arg0: BaseRollupInputs): CircuitError | BaseOrMergeRollupPublicInputs { - return ((v: MsgpackCircuitError | MsgpackBaseOrMergeRollupPublicInputs) => - isCircuitError(v) ? toCircuitError(v) : toBaseOrMergeRollupPublicInputs(v))( + return ((v: [number, MsgpackCircuitError | MsgpackBaseOrMergeRollupPublicInputs]) => + v[0] == 0 + ? toCircuitError(v[1] as MsgpackCircuitError) + : toBaseOrMergeRollupPublicInputs(v[1] as MsgpackBaseOrMergeRollupPublicInputs))( callCbind(wasm, 'base_rollup__sim', [fromBaseRollupInputs(arg0)]), ); } @@ -3257,14 +3266,18 @@ export function mergeRollupSim( wasm: IWasmModule, arg0: MergeRollupInputs, ): CircuitError | BaseOrMergeRollupPublicInputs { - return ((v: MsgpackCircuitError | MsgpackBaseOrMergeRollupPublicInputs) => - isCircuitError(v) ? toCircuitError(v) : toBaseOrMergeRollupPublicInputs(v))( + return ((v: [number, MsgpackCircuitError | MsgpackBaseOrMergeRollupPublicInputs]) => + v[0] == 0 + ? toCircuitError(v[1] as MsgpackCircuitError) + : toBaseOrMergeRollupPublicInputs(v[1] as MsgpackBaseOrMergeRollupPublicInputs))( callCbind(wasm, 'merge_rollup__sim', [fromMergeRollupInputs(arg0)]), ); } export function rootRollupSim(wasm: IWasmModule, arg0: RootRollupInputs): CircuitError | RootRollupPublicInputs { - return ((v: MsgpackCircuitError | MsgpackRootRollupPublicInputs) => - isCircuitError(v) ? toCircuitError(v) : toRootRollupPublicInputs(v))( + return ((v: [number, MsgpackCircuitError | MsgpackRootRollupPublicInputs]) => + v[0] == 0 + ? toCircuitError(v[1] as MsgpackCircuitError) + : toRootRollupPublicInputs(v[1] as MsgpackRootRollupPublicInputs))( callCbind(wasm, 'root_rollup__sim', [fromRootRollupInputs(arg0)]), ); } diff --git a/yarn-project/circuits.js/src/cbind/compiler.ts b/yarn-project/circuits.js/src/cbind/compiler.ts index 2601a02efd3..46dff5bec47 100644 --- a/yarn-project/circuits.js/src/cbind/compiler.ts +++ b/yarn-project/circuits.js/src/cbind/compiler.ts @@ -130,10 +130,16 @@ function msgpackConverterExpr(typeInfo: TypeInfo, value: string): string { } else if (typeInfo.variantSubtypes) { const { variantSubtypes } = typeInfo; // Handle the last variant type: we assume it is this type after checking everything else - let expr = msgpackConverterExpr(variantSubtypes[variantSubtypes.length - 1], 'v[1]'); + let expr = msgpackConverterExpr( + variantSubtypes[variantSubtypes.length - 1], + 'v[1] as ' + variantSubtypes[variantSubtypes.length - 1].msgpackTypeName, + ); for (let i = 0; i < variantSubtypes.length - 1; i++) { // make the expr a compound expression with a discriminator - expr = `(v[0] == ${i} ? ${msgpackConverterExpr(variantSubtypes[i], 'v[1]')} : ${expr})`; + expr = `(v[0] == ${i} ? ${msgpackConverterExpr( + variantSubtypes[i], + 'v[1] as ' + variantSubtypes[i].msgpackTypeName, + )} : ${expr})`; } return `((v: ${typeInfo.msgpackTypeName}) => ${expr})(${value})`; } else if (typeInfo.mapSubtypes) { @@ -176,7 +182,7 @@ function classConverterExpr(typeInfo: TypeInfo, value: string): string { return `${value}.map(${convFn})`; } } else if (typeInfo.variantSubtypes) { - throw new Error('TODO - variant parameters to C++ not yet supported'); + throw new Error('TODO(AD) - variant parameters to C++ not yet supported.'); } else if (typeInfo.mapSubtypes) { const { typeName } = typeInfo.mapSubtypes[1]; const convFn = `(v: ${typeName}) => ${classConverterExpr(typeInfo.mapSubtypes[1], 'v')}`; @@ -229,8 +235,10 @@ export class CbindCompiler { } else if (type[0] === 'variant') { // fixed-size array case const [_array, variantSchemas] = type; + // TODO(AD): This could be a discriminated union if we also allow writing C++ variants. const typeName = variantSchemas.map(vs => this.getTypeName(vs)).join(' | '); - const msgpackTypeName = variantSchemas.map(vs => this.getMsgpackTypename(vs)).join(' | '); + const msgpackUnion = variantSchemas.map(vs => this.getMsgpackTypename(vs)).join(' | '); + const msgpackTypeName = `[number, ${msgpackUnion}]`; return { typeName, msgpackTypeName,