mirror of
				https://github.com/msgpack/msgpack-c.git
				synced 2025-10-22 08:02:08 +02:00 
			
		
		
		
	Compare commits
	
		
			42 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 551308ae10 | ||
|   | f2c446799c | ||
|   | c2430635f9 | ||
|   | bffd3f2091 | ||
|   | 076b5ed7fd | ||
|   | 52fa74804c | ||
|   | 5ae6077234 | ||
|   | 43de525dc7 | ||
|   | f7961b798b | ||
|   | 5cada9eb27 | ||
|   | ce42436f20 | ||
|   | c3df1bb26e | ||
|   | 63d3b093f0 | ||
|   | 8b57d2caf9 | ||
|   | a9a48cea3a | ||
|   | e96853a946 | ||
|   | 2ebe884c0e | ||
|   | 823caa8d8c | ||
|   | 9c5654ed44 | ||
|   | 5d30e42c01 | ||
|   | 6b4a7b3b16 | ||
|   | 0f1d0ed78c | ||
|   | 825017ac50 | ||
|   | 4bc64de0ec | ||
|   | 08a42a347c | ||
|   | 734e47c067 | ||
|   | fa7bb8ec77 | ||
|   | dc51f5d236 | ||
|   | f06b46d412 | ||
|   | 1c97e051ad | ||
|   | 4f59b98185 | ||
|   | 208ec65034 | ||
|   | 3bd0172a9a | ||
|   | 3bb121fb8f | ||
|   | fd9e377bac | ||
|   | 82ddfc1170 | ||
|   | 6b195acba0 | ||
|   | ea1435784d | ||
|   | 9eba7c482c | ||
|   | 9c6857c425 | ||
|   | 111b91a3e2 | ||
|   | ee546036a1 | 
							
								
								
									
										72
									
								
								.github/depends/boost.sh
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										72
									
								
								.github/depends/boost.sh
									
									
									
									
										vendored
									
									
								
							| @@ -1,72 +0,0 @@ | |||||||
| #!/bin/bash |  | ||||||
|  |  | ||||||
| usage() |  | ||||||
| { |  | ||||||
|   cat <<EOL |  | ||||||
|   -b   - 32-bit or 64-bit library, maybe 32, 64 or both |  | ||||||
|   -t   - the toolset, maybe gcc, clang or both |  | ||||||
|   -p   - installation prefix |  | ||||||
| EOL |  | ||||||
| } |  | ||||||
|  |  | ||||||
| build_boost() |  | ||||||
| { |  | ||||||
|   ./b2 \ |  | ||||||
|       --toolset=$1 \ |  | ||||||
|       --prefix=$3/$2 \ |  | ||||||
|       --with-test \ |  | ||||||
|       --with-headers \ |  | ||||||
|       --with-chrono \ |  | ||||||
|       --with-context \ |  | ||||||
|       --with-filesystem \ |  | ||||||
|       --with-system \ |  | ||||||
|       --with-timer \ |  | ||||||
|       address-model=$2 \ |  | ||||||
|       install || exit 1 |  | ||||||
| } |  | ||||||
|  |  | ||||||
| bit="64" |  | ||||||
| toolset="gcc" |  | ||||||
| prefix="$HOME/boost-prefix" |  | ||||||
|  |  | ||||||
| while getopts "b:t:p:" c; do |  | ||||||
|   case "$c" in |  | ||||||
|     b) |  | ||||||
|       bit="$OPTARG" |  | ||||||
|       [ "$bit" != "32" ] && [ "$bit" != "64" ] && [ "$bit" != "both" ] && usage && exit 1 |  | ||||||
|       ;; |  | ||||||
|     t) |  | ||||||
|       toolset="$OPTARG" |  | ||||||
|       [ "$toolset" != "gcc" ] && [ "$toolset" != "clang" ] && [ "$toolset" != "both" ] && usage && exit 1 |  | ||||||
|       ;; |  | ||||||
|     p) |  | ||||||
|       prefix="$OPTARG" |  | ||||||
|       ;; |  | ||||||
|     ?*) |  | ||||||
|       echo "invalid arguments." && exit 1 |  | ||||||
|       ;; |  | ||||||
|   esac |  | ||||||
| done |  | ||||||
|  |  | ||||||
| mkdir $prefix || exit 1 |  | ||||||
| wget https://boostorg.jfrog.io/artifactory/main/release/1.76.0/source/boost_1_76_0.tar.bz2 || exit 1 |  | ||||||
| tar xf boost_1_76_0.tar.bz2 || exit 1 |  | ||||||
| cd boost_1_76_0 |  | ||||||
| ./bootstrap.sh || exit 1 |  | ||||||
|  |  | ||||||
| build() |  | ||||||
| { |  | ||||||
|   if [ "$bit" = "both" ]; then |  | ||||||
|     build_boost $1 32 $prefix |  | ||||||
|     build_boost $1 64 $prefix |  | ||||||
|   else |  | ||||||
|     build_boost $1 $bit $prefix |  | ||||||
|   fi |  | ||||||
| } |  | ||||||
|  |  | ||||||
| if [ "$toolset" = "both" ]; then |  | ||||||
|   build gcc |  | ||||||
|   build clang |  | ||||||
| else |  | ||||||
|   build $toolset |  | ||||||
| fi |  | ||||||
							
								
								
									
										51
									
								
								.github/depends/zlib.sh
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										51
									
								
								.github/depends/zlib.sh
									
									
									
									
										vendored
									
									
								
							| @@ -1,51 +0,0 @@ | |||||||
| #!/bin/bash |  | ||||||
|  |  | ||||||
| usage() |  | ||||||
| { |  | ||||||
|   cat <<EOL |  | ||||||
|   -b   - 32-bit or 64-bit library, maybe 32 or 64 |  | ||||||
|   -p   - installation prefix |  | ||||||
| EOL |  | ||||||
| } |  | ||||||
|  |  | ||||||
| bit="64" |  | ||||||
| prefix="$HOME/zlib-prefix" |  | ||||||
|  |  | ||||||
| while getopts "b:t:p:" c; do |  | ||||||
|   case "$c" in |  | ||||||
|     b) |  | ||||||
|       bit="$OPTARG" |  | ||||||
|       [ "$bit" != "32" ] && [ "$bit" != "64" ] && [ "$bit" != "both" ] && usage && exit 1 |  | ||||||
|       ;; |  | ||||||
|     p) |  | ||||||
|       prefix="$OPTARG" |  | ||||||
|       ;; |  | ||||||
|     ?*) |  | ||||||
|       echo "invalid arguments." && exit 1 |  | ||||||
|       ;; |  | ||||||
|   esac |  | ||||||
| done |  | ||||||
|  |  | ||||||
| mkdir $prefix || exit 1 |  | ||||||
| wget https://zlib.net/zlib-1.2.11.tar.gz || exit 1 |  | ||||||
| tar -xf zlib-1.2.11.tar.gz || exit 1 |  | ||||||
| cd zlib-1.2.11 |  | ||||||
|  |  | ||||||
| build() |  | ||||||
| { |  | ||||||
|   cmake \ |  | ||||||
|     -D CMAKE_BUILD_TYPE=Release \ |  | ||||||
|     -D CMAKE_INSTALL_PREFIX=$2/$1 \ |  | ||||||
|     -D CMAKE_C_FLAGS="-m$1" \ |  | ||||||
|     -D CMAKE_SHARED_LINKER_FLAGS="-m$1" \ |  | ||||||
|     -B build$1 \ |  | ||||||
|     -S . |  | ||||||
|   cmake --build build$1 --target install |  | ||||||
| } |  | ||||||
|  |  | ||||||
| if [ "$bit" = "both" ]; then |  | ||||||
|   build 32 $prefix |  | ||||||
|   build 64 $prefix |  | ||||||
| else |  | ||||||
|   build $bit $prefix |  | ||||||
| fi |  | ||||||
							
								
								
									
										64
									
								
								.github/workflows/coverage.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										64
									
								
								.github/workflows/coverage.yml
									
									
									
									
										vendored
									
									
								
							| @@ -5,63 +5,43 @@ on: | |||||||
|     types: [opened, synchronize] |     types: [opened, synchronize] | ||||||
|   push: |   push: | ||||||
|     branches: |     branches: | ||||||
|     - cpp_master |     - c_master | ||||||
|     tags: |     tags: | ||||||
|     - '*' |     - '*' | ||||||
|  |  | ||||||
| jobs: | jobs: | ||||||
|  |  | ||||||
|   codecov: |   codecov: | ||||||
|     timeout-minutes: 30 |     timeout-minutes: 30 | ||||||
|     runs-on: ubuntu-latest |     runs-on: ubuntu-latest | ||||||
|  |  | ||||||
|     steps: |     steps: | ||||||
|     - uses: actions/checkout@v1 |     - uses: actions/checkout@v1 | ||||||
|     - name: Install build dependencies |     - name: install depends | ||||||
|       run: | |       run: | | ||||||
|         sudo apt-get update |         sudo apt-get update | ||||||
|         sudo apt-get install g++-10 cmake lcov -y |         sudo apt-get install g++-multilib lcov | ||||||
|         ./ci/set_gcc_10.sh |  | ||||||
|  |  | ||||||
|     - name: Cache boost |  | ||||||
|       id: cache-boost |  | ||||||
|       uses: actions/cache@v1 |  | ||||||
|       with: |  | ||||||
|         path: ~/boost-prefix/ |  | ||||||
|         key: ${{ runner.os }}-boost-64-1-76-0-2021-08-09 |  | ||||||
|  |  | ||||||
|     - name: Build boost |  | ||||||
|       if: steps.cache-boost.outputs.cache-hit != 'true' |  | ||||||
|       run: ./.github/depends/boost.sh -b 64 -t gcc -p $HOME/boost-prefix |  | ||||||
|  |  | ||||||
|     - name: Cache zlib |  | ||||||
|       id: cache-zlib |  | ||||||
|       uses: actions/cache@v1 |  | ||||||
|       with: |  | ||||||
|         path: ~/zlib-prefix/ |  | ||||||
|         key: ${{ runner.os }}-zlib-64-1-2-11-2021-08-09 |  | ||||||
|  |  | ||||||
|     - name: Build zlib |  | ||||||
|       if: steps.cache-zlib.outputs.cache-hit != 'true' |  | ||||||
|       run: ./.github/depends/zlib.sh -b 64 -p $HOME/zlib-prefix |  | ||||||
|  |  | ||||||
|     - name: Compile tests |     - name: Compile tests | ||||||
|       run: | |       run: | | ||||||
|         mkdir build |         # install gtest | ||||||
|         cmake \ |         BASE=`pwd` | ||||||
|             -D MSGPACK_CXX20=ON \ |         wget https://github.com/google/googletest/archive/release-1.7.0.zip -O googletest-release-1.7.0.zip | ||||||
|             -D MSGPACK_32BIT=OFF \ |         unzip -q googletest-release-1.7.0.zip | ||||||
|             -D MSGPACK_CHAR_SIGN=signed \ |         cd googletest-release-1.7.0 | ||||||
|             -D MSGPACK_USE_X3_PARSE=ON \ |         g++ -m64 src/gtest-all.cc -I. -Iinclude -c -fPIC | ||||||
|             -D MSGPACK_BUILD_EXAMPLES=ON \ |         g++ -m64 src/gtest_main.cc -I. -Iinclude -c -fPIC | ||||||
|             -D MSGPACK_BUILD_TESTS=ON \ |         ar -rv libgtest.a gtest-all.o | ||||||
|             -D CMAKE_BUILD_TYPE=Debug \ |         ar -rv libgtest_main.a gtest_main.o | ||||||
|             -D MSGPACK_GEN_COVERAGE=ON \ |         mkdir -p ${BASE}/usr/include | ||||||
|             -D CMAKE_PREFIX_PATH="$HOME/zlib-prefix/64;$HOME/boost-prefix/64" \ |         cp -r include/gtest ${BASE}/usr/include | ||||||
|             -B build \ |         mkdir -p ${BASE}/usr/lib | ||||||
|             -S . || exit 1 |         mv *.a ${BASE}/usr/lib | ||||||
|         cmake --build build --target all || exit 1 |         cd .. | ||||||
|         ctest --test-dir build || exit 1 |  | ||||||
|  |  | ||||||
|  |         mkdir build && cd build | ||||||
|  |         CMAKE_LIBRARY_PATH="${BASE}/build" GTEST_ROOT="${BASE}/usr" CMAKE_PREFIX_PATH="${BASE}/usr/gcc/lib64/cmake" cmake -DMSGPACK_32BIT=OFF -DBUILD_SHARED_LIBS=ON -DMSGPACK_CHAR_SIGN=signed -DMSGPACK_BUILD_EXAMPLES=ON -DMSGPACK_BUILD_TESTS=ON -DCMAKE_BUILD_TYPE=Debug -DMSGPACK_GEN_COVERAGE=ON .. | ||||||
|  |         make -j4 | ||||||
|  |         make test | ||||||
|     - name: Upload coverage to Codecov |     - name: Upload coverage to Codecov | ||||||
|       working-directory: build |       working-directory: build | ||||||
|       run: | |       run: | | ||||||
|   | |||||||
							
								
								
									
										365
									
								
								.github/workflows/gha.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										365
									
								
								.github/workflows/gha.yml
									
									
									
									
										vendored
									
									
								
							| @@ -5,232 +5,229 @@ on: | |||||||
|     types: [opened, synchronize] |     types: [opened, synchronize] | ||||||
|   push: |   push: | ||||||
|     branches: |     branches: | ||||||
|     - cpp_master |     - c_master | ||||||
|     tags: |     tags: | ||||||
|     - '*' |     - '*' | ||||||
|  |  | ||||||
| jobs: | jobs: | ||||||
|   macos: |   macos: | ||||||
|     name: ${{ format('macOS (pattern {0})', matrix.pattern) }} |  | ||||||
|     runs-on: macos-latest |     runs-on: macos-latest | ||||||
|     strategy: |     strategy: | ||||||
|       fail-fast: false |       fail-fast: false | ||||||
|       matrix: |       matrix: | ||||||
|         pattern: [0, 1, 2, 3, 4] |         pattern: [0, 1, 2, 3] | ||||||
|     steps: |     steps: | ||||||
|     - uses: actions/checkout@v2 |     - uses: actions/checkout@v1 | ||||||
|  |     - name: build and test | ||||||
|     - name: Cache boost |       env: | ||||||
|       id: cache-boost |         CC: clang | ||||||
|       uses: actions/cache@v2 |         CXX: clang++ | ||||||
|       with: |  | ||||||
|         path: ~/boost-prefix/ |  | ||||||
|         key: ${{ runner.os }}-boost-1-76-0-2021-08-09 |  | ||||||
|  |  | ||||||
|     - name: Build boost |  | ||||||
|       if: steps.cache-boost.outputs.cache-hit != 'true' |  | ||||||
|       run: ./.github/depends/boost.sh -b 64 -t clang -p $HOME/boost-prefix |  | ||||||
|  |  | ||||||
|     - name: Cache zlib |  | ||||||
|       id: cache-zlib |  | ||||||
|       uses: actions/cache@v2 |  | ||||||
|       with: |  | ||||||
|         path: ~/zlib-prefix/ |  | ||||||
|         key: ${{ runner.os }}-zlib-1-2-11-2021-08-09 |  | ||||||
|  |  | ||||||
|     - name: Build zlib |  | ||||||
|       if: steps.cache-zlib.outputs.cache-hit != 'true' |  | ||||||
|       run: ./.github/depends/zlib.sh -b 64 -p $HOME/zlib-prefix |  | ||||||
|  |  | ||||||
|     - name: Build and test |  | ||||||
|       shell: bash |       shell: bash | ||||||
|       run: | |       run: | | ||||||
|         # default configuration - overwrite its params later depending on matrix.pattern |         BASE=`pwd`; | ||||||
|         export MSGPACK_CXX_VERSION="MSGPACK_CXX20=ON" |  | ||||||
|         export ARCH=64 |  | ||||||
|         export API_VERSION=3 |  | ||||||
|         export CHAR_SIGN="signed" |  | ||||||
|         export X3_PARSE="OFF" |  | ||||||
|         export SANITIZE="-fsanitize=undefined -fno-sanitize-recover=all" |  | ||||||
|  |  | ||||||
|         case ${{ matrix.pattern }} in |         # matrix config | ||||||
|           0) |         ACTION="ci/build_cmake.sh" | ||||||
|             export MSGPACK_CXX_VERSION="MSGPACK_CXX11=OFF" |         export ARCH="64" | ||||||
|             ;; |         if [ ${{ matrix.pattern }} == 0 ]; then | ||||||
|           1) |           export SHARED="ON" | ||||||
|             export API_VERSION=1 |           export SAN="-fsanitize=address -fno-omit-frame-pointer" | ||||||
|             ;; |           export CHAR_SIGN="unsigned" | ||||||
|           2) |         fi | ||||||
|             export API_VERSION=2 |         if [ ${{ matrix.pattern }} == 1 ]; then | ||||||
|             ;; |           export SHARED="ON" | ||||||
|           3) |           export SAN="-fsanitize=address -fno-omit-frame-pointer" | ||||||
|             export X3_PARSE="ON" |           export CHAR_SIGN="signed" | ||||||
|             ;; |         fi | ||||||
|           4) |         if [ ${{ matrix.pattern }} == 2 ]; then | ||||||
|             export CHAR_SIGN="unsigned" |           export SHARED="OFF" | ||||||
|             ;; |           export CHAR_SIGN="signed" | ||||||
|         esac |         fi | ||||||
|  |         if [ ${{ matrix.pattern }} == 3 ]; then | ||||||
|  |           export SHARED="OFF" | ||||||
|  |           export CHAR_SIGN="unsigned" | ||||||
|  |         fi | ||||||
|  |  | ||||||
|  |         # install gtest | ||||||
|  |         wget https://github.com/google/googletest/archive/release-1.7.0.zip -O googletest-release-1.7.0.zip | ||||||
|  |         unzip -q googletest-release-1.7.0.zip | ||||||
|  |         cd googletest-release-1.7.0 | ||||||
|  |         $CXX -m${ARCH} src/gtest-all.cc -I. -Iinclude -c | ||||||
|  |         $CXX -m${ARCH} src/gtest_main.cc -I. -Iinclude -c | ||||||
|  |         ar -rv libgtest.a gtest-all.o | ||||||
|  |         ar -rv libgtest_main.a gtest_main.o | ||||||
|  |         mkdir -p ${BASE}/usr/include | ||||||
|  |         cp -r include/gtest ${BASE}/usr/include | ||||||
|  |         mkdir -p ${BASE}/usr/lib | ||||||
|  |         mv *.a ${BASE}/usr/lib | ||||||
|  |         cd .. | ||||||
|  |  | ||||||
|         # build and test |         # build and test | ||||||
|         export CXX="clang++" |         CMAKE_CXX_COMPILER="${CXX}" CMAKE_C_COMPILER="${CC}" GTEST_ROOT="${BASE}/usr" CFLAGS="-Werror -g -fsanitize=undefined  -fno-sanitize-recover=all" CXXFLAGS="-Werror -g -ggdb3 -fsanitize=undefined  -fno-sanitize-recover=all" ${ACTION} | ||||||
|         CMAKE_CXX_COMPILER="$CXX" CXXFLAGS="-Werror -g ${SANITIZE}" ci/build_cmake.sh || exit 1 |  | ||||||
|  |  | ||||||
|         cat Files.cmake| grep ".*\.[h|hpp]" | perl -pe 's/ //g' | sort > tmp1  && find include -name "*.h" -o -name "*.hpp" | sort > tmp2 && diff tmp1 tmp2 |  | ||||||
|  |  | ||||||
|   linux: |   linux: | ||||||
|     name: ${{ format('Linux (pattern {0})', matrix.pattern) }} |     runs-on: ubuntu-18.04 | ||||||
|     runs-on: ubuntu-20.04 |  | ||||||
|     strategy: |     strategy: | ||||||
|       fail-fast: false |       fail-fast: false | ||||||
|       matrix: |       matrix: | ||||||
|         pattern: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] |         pattern: [0, 1, 2, 3, 4, 5, 6, 7, 8] | ||||||
|     steps: |     steps: | ||||||
|     - uses: actions/checkout@v2 |     - uses: actions/checkout@v1 | ||||||
|  |     - name: install build depends | ||||||
|     - name: Install build dependencies |  | ||||||
|       shell: bash |  | ||||||
|       run: | |       run: | | ||||||
|         sudo apt-get update |         sudo apt-get update | ||||||
|         sudo apt-get install g++-10 cmake valgrind -y |         sudo apt-get install g++-multilib clang-8 valgrind | ||||||
|         sudo apt-get install g++-10-multilib -y  # for 32-bit compile |     - name: build and test | ||||||
|         ./ci/set_gcc_10.sh |  | ||||||
|  |  | ||||||
|     - name: Cache boost |  | ||||||
|       id: cache-boost |  | ||||||
|       uses: actions/cache@v2 |  | ||||||
|       with: |  | ||||||
|         path: ~/boost-prefix/ |  | ||||||
|         key: ${{ runner.os }}-boost-1-76-0-2021-08-09 |  | ||||||
|  |  | ||||||
|     - name: Build boost |  | ||||||
|       if: steps.cache-boost.outputs.cache-hit != 'true' |  | ||||||
|       run: ./.github/depends/boost.sh -b both -t gcc -p $HOME/boost-prefix |  | ||||||
|  |  | ||||||
|     - name: Cache zlib |  | ||||||
|       id: cache-zlib |  | ||||||
|       uses: actions/cache@v2 |  | ||||||
|       with: |  | ||||||
|         path: ~/zlib-prefix/ |  | ||||||
|         key: ${{ runner.os }}-zlib-1-2-11-2021-08-09 |  | ||||||
|  |  | ||||||
|     - name: Build zlib |  | ||||||
|       if: steps.cache-zlib.outputs.cache-hit != 'true' |  | ||||||
|       run: ./.github/depends/zlib.sh -b both -p $HOME/zlib-prefix |  | ||||||
|  |  | ||||||
|     - name: Build and test |  | ||||||
|       shell: bash |       shell: bash | ||||||
|       run: | |       run: | | ||||||
|         # default configuration - overwrite its params later depending on matrix.pattern |         BASE=`pwd`; | ||||||
|         export MSGPACK_CXX_VERSION="MSGPACK_CXX20=ON" |  | ||||||
|         export ARCH=64 |  | ||||||
|         export API_VERSION=3 |  | ||||||
|         export CHAR_SIGN="signed" |  | ||||||
|         export X3_PARSE="OFF" |  | ||||||
|         export SANITIZE="-fsanitize=undefined -fno-sanitize-recover=all" |  | ||||||
|         export ACTION="ci/build_cmake.sh" |  | ||||||
|  |  | ||||||
|         case ${{ matrix.pattern }} in |         # matrix config | ||||||
|           0) |         if [ ${{ matrix.pattern }} == 0 ]; then | ||||||
|             export CXX="clang++-10" |           export CC=clang | ||||||
|             export MSGPACK_CXX_VERSION="MSGPACK_CXX11=OFF" |           export CXX=clang++ | ||||||
|             ;; |           ACTION="ci/build_cmake.sh" | ||||||
|           1) |           export ARCH="64" | ||||||
|             export CXX="g++-10" |           export SHARED="ON" | ||||||
|             export MSGPACK_CXX_VERSION="MSGPACK_CXX11=ON" |           export SAN="-fsanitize=address -fno-omit-frame-pointer" | ||||||
|             ;; |           export CHAR_SIGN="unsigned" | ||||||
|           2) |         fi | ||||||
|             export CXX="clang++-10" |         if [ ${{ matrix.pattern }} == 1 ]; then | ||||||
|             export MSGPACK_CXX_VERSION="MSGPACK_CXX14=ON" |           export CC=clang | ||||||
|             ;; |           export CXX=clang++ | ||||||
|           3) |           ACTION="ci/build_cmake.sh" | ||||||
|             export CXX="g++-10" |           export ARCH="32" | ||||||
|             export MSGPACK_CXX_VERSION="MSGPACK_CXX17=ON" |           export SHARED="ON" | ||||||
|             ;; |           export SAN="-fsanitize=address -fno-omit-frame-pointer" | ||||||
|           4) |           export CHAR_SIGN="signed" | ||||||
|             export CXX="clang++-10" |         fi | ||||||
|             export MSGPACK_CXX_VERSION="MSGPACK_CXX20=ON" |         if [ ${{ matrix.pattern }} == 2 ]; then | ||||||
|             ;; |           export CC=clang | ||||||
|           5) |           export CXX=clang++ | ||||||
|             export CXX="g++-10" |           ACTION="ci/build_cmake.sh" | ||||||
|             export ARCH=32 |           export ARCH="64" | ||||||
|             ;; |           export SHARED="ON" | ||||||
|           6) |           export SAN="-fsanitize=address -fno-omit-frame-pointer" | ||||||
|             export CXX="clang++-10" |           export CHAR_SIGN="signed" | ||||||
|             export API_VERSION=2 |         fi | ||||||
|             ;; |         if [ ${{ matrix.pattern }} == 3 ]; then | ||||||
|           7) |           export CC=clang | ||||||
|             export CXX="g++-10" |           export CXX=clang++ | ||||||
|             export API_VERSION=1 |           ACTION="ci/build_cmake.sh" | ||||||
|             ;; |           export ARCH="32" | ||||||
|           8) |           export SHARED="OFF" | ||||||
|             export CXX="clang++-10" |           export CHAR_SIGN="unsigned" | ||||||
|             export CHAR_SIGN="unsigned" |         fi | ||||||
|             ;; |         if [ ${{ matrix.pattern }} == 4 ]; then | ||||||
|           9) |           export CC=gcc | ||||||
|             export CXX="g++-10" |           export CXX=g++ | ||||||
|             export X3_PARSE="ON" |           ACTION="ci/build_cmake.sh" | ||||||
|             ;; |           export ARCH="64" | ||||||
|           10) |           export SHARED="ON" | ||||||
|             export CXX="clang++-10" |           export SAN="-fsanitize=address -fno-omit-frame-pointer" | ||||||
|             export ACTION="ci/build_regression.sh" |           export CHAR_SIGN="signed" | ||||||
|             ;; |         fi | ||||||
|           11) |         if [ ${{ matrix.pattern }} == 5 ]; then | ||||||
|             export CXX="g++-10" |           export CC=gcc | ||||||
|             export ARCH=32 |           export CXX=g++ | ||||||
|             export CHAR_SIGN="unsigned" |           ACTION="ci/build_cmake.sh" | ||||||
|             export X3_PARSE="ON" |           export ARCH="32" | ||||||
|             ;; |           export SHARED="ON" | ||||||
|         esac |           export SAN="-fsanitize=address -fno-omit-frame-pointer" | ||||||
|  |           export CHAR_SIGN="unsigned" | ||||||
|  |         fi | ||||||
|  |         if [ ${{ matrix.pattern }} == 6 ]; then | ||||||
|  |           export CC=gcc | ||||||
|  |           export CXX=g++ | ||||||
|  |           ACTION="ci/build_cmake.sh" | ||||||
|  |           export ARCH="64" | ||||||
|  |           export SHARED="ON" | ||||||
|  |           export SAN="-fsanitize=address -fno-omit-frame-pointer" | ||||||
|  |           export CHAR_SIGN="unsigned" | ||||||
|  |         fi | ||||||
|  |         if [ ${{ matrix.pattern }} == 7 ]; then | ||||||
|  |           export CC=gcc | ||||||
|  |           export CXX=g++ | ||||||
|  |           ACTION="ci/build_cmake.sh" | ||||||
|  |           export ARCH="32" | ||||||
|  |           export SHARED="OFF" | ||||||
|  |           export CHAR_SIGN="signed" | ||||||
|  |         fi | ||||||
|  |         if [ ${{ matrix.pattern }} == 8 ]; then | ||||||
|  |           export CC=gcc | ||||||
|  |           export CXX=g++ | ||||||
|  |           ACTION="ci/build_cmake_embedded.sh" | ||||||
|  |           export ARCH="64" | ||||||
|  |         fi | ||||||
|  |  | ||||||
|  |         # install gtest | ||||||
|  |         wget https://github.com/google/googletest/archive/release-1.7.0.zip -O googletest-release-1.7.0.zip | ||||||
|  |         unzip -q googletest-release-1.7.0.zip | ||||||
|  |         cd googletest-release-1.7.0 | ||||||
|  |         $CXX -m${ARCH} src/gtest-all.cc -I. -Iinclude -c -fPIC | ||||||
|  |         $CXX -m${ARCH} src/gtest_main.cc -I. -Iinclude -c -fPIC | ||||||
|  |         ar -rv libgtest.a gtest-all.o | ||||||
|  |         ar -rv libgtest_main.a gtest_main.o | ||||||
|  |         mkdir -p ${BASE}/usr/include | ||||||
|  |         cp -r include/gtest ${BASE}/usr/include | ||||||
|  |         mkdir -p ${BASE}/usr/lib | ||||||
|  |         mv *.a ${BASE}/usr/lib | ||||||
|  |         cd .. | ||||||
|  |  | ||||||
|  |         # install zlib | ||||||
|  |         if [ ${ARCH} == 32 ]; then | ||||||
|  |           sudo apt-get install lib32z1-dev | ||||||
|  |         fi | ||||||
|  |  | ||||||
|         # build and test |         # build and test | ||||||
|         CMAKE_CXX_COMPILER="$CXX" CXXFLAGS="-Werror -g ${SANITIZE}" ci/build_cmake.sh || exit 1 |         CMAKE_CXX_COMPILER="${CXX}" CMAKE_C_COMPILER="${CC}" GTEST_ROOT="${BASE}/usr" CFLAGS="-Werror -g -fsanitize=undefined  -fno-sanitize-recover=all" CXXFLAGS="-Werror -g -ggdb3 -fsanitize=undefined  -fno-sanitize-recover=all" ${ACTION} | ||||||
|         cat Files.cmake| grep ".*\.[h|hpp]" | perl -pe 's/ //g' | sort > tmp1  && find include -name "*.h" -o -name "*.hpp" | sort > tmp2 && diff tmp1 tmp2 |  | ||||||
|  |  | ||||||
|   windows: |   windows: | ||||||
|     name: ${{ format('Windows cxx{0}', matrix.cxx) }} |  | ||||||
|     runs-on: windows-2019 |     runs-on: windows-2019 | ||||||
|     strategy: |     strategy: | ||||||
|       fail-fast: false |       fail-fast: false | ||||||
|       matrix: |       matrix: | ||||||
|         # MSVC2019 only supports /std:c++14, /std:c++17 and /std:c++latest |         pattern: [0, 1, 2, 3] | ||||||
|         cxx: [14, 17, 20] |  | ||||||
|     steps: |     steps: | ||||||
|     - uses: actions/checkout@v2 |     - uses: actions/checkout@v2.0.0 | ||||||
|  |     - name: Cache vcpkg | ||||||
|     - name: Cache vcpkg dependencies |  | ||||||
|       id: cache-vcpkg |       id: cache-vcpkg | ||||||
|       uses: actions/cache@v2 |       uses: actions/cache@v1.1.2 | ||||||
|       with: |       with: | ||||||
|         path: C:/vcpkg/installed/x64-windows |         path: C:/vcpkg/installed | ||||||
|         key: ${{ runner.os }}-vcpkg-2021-08-09 |         key: windows-2019-vcpkg-v2 | ||||||
|  |     - name: Build dependencies | ||||||
|     - name: Install vcpkg dependencies |  | ||||||
|       if: steps.cache-vcpkg.outputs.cache-hit != 'true' |       if: steps.cache-vcpkg.outputs.cache-hit != 'true' | ||||||
|       shell: powershell |       shell: powershell | ||||||
|       run: | |       run: | | ||||||
|         vcpkg update |         vcpkg install gtest:x64-windows gtest:x86-windows | ||||||
|         vcpkg install zlib:x64-windows |         vcpkg install zlib:x64-windows zlib:x86-windows | ||||||
|         vcpkg install boost:x64-windows |  | ||||||
|  |  | ||||||
|     - name: Build and test |     - name: Build and test | ||||||
|       shell: powershell |       shell: powershell | ||||||
|       run: | |       run: | | ||||||
|         $CPPVER="MSGPACK_CXX${{ matrix.cxx }}=ON" |         if (${{ matrix.pattern }} -eq 0) { | ||||||
|  |           $ARCH="x64" | ||||||
|  |           $SHARED="ON" | ||||||
|  |         } | ||||||
|  |         elseif (${{ matrix.pattern }} -eq 1) { | ||||||
|  |           $ARCH="x64" | ||||||
|  |           $SHARED="OFF" | ||||||
|  |         } | ||||||
|  |         elseif (${{ matrix.pattern }} -eq 2) { | ||||||
|  |           $ARCH="Win32" | ||||||
|  |           $SHARED="ON" | ||||||
|  |         } | ||||||
|  |         else { | ||||||
|  |           $ARCH="Win32" | ||||||
|  |           $SHARED="OFF" | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         $CUR=(Get-Location).Path | ||||||
|         md build |         md build | ||||||
|         cmake ` |         cd build | ||||||
|             -A x64 ` |         cmake -A $ARCH -DBUILD_SHARED_LIBS=$SHARED -DCMAKE_TOOLCHAIN_FILE="C:/vcpkg/scripts/buildsystems/vcpkg.cmake" "-DCMAKE_CXX_FLAGS=/D_VARIADIC_MAX=10 /EHsc /D_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING" .. | ||||||
|             -G "Visual Studio 16 2019" ` |         cmake --build . --config Release | ||||||
|             -D CMAKE_TOOLCHAIN_FILE="C:/vcpkg/scripts/buildsystems/vcpkg.cmake" ` |         $pathbak="$env:PATH" | ||||||
|             -D MSGPACK_BUILD_TESTS=ON ` |         $env:PATH="C:\vcpkg\installed\x64-windows\bin;$CUR\build\Release;$pathbak" | ||||||
|             -D $CPPVER ` |         ctest -V | ||||||
|             -D CMAKE_CXX_FLAGS="/D_VARIADIC_MAX=10 /EHsc /D_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING /D_SILENCE_CXX17_ALLOCATOR_VOID_DEPRECATION_WARNING /D_SILENCE_CXX17_OLD_ALLOCATOR_MEMBERS_DEPRECATION_WARNING /W3 /WX" ` |         $env:PATH=$pathbak | ||||||
|             -B build ` |  | ||||||
|             -S . |  | ||||||
|         if ($LastExitCode -ne 0) { exit $LastExitCode } |  | ||||||
|  |  | ||||||
|         cmake --build build --config Release |  | ||||||
|         if ($LastExitCode -ne 0) { exit $LastExitCode } |  | ||||||
|  |  | ||||||
|         ctest -VV --test-dir build -C Release |  | ||||||
|         if ($LastExitCode -ne 0) { exit $LastExitCode } |  | ||||||
|   | |||||||
							
								
								
									
										34
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										34
									
								
								CHANGELOG.md
									
									
									
									
									
								
							| @@ -1,23 +1,19 @@ | |||||||
| # 2021-08-30 version 4.0.1 for C++ | # 2023-01-10 version 5.0.0 | ||||||
|   * Fix release tarball and its generation script (#967) |   * Add additional address sanitizer for CI. (#1023) | ||||||
|  |  | ||||||
| # 2021-08-29 version 4.0.0 for C++ |  | ||||||
|   * Improve zone alignment logic (#965) |  | ||||||
|   * Fix v1 unpack logic for STR and BIN (#957, #951) |  | ||||||
|   * Fix UB on memcmp with size 0 (#954) |  | ||||||
|   * Fix `iovec` name conflict (#952) |  | ||||||
|   * Add `std::array<std::byte>` `std::span<char>` `std::span<unsigned char>` `std::span<std::byte>` adaptors (#951) |  | ||||||
|   * Improve documents (#918, #919, #951) |  | ||||||
|   * Improve tests (#916) |  | ||||||
|   * Introduce BOOST_ASSERT (#898) |  | ||||||
|   * Improve build system (#897, #905, #924, #951) |  | ||||||
|   * Improve Boost.Fusion support (#894) |  | ||||||
|   * Check nullptr before call memcpy (#891) |  | ||||||
|   * Refine and bugfix `std::chrono::time_point` adaptor (#888, #893) |  | ||||||
|   * Improve CI (#884, #892, #895, #951, #955) |  | ||||||
| ## << breaking changes >> | ## << breaking changes >> | ||||||
|   * Separate C++ part of the msgpack-c  from C/C++ mixed msgpack-c (#876, #878) |   * Change CMake package name of C library to msgpackc (#1044, #1049) | ||||||
|   * Require boost libraries. See README.md Dependency(#912) |  | ||||||
|  | # 2021-08-01 version 4.0.0 | ||||||
|  |   * Fix and improve alignment logic (#962) | ||||||
|  |   * Fix iovec name conflict (#953) | ||||||
|  |   * Fix empty string print (#942) | ||||||
|  |   * Fix buffer ptr size (#899) | ||||||
|  |   * Fix UB. Check null pointer before using memcpy() (#890) | ||||||
|  |   * Improve CI environment (#885, #899) | ||||||
|  |  | ||||||
|  | ## << breaking changes >> | ||||||
|  | * Separate C part of the msgpack-c from C/C++ mixed msgpack-c (#876, #878) | ||||||
|  |  | ||||||
|  |  | ||||||
| # 2020-06-05 version 3.3.0 | # 2020-06-05 version 3.3.0 | ||||||
|   * Add json example for C (#870) |   * Add json example for C (#870) | ||||||
|   | |||||||
							
								
								
									
										380
									
								
								CMakeLists.txt
									
									
									
									
									
								
							
							
						
						
									
										380
									
								
								CMakeLists.txt
									
									
									
									
									
								
							| @@ -1,10 +1,13 @@ | |||||||
| CMAKE_MINIMUM_REQUIRED (VERSION 3.1 FATAL_ERROR) | CMAKE_MINIMUM_REQUIRED (VERSION 2.8.12) | ||||||
|  |  | ||||||
| CMAKE_POLICY (SET CMP0054 NEW) | IF ((CMAKE_VERSION VERSION_GREATER 3.1) OR | ||||||
|  |     (CMAKE_VERSION VERSION_EQUAL 3.1)) | ||||||
|  |     CMAKE_POLICY(SET CMP0054 NEW) | ||||||
|  | ENDIF () | ||||||
|  |  | ||||||
| PROJECT (msgpack LANGUAGES CXX) | PROJECT (msgpackc) | ||||||
|  |  | ||||||
| FILE (READ ${CMAKE_CURRENT_SOURCE_DIR}/include/msgpack/version_master.hpp contents) | FILE (READ ${CMAKE_CURRENT_SOURCE_DIR}/include/msgpack/version_master.h contents) | ||||||
| STRING (REGEX MATCH "#define MSGPACK_VERSION_MAJOR *([0-9a-zA-Z_]*)" NULL_OUT ${contents}) | STRING (REGEX MATCH "#define MSGPACK_VERSION_MAJOR *([0-9a-zA-Z_]*)" NULL_OUT ${contents}) | ||||||
| SET (VERSION_MAJOR ${CMAKE_MATCH_1}) | SET (VERSION_MAJOR ${CMAKE_MATCH_1}) | ||||||
| STRING (REGEX MATCH "#define MSGPACK_VERSION_MINOR *([0-9a-zA-Z_]*)" NULL_OUT ${contents}) | STRING (REGEX MATCH "#define MSGPACK_VERSION_MINOR *([0-9a-zA-Z_]*)" NULL_OUT ${contents}) | ||||||
| @@ -14,208 +17,317 @@ SET (VERSION_REVISION ${CMAKE_MATCH_1}) | |||||||
| SET (VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION}) | SET (VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION}) | ||||||
|  |  | ||||||
| LIST (APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake/") | LIST (APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake/") | ||||||
| SET (GNUCXX_STD_SUPPORT_VERSION "4.3") | SET (prefix ${CMAKE_INSTALL_PREFIX}) | ||||||
|  | SET (exec_prefix "\${prefix}") | ||||||
|  | SET (libdir "\${exec_prefix}/lib") | ||||||
|  | SET (includedir "\${prefix}/include") | ||||||
|  |  | ||||||
| OPTION (MSGPACK_CXX11 "Using c++11 compiler" OFF) | OPTION (MSGPACK_32BIT "32bit compile" OFF) | ||||||
| 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) | INCLUDE(TestBigEndian) | ||||||
| OPTION (MSGPACK_USE_X3_PARSE    "Use Boost X3 parse"        OFF) | TEST_BIG_ENDIAN(BIGENDIAN) | ||||||
| OPTION (MSGPACK_BUILD_TESTS     "Build tests"               OFF) | IF (BIGENDIAN) | ||||||
| OPTION (MSGPACK_FUZZ_REGRESSION "Enable regression testing" OFF) |     SET(MSGPACK_ENDIAN_BIG_BYTE 1) | ||||||
| OPTION (MSGPACK_BUILD_EXAMPLES  "Build msgpack examples"    OFF) |     SET(MSGPACK_ENDIAN_LITTLE_BYTE 0) | ||||||
| OPTION (MSGPACK_GEN_COVERAGE    "Generate coverage report"  OFF) | ELSE () | ||||||
|  |     SET(MSGPACK_ENDIAN_BIG_BYTE 0) | ||||||
| SET (CMAKE_CXX_STANDARD_REQUIRED ON) | 	SET(MSGPACK_ENDIAN_LITTLE_BYTE 1) | ||||||
|  |  | ||||||
| IF (MSGPACK_USE_X3_PARSE) |  | ||||||
|     IF (NOT (MSGPACK_CXX14 OR MSGPACK_CXX17 OR MSGPACK_CXX20)) |  | ||||||
|         MESSAGE (FATAL_ERROR "MSGPACK_USE_X3_PARSE requires MSGPACK_CXX14 or newer") |  | ||||||
|     ENDIF () |  | ||||||
|     SET (CMAKE_CXX_FLAGS "-DMSGPACK_USE_X3_PARSE ${CMAKE_CXX_FLAGS}") |  | ||||||
| ENDIF () | ENDIF () | ||||||
|  |  | ||||||
| IF (MSGPACK_CXX20) | CONFIGURE_FILE ( | ||||||
|     SET (CMAKE_CXX_STANDARD 20) |     cmake/sysdep.h.in | ||||||
| ELSEIF (MSGPACK_CXX17) |     include/msgpack/sysdep.h | ||||||
|     SET (CMAKE_CXX_STANDARD 17) |     @ONLY | ||||||
| ELSEIF (MSGPACK_CXX14) | ) | ||||||
|     SET (CMAKE_CXX_STANDARD 14) |  | ||||||
| ELSEIF (MSGPACK_CXX11) | CONFIGURE_FILE ( | ||||||
|     SET (CMAKE_CXX_STANDARD 11) |     cmake/pack_template.h.in | ||||||
| ELSE () |     include/msgpack/pack_template.h | ||||||
|     SET (CMAKE_CXX_STANDARD 98) |     @ONLY | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | IF (APPLE) | ||||||
|  |     SET(CMAKE_MACOSX_RPATH ON) | ||||||
|  |     SET(CMAKE_SKIP_BUILD_RPATH FALSE) | ||||||
|  |     SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) | ||||||
|  |     SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib") | ||||||
|  |     SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) | ||||||
|  |     LIST(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/lib" isSystemDir) | ||||||
|  |     IF ("${isSystemDir}" STREQUAL "-1") | ||||||
|  |         SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib") | ||||||
|  |     ENDIF () | ||||||
| ENDIF () | ENDIF () | ||||||
|  |  | ||||||
| IF (MSGPACK_32BIT) | IF (MSGPACK_32BIT) | ||||||
|     IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") |    IF ("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU") | ||||||
|         SET (CMAKE_CXX_FLAGS "-m32 ${CMAKE_CXX_FLAGS}") |       SET (CMAKE_C_FLAGS "-m32 ${CMAKE_C_FLAGS}") | ||||||
|         SET (CMAKE_EXE_LINKER_FLAGS "-m32 ${CMAKE_EXE_LINKER_FLAGS}") |       SET (CMAKE_EXE_LINKER_FLAGS "-m32 ${CMAKE_EXE_LINKER_FLAGS}") | ||||||
|     ELSEIF ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") |    ELSEIF ("${CMAKE_C_COMPILER_ID}" STREQUAL "Clang") | ||||||
|         SET (CMAKE_CXX_FLAGS "-m32 ${CMAKE_CXX_FLAGS}") |       SET (CMAKE_C_FLAGS "-m32 ${CMAKE_C_FLAGS}") | ||||||
|         SET (CMAKE_EXE_LINKER_FLAGS "-m32 ${CMAKE_EXE_LINKER_FLAGS}") |       SET (CMAKE_EXE_LINKER_FLAGS "-m32 ${CMAKE_EXE_LINKER_FLAGS}") | ||||||
|     ENDIF () |    ENDIF () | ||||||
| ENDIF () | ENDIF () | ||||||
|  |  | ||||||
| SET (Boost_USE_MULTITHREADED      ON) | OPTION (MSGPACK_BUILD_EXAMPLES "Build msgpack examples." ON) | ||||||
| SET (Boost_USE_STATIC_RUNTIME    OFF) |  | ||||||
|  |  | ||||||
| IF (MSGPACK_CHAR_SIGN) | IF (MSGPACK_CHAR_SIGN) | ||||||
|     SET (CMAKE_CXX_FLAGS "-f${MSGPACK_CHAR_SIGN}-char ${CMAKE_CXX_FLAGS}") |    SET (CMAKE_C_FLAGS "-f${MSGPACK_CHAR_SIGN}-char ${CMAKE_C_FLAGS}") | ||||||
| ENDIF () | ENDIF () | ||||||
|  |  | ||||||
| IF (MSGPACK_DEFAULT_API_VERSION) | FIND_PACKAGE (GTest) | ||||||
|     SET (CMAKE_CXX_FLAGS "-DMSGPACK_DEFAULT_API_VERSION=${MSGPACK_DEFAULT_API_VERSION} ${CMAKE_CXX_FLAGS}") | FIND_PACKAGE (ZLIB) | ||||||
| ELSE () | FIND_PACKAGE (Threads) | ||||||
|     SET (CMAKE_CXX_FLAGS "-DMSGPACK_DEFAULT_API_VERSION=3 ${CMAKE_CXX_FLAGS}") | IF (GTEST_FOUND AND ZLIB_FOUND AND THREADS_FOUND) | ||||||
|  |     OPTION (MSGPACK_BUILD_TESTS "Build msgpack tests." ON) | ||||||
|  |     OPTION (MSGPACK_GEN_COVERAGE "Enable running gcov to get a test coverage report." OFF) | ||||||
| ENDIF () | ENDIF () | ||||||
|  |  | ||||||
| IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") | IF (DEFINED BUILD_SHARED_LIBS) | ||||||
|     IF (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.1) |     IF (BUILD_SHARED_LIBS) | ||||||
|         INCLUDE (CheckCXXSourceCompiles) |         IF (DEFINED MSGPACK_ENABLE_SHARED AND NOT MSGPACK_ENABLE_SHARED) | ||||||
|         CHECK_CXX_SOURCE_COMPILES (" |             MESSAGE(WARNING "MSGPACK_ENABLE_SHARED is overridden to ON by BUILD_SHARED_LIBS") | ||||||
| #include <bits/atomicity.h> |         ENDIF () | ||||||
| int atomic_sub(int i) { return __gnu_cxx::__exchange_and_add(&i, -1) - 1; } |         SET (MSGPACK_ENABLE_SHARED ON) | ||||||
| int atomic_add(int i) { return __gnu_cxx::__exchange_and_add(&i, 1) + 1; } |         IF (DEFINED MSGPACK_ENABLE_STATIC AND MSGPACK_ENABLE_STATIC) | ||||||
| int main(int argc, char * argv[]) |             MESSAGE(WARNING "MSGPACK_ENABLE_STATIC is overridden to OFF by BUILD_SHARED_LIBS") | ||||||
| { |         ENDIF () | ||||||
|     atomic_sub(1); |         SET (MSGPACK_ENABLE_STATIC OFF) | ||||||
|     atomic_add(1); |     ELSE () | ||||||
| } |         IF (DEFINED MSGPACK_ENABLE_SHARED AND MSGPACK_ENABLE_SHARED) | ||||||
| " |             MESSAGE(WARNING "MSGPACK_ENABLE_SHARED is overridden to OFF by BUILD_SHARED_LIBS") | ||||||
|         MSGPACK_ENABLE_GCC_CXX_ATOMIC) |         ENDIF () | ||||||
|  |         SET (MSGPACK_ENABLE_SHARED OFF) | ||||||
|  |         IF (DEFINED MSGPACK_ENABLE_STATIC AND NOT MSGPACK_ENABLE_STATIC) | ||||||
|  |             MESSAGE(WARNING "MSGPACK_ENABLE_STATIC is overridden to ON by BUILD_SHARED_LIBS") | ||||||
|  |         ENDIF () | ||||||
|  |         SET (MSGPACK_ENABLE_STATIC ON) | ||||||
|     ENDIF () |     ENDIF () | ||||||
|  | ELSE () | ||||||
|  |     IF (NOT DEFINED MSGPACK_ENABLE_SHARED) | ||||||
|  |         SET (MSGPACK_ENABLE_SHARED ON) | ||||||
|  |     ENDIF () | ||||||
|  |     IF (NOT DEFINED MSGPACK_ENABLE_STATIC) | ||||||
|  |         SET (MSGPACK_ENABLE_STATIC ON) | ||||||
|  |     ENDIF () | ||||||
|  |     SET (BUILD_SHARED_LIBS ${MSGPACK_ENABLE_SHARED}) | ||||||
| ENDIF () | ENDIF () | ||||||
|  |  | ||||||
| FIND_PACKAGE (Boost REQUIRED) |  | ||||||
|  |  | ||||||
| INCLUDE (Files.cmake) | INCLUDE (Files.cmake) | ||||||
|  |  | ||||||
| ADD_LIBRARY (msgpackc-cxx INTERFACE) | CONFIGURE_FILE ( | ||||||
|  |     msgpack.pc.in | ||||||
| TARGET_INCLUDE_DIRECTORIES (msgpackc-cxx |     msgpack.pc | ||||||
|     INTERFACE |     @ONLY | ||||||
|         $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> |  | ||||||
|         $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include> |  | ||||||
|         $<INSTALL_INTERFACE:include> |  | ||||||
| ) | ) | ||||||
|  |  | ||||||
| TARGET_LINK_LIBRARIES (msgpackc-cxx INTERFACE Boost::boost) | IF (MSGPACK_ENABLE_SHARED OR MSGPACK_ENABLE_STATIC) | ||||||
|  |     ADD_LIBRARY (msgpackc | ||||||
|  |         ${msgpackc_SOURCES} | ||||||
|  |         ${msgpackc_HEADERS} | ||||||
|  |     ) | ||||||
|  |  | ||||||
|  |     SET_TARGET_PROPERTIES (msgpackc PROPERTIES SOVERSION 2 VERSION 2.0.0) | ||||||
|  |  | ||||||
|  |     TARGET_INCLUDE_DIRECTORIES (msgpackc | ||||||
|  |         PUBLIC | ||||||
|  |             $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> | ||||||
|  |             $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include> | ||||||
|  |             $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include/msgpack> | ||||||
|  |             $<INSTALL_INTERFACE:include> | ||||||
|  |         PRIVATE | ||||||
|  |             ${CMAKE_CURRENT_SOURCE_DIR} | ||||||
|  |     ) | ||||||
|  | ENDIF () | ||||||
|  |  | ||||||
|  |  | ||||||
|  | IF (MSGPACK_ENABLE_SHARED AND MSGPACK_ENABLE_STATIC) | ||||||
|  |     ADD_LIBRARY (msgpackc-static STATIC | ||||||
|  |         ${msgpackc_SOURCES} | ||||||
|  |         ${msgpackc_HEADERS} | ||||||
|  |     ) | ||||||
|  |  | ||||||
|  |     TARGET_INCLUDE_DIRECTORIES (msgpackc-static | ||||||
|  |         PUBLIC | ||||||
|  |             $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> | ||||||
|  |             $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include> | ||||||
|  |             $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include/msgpack> | ||||||
|  |             $<INSTALL_INTERFACE:include> | ||||||
|  |         PRIVATE | ||||||
|  |             ${CMAKE_CURRENT_SOURCE_DIR} | ||||||
|  |     ) | ||||||
|  |  | ||||||
|  |     SET_TARGET_PROPERTIES (msgpackc-static PROPERTIES OUTPUT_NAME "msgpackc") | ||||||
|  |  | ||||||
|  |     IF (MSGPACK_ENABLE_SHARED) | ||||||
|  |         IF (MSVC) | ||||||
|  |             SET_TARGET_PROPERTIES (msgpackc PROPERTIES IMPORT_SUFFIX "_import.lib") | ||||||
|  |         ELSEIF (MINGW) | ||||||
|  |             SET_TARGET_PROPERTIES (msgpackc PROPERTIES IMPORT_SUFFIX ".dll.a") | ||||||
|  |         ENDIF () | ||||||
|  |     ENDIF () | ||||||
|  | ENDIF () | ||||||
|  |  | ||||||
| IF (MSGPACK_GEN_COVERAGE) | IF (MSGPACK_GEN_COVERAGE) | ||||||
|     IF (NOT MSGPACK_BUILD_TESTS) |     IF (NOT MSGPACK_BUILD_TESTS) | ||||||
|         MESSAGE(FATAL_ERROR "Coverage requires -DMSGPACK_BUILD_TESTS=ON") |         MESSAGE(FATAL_ERROR "Coverage requires -DMSGPACK_BUILD_TESTS=ON") | ||||||
|     ENDIF () |     ENDIF () | ||||||
|     STRING (TOUPPER "${CMAKE_BUILD_TYPE}" UPPER_CMAKE_BUILD_TYPE) |     STRING(TOUPPER "${CMAKE_BUILD_TYPE}" UPPER_CMAKE_BUILD_TYPE) | ||||||
|     IF (NOT "${UPPER_CMAKE_BUILD_TYPE}" STREQUAL "DEBUG") |     IF (NOT "${UPPER_CMAKE_BUILD_TYPE}" STREQUAL "DEBUG") | ||||||
|         MESSAGE (FATAL_ERROR "Coverage requires -DCMAKE_BUILD_TYPE=Debug") |         MESSAGE(FATAL_ERROR "Coverage requires -DCMAKE_BUILD_TYPE=Debug") | ||||||
|     ENDIF () |     ENDIF () | ||||||
|  |  | ||||||
|     INCLUDE (CodeCoverage) |     INCLUDE(CodeCoverage) | ||||||
|     SET (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COVERAGE_FLAGS}") |     SET (CMAKE_C_FLAGS   "${CMAKE_C_FLAGS} ${COVERAGE_FLAGS}") | ||||||
|  |  | ||||||
|     SETUP_TARGET_FOR_COVERAGE(coverage make coverage test) |     SETUP_TARGET_FOR_COVERAGE(coverage make coverage test) | ||||||
| ENDIF () | ENDIF () | ||||||
|  |  | ||||||
| IF (MSGPACK_BUILD_TESTS) | IF (MSGPACK_BUILD_TESTS) | ||||||
|     ENABLE_TESTING () |     ENABLE_TESTING () | ||||||
|  |     list(APPEND CMAKE_CTEST_ARGUMENTS "--output-on-failure") | ||||||
|     # MEMORYCHECK_COMMAND_OPTIONS needs to place prior to CTEST_MEMORYCHECK_COMMAND |     # MEMORYCHECK_COMMAND_OPTIONS needs to place prior to CTEST_MEMORYCHECK_COMMAND | ||||||
|     SET (MEMORYCHECK_COMMAND_OPTIONS "--leak-check=full --show-leak-kinds=definite,possible --error-exitcode=1") |     SET (MEMORYCHECK_COMMAND_OPTIONS "--leak-check=full --show-leak-kinds=definite,possible --error-exitcode=1") | ||||||
|     FIND_PROGRAM (CTEST_MEMORYCHECK_COMMAND NAMES valgrind) |     FIND_PROGRAM(CTEST_MEMORYCHECK_COMMAND NAMES valgrind) | ||||||
|     INCLUDE (Dart) |     INCLUDE(Dart) | ||||||
|     ADD_SUBDIRECTORY (test) |     ADD_SUBDIRECTORY (test) | ||||||
| ENDIF () | ENDIF () | ||||||
|  |  | ||||||
| # enable regression testing | IF ("${CMAKE_C_COMPILER_ID}" STREQUAL "Clang" OR "${CMAKE_C_COMPILER_ID}" STREQUAL "GNU") | ||||||
| IF (MSGPACK_FUZZ_REGRESSION) |     IF (MSGPACK_ENABLE_SHARED OR MSGPACK_ENABLE_STATIC) | ||||||
|     ENABLE_TESTING () |         SET_PROPERTY (TARGET msgpackc APPEND_STRING PROPERTY COMPILE_FLAGS " -Wall -Wextra -DPIC") | ||||||
|     ADD_SUBDIRECTORY (fuzz) |     ENDIF () | ||||||
|  |     IF (MSGPACK_ENABLE_SHARED AND MSGPACK_ENABLE_STATIC) | ||||||
|  |        SET_PROPERTY (TARGET msgpackc-static APPEND_STRING PROPERTY COMPILE_FLAGS " -Wall -Wextra" ) | ||||||
|  |     ENDIF () | ||||||
|  | ENDIF () | ||||||
|  |  | ||||||
|  | IF ("${CMAKE_C_COMPILER_ID}" STREQUAL "Clang") | ||||||
|  |     IF (MSGPACK_ENABLE_SHARED OR MSGPACK_ENABLE_STATIC) | ||||||
|  |         SET_PROPERTY (TARGET msgpackc APPEND_STRING PROPERTY COMPILE_FLAGS " -Wno-mismatched-tags") | ||||||
|  |     ENDIF () | ||||||
|  |     IF (MSGPACK_ENABLE_SHARED AND MSGPACK_ENABLE_STATIC) | ||||||
|  |         SET_PROPERTY (TARGET msgpackc-static APPEND_STRING PROPERTY COMPILE_FLAGS " -Wno-mismatched-tags") | ||||||
|  |     ENDIF () | ||||||
|  | ENDIF () | ||||||
|  |  | ||||||
|  | IF ("${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC") | ||||||
|  |     IF (CMAKE_C_FLAGS MATCHES "/W[0-4]") | ||||||
|  |         STRING(REGEX REPLACE "/W[0-4]" "/W3 /WX" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") | ||||||
|  |     ELSE () | ||||||
|  |         SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W3 /WX") | ||||||
|  |     ENDIF () | ||||||
|  | ENDIF () | ||||||
|  |  | ||||||
|  | IF ("${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC") | ||||||
|  |     IF (CMAKE_C_FLAGS MATCHES "/W[0-4]") | ||||||
|  |         STRING(REGEX REPLACE "/W[0-4]" "/W3 /WX" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") | ||||||
|  |     ELSE () | ||||||
|  |         SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W3 /WX") | ||||||
|  |     ENDIF () | ||||||
|  | ENDIF () | ||||||
|  |  | ||||||
|  | IF ("${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC90" OR "${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC10") | ||||||
|  |     SET_SOURCE_FILES_PROPERTIES(${msgpackc_SOURCES} PROPERTIES LANGUAGE C) | ||||||
| ENDIF () | ENDIF () | ||||||
|  |  | ||||||
| IF ("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "sparc") | IF ("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "sparc") | ||||||
|     SET (CMAKE_CXX_FLAGS "-DMSGPACK_ZONE_ALIGN=8 ${CMAKE_CXX_FLAGS}") |     SET (CMAKE_C_FLAGS   "-DMSGPACK_ZONE_ALIGN=8 ${CMAKE_C_FLAGS}") | ||||||
|  | ENDIF () | ||||||
|  |  | ||||||
|  | IF (NOT DEFINED CMAKE_INSTALL_BINDIR) | ||||||
|  |     SET(CMAKE_INSTALL_BINDIR bin) | ||||||
|  | ENDIF () | ||||||
|  |  | ||||||
|  | IF (NOT DEFINED CMAKE_INSTALL_LIBDIR) | ||||||
|  |     SET(CMAKE_INSTALL_LIBDIR lib) | ||||||
| ENDIF () | ENDIF () | ||||||
|  |  | ||||||
| IF (MSGPACK_BUILD_EXAMPLES) | IF (MSGPACK_BUILD_EXAMPLES) | ||||||
|     ADD_SUBDIRECTORY (example) |     ADD_SUBDIRECTORY (example) | ||||||
| ENDIF () | ENDIF () | ||||||
|  |  | ||||||
|  | IF (MSGPACK_ENABLE_SHARED OR MSGPACK_ENABLE_STATIC) | ||||||
|  |     SET (MSGPACK_INSTALLTARGETS msgpackc) | ||||||
|  | ENDIF () | ||||||
|  |  | ||||||
|  | IF (MSGPACK_ENABLE_SHARED AND MSGPACK_ENABLE_STATIC) | ||||||
|  |     LIST (APPEND MSGPACK_INSTALLTARGETS msgpackc-static) | ||||||
|  | ENDIF () | ||||||
|  |  | ||||||
|  | INSTALL (TARGETS ${MSGPACK_INSTALLTARGETS} EXPORT msgpackc-targets | ||||||
|  |     RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} | ||||||
|  |     LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} | ||||||
|  |     ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} | ||||||
|  | ) | ||||||
|  | FOREACH (file ${msgpackc_common_HEADERS}) | ||||||
|  |     GET_FILENAME_COMPONENT (dir ${file} PATH) | ||||||
|  |     INSTALL (FILES ${file} DESTINATION ${CMAKE_INSTALL_PREFIX}/${dir}) | ||||||
|  | ENDFOREACH () | ||||||
|  | FOREACH (file ${msgpackc_configured_HEADERS}) | ||||||
|  |     GET_FILENAME_COMPONENT (dir ${file} PATH) | ||||||
|  |     INSTALL (FILES ${CMAKE_CURRENT_BINARY_DIR}/${file} DESTINATION ${CMAKE_INSTALL_PREFIX}/${dir}) | ||||||
|  | ENDFOREACH () | ||||||
|  | IF (NOT MSVC) | ||||||
|  |     INSTALL (FILES ${CMAKE_CURRENT_BINARY_DIR}/msgpack.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) | ||||||
|  | ENDIF () | ||||||
|  |  | ||||||
| # Doxygen | # Doxygen | ||||||
| FIND_PACKAGE (Doxygen) | FIND_PACKAGE (Doxygen) | ||||||
| IF (DOXYGEN_FOUND) | IF (DOXYGEN_FOUND) | ||||||
|     LIST (APPEND Doxyfile_cpp_CONTENT |     LIST (APPEND Doxyfile_c_CONTENT | ||||||
|         COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_cpp |         COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_c | ||||||
|         COMMAND ${CMAKE_COMMAND} -E echo "FILE_PATTERNS      = *.hpp" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_cpp |         COMMAND ${CMAKE_COMMAND} -E echo "FILE_PATTERNS      = *.h" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_c | ||||||
|         COMMAND ${CMAKE_COMMAND} -E echo "OUTPUT_DIRECTORY   = doc_cpp" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_cpp |         COMMAND ${CMAKE_COMMAND} -E echo "OUTPUT_DIRECTORY   = doc_c" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_c | ||||||
|         COMMAND ${CMAKE_COMMAND} -E echo "INPUT              = ${CMAKE_CURRENT_SOURCE_DIR}/include" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_cpp |         COMMAND ${CMAKE_COMMAND} -E echo "INPUT              = ${CMAKE_CURRENT_SOURCE_DIR}/include" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_c | ||||||
|         COMMAND ${CMAKE_COMMAND} -E echo "EXTRACT_ALL        = YES" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_cpp |         COMMAND ${CMAKE_COMMAND} -E echo "EXTRACT_ALL        = YES" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_c | ||||||
|         COMMAND ${CMAKE_COMMAND} -E echo "STRIP_FROM_PATH    = ${CMAKE_CURRENT_SOURCE_DIR}/include" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_cpp |         COMMAND ${CMAKE_COMMAND} -E echo "PROJECT_NAME       = \"MessagePack for C\"" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_c | ||||||
|  |         COMMAND ${CMAKE_COMMAND} -E echo "STRIP_FROM_PATH    = ${CMAKE_CURRENT_SOURCE_DIR}/include" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_c | ||||||
|     ) |     ) | ||||||
|     IF (DOXYGEN_DOT_FOUND) |     IF (DOXYGEN_DOT_FOUND) | ||||||
|         LIST (APPEND Doxyfile_cpp_CONTENT |         LIST (APPEND Doxyfile_c_CONTENT | ||||||
|             COMMAND ${CMAKE_COMMAND} -E echo "HAVE_DOT       = YES" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_cpp |             COMMAND ${CMAKE_COMMAND} -E echo "HAVE_DOT       = YES" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_c | ||||||
|         ) |         ) | ||||||
|     ENDIF () |     ENDIF () | ||||||
|     ADD_CUSTOM_TARGET ( |     ADD_CUSTOM_TARGET ( | ||||||
|         doxygen |         doxygen | ||||||
|         ${Doxyfile_cpp_CONTENT} |         ${Doxyfile_c_CONTENT} | ||||||
|         COMMAND ${CMAKE_COMMAND} -E echo "PROJECT_NAME       = \"MessagePack for C++\"" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_cpp |         COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_c | ||||||
|         COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_cpp |  | ||||||
|         VERBATIM |         VERBATIM | ||||||
|     ) |     ) | ||||||
| ENDIF () | ENDIF () | ||||||
|  |  | ||||||
| # Install library. |  | ||||||
| INSTALL (TARGETS msgpackc-cxx |  | ||||||
|          EXPORT msgpackc-cxx-targets |  | ||||||
|          COMPONENT msgpackc-cxx |  | ||||||
|          # This provides include directory in exported target |  | ||||||
|          # relative to prefix in single directory we've put everything in. |  | ||||||
|          INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| # Install headers from source tree. |  | ||||||
| INSTALL (DIRECTORY include/ |  | ||||||
|          DESTINATION include |  | ||||||
|          COMPONENT msgpackc-cxx |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| INCLUDE (CMakePackageConfigHelpers) | INCLUDE (CMakePackageConfigHelpers) | ||||||
|  |  | ||||||
| IF (NOT (CMAKE_VERSION VERSION_LESS 3.14)) | SET (CMAKE_INSTALL_CMAKEDIR "${CMAKE_INSTALL_LIBDIR}/cmake/msgpackc") | ||||||
|     SET (extra_version_file_args ARCH_INDEPENDENT) |  | ||||||
| ENDIF () |  | ||||||
| SET (cmake_config_path "lib/cmake/msgpackc-cxx") |  | ||||||
|  |  | ||||||
| # Configure the main package file from source tree. |  | ||||||
| CONFIGURE_PACKAGE_CONFIG_FILE ( |  | ||||||
|     msgpack-config.cmake.in |  | ||||||
|     "${CMAKE_CURRENT_BINARY_DIR}/msgpack-config.cmake" |  | ||||||
|     INSTALL_DESTINATION "${cmake_config_path}" |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| # Write package version file. |  | ||||||
| WRITE_BASIC_PACKAGE_VERSION_FILE ( | WRITE_BASIC_PACKAGE_VERSION_FILE ( | ||||||
|     msgpack-config-version.cmake |     msgpackc-config-version.cmake | ||||||
|     VERSION ${VERSION} |     VERSION ${VERSION} | ||||||
|     COMPATIBILITY SameMajorVersion |     COMPATIBILITY SameMajorVersion | ||||||
|     ${extra_version_file_args} |  | ||||||
| ) | ) | ||||||
|  |  | ||||||
| # Install the generated package version file and the main package file. | IF (NOT CMAKE_VERSION VERSION_LESS 3.0) | ||||||
| INSTALL (FILES |     EXPORT (EXPORT msgpackc-targets | ||||||
|     "${CMAKE_CURRENT_BINARY_DIR}/msgpack-config.cmake" |         FILE "${CMAKE_CURRENT_BINARY_DIR}/msgpackc-targets.cmake" | ||||||
|     "${CMAKE_CURRENT_BINARY_DIR}/msgpack-config-version.cmake" |     ) | ||||||
|     DESTINATION "${cmake_config_path}" | ENDIF () | ||||||
|     COMPONENT msgpackc-cxx |  | ||||||
|  | CONFIGURE_PACKAGE_CONFIG_FILE (msgpackc-config.cmake.in | ||||||
|  |     msgpackc-config.cmake | ||||||
|  |     INSTALL_DESTINATION "${CMAKE_INSTALL_CMAKEDIR}" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | INSTALL (EXPORT msgpackc-targets | ||||||
|  |     FILE | ||||||
|  |         msgpackc-targets.cmake | ||||||
|  |     DESTINATION | ||||||
|  |         "${CMAKE_INSTALL_CMAKEDIR}" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| # This installs package in install tree for using installed targets. |  | ||||||
| INSTALL ( | INSTALL ( | ||||||
|     EXPORT msgpackc-cxx-targets |     FILES | ||||||
|     FILE msgpackc-cxx-targets.cmake |         "${CMAKE_CURRENT_BINARY_DIR}/msgpackc-config.cmake" | ||||||
|     DESTINATION "${cmake_config_path}" |         "${CMAKE_CURRENT_BINARY_DIR}/msgpackc-config-version.cmake" | ||||||
|     COMPONENT msgpackc-cxx |     DESTINATION | ||||||
|  |         "${CMAKE_INSTALL_CMAKEDIR}" | ||||||
| ) | ) | ||||||
|   | |||||||
							
								
								
									
										361
									
								
								Files.cmake
									
									
									
									
									
								
							
							
						
						
									
										361
									
								
								Files.cmake
									
									
									
									
									
								
							| @@ -1,322 +1,41 @@ | |||||||
| SET (msgpackc_HEADERS | # Source files | ||||||
|     include/msgpack.hpp | SET (msgpackc_SOURCES | ||||||
|     include/msgpack/adaptor/adaptor_base.hpp |     src/objectc.c | ||||||
|     include/msgpack/adaptor/adaptor_base_decl.hpp |     src/unpack.c | ||||||
|     include/msgpack/adaptor/array_ref.hpp |     src/version.c | ||||||
|     include/msgpack/adaptor/array_ref_decl.hpp |     src/vrefbuffer.c | ||||||
|     include/msgpack/adaptor/bool.hpp |     src/zone.c | ||||||
|     include/msgpack/adaptor/boost/fusion.hpp | ) | ||||||
|     include/msgpack/adaptor/boost/msgpack_variant.hpp |  | ||||||
|     include/msgpack/adaptor/boost/msgpack_variant_decl.hpp | # Header files | ||||||
|     include/msgpack/adaptor/boost/optional.hpp | SET (msgpackc_common_HEADERS | ||||||
|     include/msgpack/adaptor/boost/string_ref.hpp |     include/msgpack.h | ||||||
|     include/msgpack/adaptor/boost/string_view.hpp |     include/msgpack/fbuffer.h | ||||||
|     include/msgpack/adaptor/carray.hpp |     include/msgpack/gcc_atomic.h | ||||||
|     include/msgpack/adaptor/char_ptr.hpp |     include/msgpack/object.h | ||||||
|     include/msgpack/adaptor/check_container_size.hpp |     include/msgpack/pack.h | ||||||
|     include/msgpack/adaptor/check_container_size_decl.hpp |     include/msgpack/pack_define.h | ||||||
|     include/msgpack/adaptor/complex.hpp |     include/msgpack/sbuffer.h | ||||||
|     include/msgpack/adaptor/cpp11/array.hpp |     include/msgpack/timestamp.h | ||||||
|     include/msgpack/adaptor/cpp11/array_char.hpp |     include/msgpack/unpack.h | ||||||
|     include/msgpack/adaptor/cpp11/array_unsigned_char.hpp |     include/msgpack/unpack_define.h | ||||||
|     include/msgpack/adaptor/cpp11/chrono.hpp |     include/msgpack/unpack_template.h | ||||||
|     include/msgpack/adaptor/cpp11/forward_list.hpp |     include/msgpack/util.h | ||||||
|     include/msgpack/adaptor/cpp11/reference_wrapper.hpp |     include/msgpack/version.h | ||||||
|     include/msgpack/adaptor/cpp11/shared_ptr.hpp |     include/msgpack/version_master.h | ||||||
|     include/msgpack/adaptor/cpp11/timespec.hpp |     include/msgpack/vrefbuffer.h | ||||||
|     include/msgpack/adaptor/cpp11/tuple.hpp |     include/msgpack/zbuffer.h | ||||||
|     include/msgpack/adaptor/cpp11/unique_ptr.hpp |     include/msgpack/zone.h | ||||||
|     include/msgpack/adaptor/cpp11/unordered_map.hpp | ) | ||||||
|     include/msgpack/adaptor/cpp11/unordered_set.hpp |  | ||||||
|     include/msgpack/adaptor/cpp17/array_byte.hpp | # Header files will configured | ||||||
|     include/msgpack/adaptor/cpp17/byte.hpp | SET (msgpackc_configured_HEADERS | ||||||
|     include/msgpack/adaptor/cpp17/carray_byte.hpp |     include/msgpack/pack_template.h | ||||||
|     include/msgpack/adaptor/cpp17/optional.hpp |     include/msgpack/sysdep.h | ||||||
|     include/msgpack/adaptor/cpp17/string_view.hpp | ) | ||||||
|     include/msgpack/adaptor/cpp17/vector_byte.hpp |  | ||||||
|     include/msgpack/adaptor/cpp20/span.hpp | # All header files | ||||||
|     include/msgpack/adaptor/define.hpp | LIST (APPEND msgpackc_HEADERS | ||||||
|     include/msgpack/adaptor/define_decl.hpp |     ${msgpackc_common_HEADERS} | ||||||
|     include/msgpack/adaptor/deque.hpp |     ${msgpackc_configured_HEADERS} | ||||||
|     include/msgpack/adaptor/ext.hpp |  | ||||||
|     include/msgpack/adaptor/ext_decl.hpp |  | ||||||
|     include/msgpack/adaptor/fixint.hpp |  | ||||||
|     include/msgpack/adaptor/fixint_decl.hpp |  | ||||||
|     include/msgpack/adaptor/float.hpp |  | ||||||
|     include/msgpack/adaptor/int.hpp |  | ||||||
|     include/msgpack/adaptor/int_decl.hpp |  | ||||||
|     include/msgpack/adaptor/list.hpp |  | ||||||
|     include/msgpack/adaptor/map.hpp |  | ||||||
|     include/msgpack/adaptor/map_decl.hpp |  | ||||||
|     include/msgpack/adaptor/msgpack_tuple.hpp |  | ||||||
|     include/msgpack/adaptor/msgpack_tuple_decl.hpp |  | ||||||
|     include/msgpack/adaptor/nil.hpp |  | ||||||
|     include/msgpack/adaptor/nil_decl.hpp |  | ||||||
|     include/msgpack/adaptor/pair.hpp |  | ||||||
|     include/msgpack/adaptor/raw.hpp |  | ||||||
|     include/msgpack/adaptor/raw_decl.hpp |  | ||||||
|     include/msgpack/adaptor/set.hpp |  | ||||||
|     include/msgpack/adaptor/size_equal_only.hpp |  | ||||||
|     include/msgpack/adaptor/size_equal_only_decl.hpp |  | ||||||
|     include/msgpack/adaptor/string.hpp |  | ||||||
|     include/msgpack/adaptor/tr1/unordered_map.hpp |  | ||||||
|     include/msgpack/adaptor/tr1/unordered_set.hpp |  | ||||||
|     include/msgpack/adaptor/v4raw.hpp |  | ||||||
|     include/msgpack/adaptor/v4raw_decl.hpp |  | ||||||
|     include/msgpack/adaptor/vector.hpp |  | ||||||
|     include/msgpack/adaptor/vector_bool.hpp |  | ||||||
|     include/msgpack/adaptor/vector_char.hpp |  | ||||||
|     include/msgpack/adaptor/vector_unsigned_char.hpp |  | ||||||
|     include/msgpack/adaptor/wstring.hpp |  | ||||||
|     include/msgpack/cpp_config.hpp |  | ||||||
|     include/msgpack/cpp_config_decl.hpp |  | ||||||
|     include/msgpack/cpp_version.hpp |  | ||||||
|     include/msgpack/create_object_visitor.hpp |  | ||||||
|     include/msgpack/create_object_visitor_decl.hpp |  | ||||||
|     include/msgpack/fbuffer.hpp |  | ||||||
|     include/msgpack/fbuffer_decl.hpp |  | ||||||
|     include/msgpack/gcc_atomic.hpp |  | ||||||
|     include/msgpack/iterator.hpp |  | ||||||
|     include/msgpack/iterator_decl.hpp |  | ||||||
|     include/msgpack/meta.hpp |  | ||||||
|     include/msgpack/meta_decl.hpp |  | ||||||
|     include/msgpack/null_visitor.hpp |  | ||||||
|     include/msgpack/null_visitor_decl.hpp |  | ||||||
|     include/msgpack/object.hpp |  | ||||||
|     include/msgpack/object_decl.hpp |  | ||||||
|     include/msgpack/object_fwd.hpp |  | ||||||
|     include/msgpack/object_fwd_decl.hpp |  | ||||||
|     include/msgpack/pack.hpp |  | ||||||
|     include/msgpack/pack_decl.hpp |  | ||||||
|     include/msgpack/parse.hpp |  | ||||||
|     include/msgpack/parse_decl.hpp |  | ||||||
|     include/msgpack/parse_return.hpp |  | ||||||
|     include/msgpack/sbuffer.hpp |  | ||||||
|     include/msgpack/sbuffer_decl.hpp |  | ||||||
|     include/msgpack/sysdep.hpp |  | ||||||
|     include/msgpack/type.hpp |  | ||||||
|     include/msgpack/unpack.hpp |  | ||||||
|     include/msgpack/unpack_decl.hpp |  | ||||||
|     include/msgpack/unpack_define.hpp |  | ||||||
|     include/msgpack/unpack_exception.hpp |  | ||||||
|     include/msgpack/v1/adaptor/adaptor_base.hpp |  | ||||||
|     include/msgpack/v1/adaptor/adaptor_base_decl.hpp |  | ||||||
|     include/msgpack/v1/adaptor/array_ref.hpp |  | ||||||
|     include/msgpack/v1/adaptor/array_ref_decl.hpp |  | ||||||
|     include/msgpack/v1/adaptor/bool.hpp |  | ||||||
|     include/msgpack/v1/adaptor/boost/fusion.hpp |  | ||||||
|     include/msgpack/v1/adaptor/boost/msgpack_variant.hpp |  | ||||||
|     include/msgpack/v1/adaptor/boost/msgpack_variant_decl.hpp |  | ||||||
|     include/msgpack/v1/adaptor/boost/optional.hpp |  | ||||||
|     include/msgpack/v1/adaptor/boost/string_ref.hpp |  | ||||||
|     include/msgpack/v1/adaptor/boost/string_view.hpp |  | ||||||
|     include/msgpack/v1/adaptor/carray.hpp |  | ||||||
|     include/msgpack/v1/adaptor/char_ptr.hpp |  | ||||||
|     include/msgpack/v1/adaptor/check_container_size.hpp |  | ||||||
|     include/msgpack/v1/adaptor/check_container_size_decl.hpp |  | ||||||
|     include/msgpack/v1/adaptor/complex.hpp |  | ||||||
|     include/msgpack/v1/adaptor/cpp11/array.hpp |  | ||||||
|     include/msgpack/v1/adaptor/cpp11/array_char.hpp |  | ||||||
|     include/msgpack/v1/adaptor/cpp11/array_unsigned_char.hpp |  | ||||||
|     include/msgpack/v1/adaptor/cpp11/chrono.hpp |  | ||||||
|     include/msgpack/v1/adaptor/cpp11/forward_list.hpp |  | ||||||
|     include/msgpack/v1/adaptor/cpp11/reference_wrapper.hpp |  | ||||||
|     include/msgpack/v1/adaptor/cpp11/shared_ptr.hpp |  | ||||||
|     include/msgpack/v1/adaptor/cpp11/timespec.hpp |  | ||||||
|     include/msgpack/v1/adaptor/cpp11/tuple.hpp |  | ||||||
|     include/msgpack/v1/adaptor/cpp11/unique_ptr.hpp |  | ||||||
|     include/msgpack/v1/adaptor/cpp11/unordered_map.hpp |  | ||||||
|     include/msgpack/v1/adaptor/cpp11/unordered_set.hpp |  | ||||||
|     include/msgpack/v1/adaptor/cpp17/array_byte.hpp |  | ||||||
|     include/msgpack/v1/adaptor/cpp17/byte.hpp |  | ||||||
|     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/vector_byte.hpp |  | ||||||
|     include/msgpack/v1/adaptor/cpp20/span.hpp |  | ||||||
|     include/msgpack/v1/adaptor/define.hpp |  | ||||||
|     include/msgpack/v1/adaptor/define_decl.hpp |  | ||||||
|     include/msgpack/v1/adaptor/deque.hpp |  | ||||||
|     include/msgpack/v1/adaptor/detail/cpp03_define_array.hpp |  | ||||||
|     include/msgpack/v1/adaptor/detail/cpp03_define_array_decl.hpp |  | ||||||
|     include/msgpack/v1/adaptor/detail/cpp03_define_map.hpp |  | ||||||
|     include/msgpack/v1/adaptor/detail/cpp03_define_map_decl.hpp |  | ||||||
|     include/msgpack/v1/adaptor/detail/cpp03_msgpack_tuple.hpp |  | ||||||
|     include/msgpack/v1/adaptor/detail/cpp03_msgpack_tuple_decl.hpp |  | ||||||
|     include/msgpack/v1/adaptor/detail/cpp11_convert_helper.hpp |  | ||||||
|     include/msgpack/v1/adaptor/detail/cpp11_define_array.hpp |  | ||||||
|     include/msgpack/v1/adaptor/detail/cpp11_define_array_decl.hpp |  | ||||||
|     include/msgpack/v1/adaptor/detail/cpp11_define_map.hpp |  | ||||||
|     include/msgpack/v1/adaptor/detail/cpp11_define_map_decl.hpp |  | ||||||
|     include/msgpack/v1/adaptor/detail/cpp11_msgpack_tuple.hpp |  | ||||||
|     include/msgpack/v1/adaptor/detail/cpp11_msgpack_tuple_decl.hpp |  | ||||||
|     include/msgpack/v1/adaptor/ext.hpp |  | ||||||
|     include/msgpack/v1/adaptor/ext_decl.hpp |  | ||||||
|     include/msgpack/v1/adaptor/fixint.hpp |  | ||||||
|     include/msgpack/v1/adaptor/fixint_decl.hpp |  | ||||||
|     include/msgpack/v1/adaptor/float.hpp |  | ||||||
|     include/msgpack/v1/adaptor/int.hpp |  | ||||||
|     include/msgpack/v1/adaptor/int_decl.hpp |  | ||||||
|     include/msgpack/v1/adaptor/list.hpp |  | ||||||
|     include/msgpack/v1/adaptor/map.hpp |  | ||||||
|     include/msgpack/v1/adaptor/map_decl.hpp |  | ||||||
|     include/msgpack/v1/adaptor/msgpack_tuple.hpp |  | ||||||
|     include/msgpack/v1/adaptor/msgpack_tuple_decl.hpp |  | ||||||
|     include/msgpack/v1/adaptor/nil.hpp |  | ||||||
|     include/msgpack/v1/adaptor/nil_decl.hpp |  | ||||||
|     include/msgpack/v1/adaptor/pair.hpp |  | ||||||
|     include/msgpack/v1/adaptor/raw.hpp |  | ||||||
|     include/msgpack/v1/adaptor/raw_decl.hpp |  | ||||||
|     include/msgpack/v1/adaptor/set.hpp |  | ||||||
|     include/msgpack/v1/adaptor/size_equal_only.hpp |  | ||||||
|     include/msgpack/v1/adaptor/size_equal_only_decl.hpp |  | ||||||
|     include/msgpack/v1/adaptor/string.hpp |  | ||||||
|     include/msgpack/v1/adaptor/tr1/unordered_map.hpp |  | ||||||
|     include/msgpack/v1/adaptor/tr1/unordered_set.hpp |  | ||||||
|     include/msgpack/v1/adaptor/v4raw.hpp |  | ||||||
|     include/msgpack/v1/adaptor/v4raw_decl.hpp |  | ||||||
|     include/msgpack/v1/adaptor/vector.hpp |  | ||||||
|     include/msgpack/v1/adaptor/vector_bool.hpp |  | ||||||
|     include/msgpack/v1/adaptor/vector_char.hpp |  | ||||||
|     include/msgpack/v1/adaptor/vector_unsigned_char.hpp |  | ||||||
|     include/msgpack/v1/adaptor/wstring.hpp |  | ||||||
|     include/msgpack/v1/cpp_config.hpp |  | ||||||
|     include/msgpack/v1/cpp_config_decl.hpp |  | ||||||
|     include/msgpack/v1/detail/cpp03_zone.hpp |  | ||||||
|     include/msgpack/v1/detail/cpp03_zone_decl.hpp |  | ||||||
|     include/msgpack/v1/detail/cpp11_zone.hpp |  | ||||||
|     include/msgpack/v1/detail/cpp11_zone_decl.hpp |  | ||||||
|     include/msgpack/v1/fbuffer.hpp |  | ||||||
|     include/msgpack/v1/fbuffer_decl.hpp |  | ||||||
|     include/msgpack/v1/iterator.hpp |  | ||||||
|     include/msgpack/v1/iterator_decl.hpp |  | ||||||
|     include/msgpack/v1/meta.hpp |  | ||||||
|     include/msgpack/v1/meta_decl.hpp |  | ||||||
|     include/msgpack/v1/object.hpp |  | ||||||
|     include/msgpack/v1/object_decl.hpp |  | ||||||
|     include/msgpack/v1/object_fwd.hpp |  | ||||||
|     include/msgpack/v1/object_fwd_decl.hpp |  | ||||||
|     include/msgpack/v1/pack.hpp |  | ||||||
|     include/msgpack/v1/pack_decl.hpp |  | ||||||
|     include/msgpack/v1/parse_return.hpp |  | ||||||
|     include/msgpack/v1/sbuffer.hpp |  | ||||||
|     include/msgpack/v1/sbuffer_decl.hpp |  | ||||||
|     include/msgpack/v1/unpack.hpp |  | ||||||
|     include/msgpack/v1/unpack_decl.hpp |  | ||||||
|     include/msgpack/v1/unpack_exception.hpp |  | ||||||
|     include/msgpack/v1/version.hpp |  | ||||||
|     include/msgpack/v1/versioning.hpp |  | ||||||
|     include/msgpack/v1/vrefbuffer.hpp |  | ||||||
|     include/msgpack/v1/vrefbuffer_decl.hpp |  | ||||||
|     include/msgpack/v1/zbuffer.hpp |  | ||||||
|     include/msgpack/v1/zbuffer_decl.hpp |  | ||||||
|     include/msgpack/v1/zone.hpp |  | ||||||
|     include/msgpack/v1/zone_decl.hpp |  | ||||||
|     include/msgpack/v2/adaptor/adaptor_base.hpp |  | ||||||
|     include/msgpack/v2/adaptor/adaptor_base_decl.hpp |  | ||||||
|     include/msgpack/v2/adaptor/array_ref_decl.hpp |  | ||||||
|     include/msgpack/v2/adaptor/boost/msgpack_variant_decl.hpp |  | ||||||
|     include/msgpack/v2/adaptor/check_container_size_decl.hpp |  | ||||||
|     include/msgpack/v2/adaptor/define_decl.hpp |  | ||||||
|     include/msgpack/v2/adaptor/detail/cpp03_define_array_decl.hpp |  | ||||||
|     include/msgpack/v2/adaptor/detail/cpp03_define_map_decl.hpp |  | ||||||
|     include/msgpack/v2/adaptor/detail/cpp03_msgpack_tuple_decl.hpp |  | ||||||
|     include/msgpack/v2/adaptor/detail/cpp11_define_array_decl.hpp |  | ||||||
|     include/msgpack/v2/adaptor/detail/cpp11_define_map_decl.hpp |  | ||||||
|     include/msgpack/v2/adaptor/detail/cpp11_msgpack_tuple_decl.hpp |  | ||||||
|     include/msgpack/v2/adaptor/ext_decl.hpp |  | ||||||
|     include/msgpack/v2/adaptor/fixint_decl.hpp |  | ||||||
|     include/msgpack/v2/adaptor/int_decl.hpp |  | ||||||
|     include/msgpack/v2/adaptor/map_decl.hpp |  | ||||||
|     include/msgpack/v2/adaptor/msgpack_tuple_decl.hpp |  | ||||||
|     include/msgpack/v2/adaptor/nil_decl.hpp |  | ||||||
|     include/msgpack/v2/adaptor/raw_decl.hpp |  | ||||||
|     include/msgpack/v2/adaptor/size_equal_only_decl.hpp |  | ||||||
|     include/msgpack/v2/adaptor/v4raw_decl.hpp |  | ||||||
|     include/msgpack/v2/cpp_config_decl.hpp |  | ||||||
|     include/msgpack/v2/create_object_visitor.hpp |  | ||||||
|     include/msgpack/v2/create_object_visitor_decl.hpp |  | ||||||
|     include/msgpack/v2/detail/cpp03_zone_decl.hpp |  | ||||||
|     include/msgpack/v2/detail/cpp11_zone_decl.hpp |  | ||||||
|     include/msgpack/v2/fbuffer_decl.hpp |  | ||||||
|     include/msgpack/v2/iterator_decl.hpp |  | ||||||
|     include/msgpack/v2/meta_decl.hpp |  | ||||||
|     include/msgpack/v2/null_visitor.hpp |  | ||||||
|     include/msgpack/v2/null_visitor_decl.hpp |  | ||||||
|     include/msgpack/v2/object.hpp |  | ||||||
|     include/msgpack/v2/object_decl.hpp |  | ||||||
|     include/msgpack/v2/object_fwd.hpp |  | ||||||
|     include/msgpack/v2/object_fwd_decl.hpp |  | ||||||
|     include/msgpack/v2/pack_decl.hpp |  | ||||||
|     include/msgpack/v2/parse.hpp |  | ||||||
|     include/msgpack/v2/parse_decl.hpp |  | ||||||
|     include/msgpack/v2/parse_return.hpp |  | ||||||
|     include/msgpack/v2/sbuffer_decl.hpp |  | ||||||
|     include/msgpack/v2/unpack.hpp |  | ||||||
|     include/msgpack/v2/unpack_decl.hpp |  | ||||||
|     include/msgpack/v2/vrefbuffer_decl.hpp |  | ||||||
|     include/msgpack/v2/x3_parse.hpp |  | ||||||
|     include/msgpack/v2/x3_parse_decl.hpp |  | ||||||
|     include/msgpack/v2/x3_unpack.hpp |  | ||||||
|     include/msgpack/v2/x3_unpack_decl.hpp |  | ||||||
|     include/msgpack/v2/zbuffer_decl.hpp |  | ||||||
|     include/msgpack/v2/zone_decl.hpp |  | ||||||
|     include/msgpack/v3/adaptor/adaptor_base.hpp |  | ||||||
|     include/msgpack/v3/adaptor/adaptor_base_decl.hpp |  | ||||||
|     include/msgpack/v3/adaptor/array_ref_decl.hpp |  | ||||||
|     include/msgpack/v3/adaptor/boost/msgpack_variant_decl.hpp |  | ||||||
|     include/msgpack/v3/adaptor/check_container_size_decl.hpp |  | ||||||
|     include/msgpack/v3/adaptor/define_decl.hpp |  | ||||||
|     include/msgpack/v3/adaptor/detail/cpp03_define_array_decl.hpp |  | ||||||
|     include/msgpack/v3/adaptor/detail/cpp03_define_map_decl.hpp |  | ||||||
|     include/msgpack/v3/adaptor/detail/cpp03_msgpack_tuple_decl.hpp |  | ||||||
|     include/msgpack/v3/adaptor/detail/cpp11_define_array_decl.hpp |  | ||||||
|     include/msgpack/v3/adaptor/detail/cpp11_define_map_decl.hpp |  | ||||||
|     include/msgpack/v3/adaptor/detail/cpp11_msgpack_tuple_decl.hpp |  | ||||||
|     include/msgpack/v3/adaptor/ext_decl.hpp |  | ||||||
|     include/msgpack/v3/adaptor/fixint_decl.hpp |  | ||||||
|     include/msgpack/v3/adaptor/int_decl.hpp |  | ||||||
|     include/msgpack/v3/adaptor/map_decl.hpp |  | ||||||
|     include/msgpack/v3/adaptor/msgpack_tuple_decl.hpp |  | ||||||
|     include/msgpack/v3/adaptor/nil_decl.hpp |  | ||||||
|     include/msgpack/v3/adaptor/raw_decl.hpp |  | ||||||
|     include/msgpack/v3/adaptor/size_equal_only_decl.hpp |  | ||||||
|     include/msgpack/v3/adaptor/v4raw_decl.hpp |  | ||||||
|     include/msgpack/v3/cpp_config_decl.hpp |  | ||||||
|     include/msgpack/v3/create_object_visitor_decl.hpp |  | ||||||
|     include/msgpack/v3/detail/cpp03_zone_decl.hpp |  | ||||||
|     include/msgpack/v3/detail/cpp11_zone_decl.hpp |  | ||||||
|     include/msgpack/v3/fbuffer_decl.hpp |  | ||||||
|     include/msgpack/v3/iterator_decl.hpp |  | ||||||
|     include/msgpack/v3/meta_decl.hpp |  | ||||||
|     include/msgpack/v3/null_visitor_decl.hpp |  | ||||||
|     include/msgpack/v3/object_decl.hpp |  | ||||||
|     include/msgpack/v3/object_fwd.hpp |  | ||||||
|     include/msgpack/v3/object_fwd_decl.hpp |  | ||||||
|     include/msgpack/v3/pack_decl.hpp |  | ||||||
|     include/msgpack/v3/parse.hpp |  | ||||||
|     include/msgpack/v3/parse_decl.hpp |  | ||||||
|     include/msgpack/v3/parse_return.hpp |  | ||||||
|     include/msgpack/v3/sbuffer_decl.hpp |  | ||||||
|     include/msgpack/v3/unpack.hpp |  | ||||||
|     include/msgpack/v3/unpack_decl.hpp |  | ||||||
|     include/msgpack/v3/vrefbuffer_decl.hpp |  | ||||||
|     include/msgpack/v3/x3_parse_decl.hpp |  | ||||||
|     include/msgpack/v3/x3_unpack.hpp |  | ||||||
|     include/msgpack/v3/x3_unpack_decl.hpp |  | ||||||
|     include/msgpack/v3/zbuffer_decl.hpp |  | ||||||
|     include/msgpack/v3/zone_decl.hpp |  | ||||||
|     include/msgpack/version.hpp |  | ||||||
|     include/msgpack/version_master.hpp |  | ||||||
|     include/msgpack/versioning.hpp |  | ||||||
|     include/msgpack/vrefbuffer.hpp |  | ||||||
|     include/msgpack/vrefbuffer_decl.hpp |  | ||||||
|     include/msgpack/x3_parse.hpp |  | ||||||
|     include/msgpack/x3_parse_decl.hpp |  | ||||||
|     include/msgpack/x3_unpack.hpp |  | ||||||
|     include/msgpack/x3_unpack_decl.hpp |  | ||||||
|     include/msgpack/zbuffer.hpp |  | ||||||
|     include/msgpack/zbuffer_decl.hpp |  | ||||||
|     include/msgpack/zone.hpp |  | ||||||
|     include/msgpack/zone_decl.hpp |  | ||||||
| ) | ) | ||||||
|   | |||||||
							
								
								
									
										193
									
								
								QUICKSTART-C.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										193
									
								
								QUICKSTART-C.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,193 @@ | |||||||
|  | # Implementation Status | ||||||
|  |  | ||||||
|  | The serialization library is production-ready. | ||||||
|  |  | ||||||
|  | Currently, RPC implementation is not available. | ||||||
|  |  | ||||||
|  | # Install | ||||||
|  |  | ||||||
|  | ## Install with package manager | ||||||
|  |  | ||||||
|  | ### MacOS with MacPorts | ||||||
|  |  | ||||||
|  | On MacOS, you can install MessagePack for C using MacPorts. | ||||||
|  |  | ||||||
|  | ``` | ||||||
|  | $ sudo port install msgpack | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | You might need to run `sudo port selfupdate` before installing to update the package repository. | ||||||
|  |  | ||||||
|  | You can also install via Homebrew. | ||||||
|  |  | ||||||
|  | ``` | ||||||
|  | $ brew install msgpack | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ### FreeBSD with Ports Collection | ||||||
|  |  | ||||||
|  | On FreeBSD, you can use Ports Collection. Install [net/msgpack](http://www.freebsd.org/cgi/cvsweb.cgi/ports/devel/msgpack/) package. | ||||||
|  |  | ||||||
|  | ### Gentoo Linux with Portage | ||||||
|  |  | ||||||
|  | On Gentoo Linux, you can use emerge. Install [dev-libs/msgpack](http://gentoo-portage.com/dev-libs/msgpack) package. | ||||||
|  |  | ||||||
|  | ### Windows with vcpkg | ||||||
|  |  | ||||||
|  | There are several package managers available, and vcpkg is typical. | ||||||
|  |  | ||||||
|  | ``` | ||||||
|  | $ vcpkg install msgpack:x64-windows | ||||||
|  | ``` | ||||||
|  | ## Install with source code | ||||||
|  |  | ||||||
|  | ### Build with cmake | ||||||
|  |  | ||||||
|  | You need to install cmake (2.8.12 or higher) first. | ||||||
|  |  | ||||||
|  | ``` | ||||||
|  | $ git clone https://github.com/msgpack/msgpack-c.git | ||||||
|  | $ cd msgpack-c | ||||||
|  | $ mkdir build | ||||||
|  | $ cd build | ||||||
|  | $ cmake .. | ||||||
|  | $ cmake --build . | ||||||
|  | $ cmake --build . --target install | ||||||
|  | ``` | ||||||
|  | ### Build with autotools | ||||||
|  |  | ||||||
|  | In versions 1.4.2 and below, you can use `autotools` to build on UNIX-like platforms. | ||||||
|  | ``` | ||||||
|  | $ wget https://github.com/msgpack/msgpack-c/archive/cpp-1.3.0.tar.gz | ||||||
|  | $ tar zxvf msgpack-1.3.0.tar.gz | ||||||
|  | $ cd msgpack-1.3.0 | ||||||
|  | $ ./bootstrap  # If the 'configure' script already exists, you can omit this step. | ||||||
|  | $ ./configure | ||||||
|  | $ make | ||||||
|  | $ sudo make install | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | # Serialization QuickStart for C | ||||||
|  |  | ||||||
|  | ## First program | ||||||
|  |  | ||||||
|  | Include `msgpack.h` header and link `msgpack` library to use MessagePack on your program. | ||||||
|  |  | ||||||
|  | ```c | ||||||
|  | #include <msgpack.h> | ||||||
|  | #include <stdio.h> | ||||||
|  |  | ||||||
|  | int main(void) { | ||||||
|  |  | ||||||
|  |         /* creates buffer and serializer instance. */ | ||||||
|  |         msgpack_sbuffer* buffer = msgpack_sbuffer_new(); | ||||||
|  |         msgpack_packer* pk = msgpack_packer_new(buffer, msgpack_sbuffer_write); | ||||||
|  |  | ||||||
|  |         /* serializes ["Hello", "MessagePack"]. */ | ||||||
|  |         msgpack_pack_array(pk, 2); | ||||||
|  |         msgpack_pack_bin(pk, 5); | ||||||
|  |         msgpack_pack_bin_body(pk, "Hello", 5); | ||||||
|  |         msgpack_pack_bin(pk, 11); | ||||||
|  |         msgpack_pack_bin_body(pk, "MessagePack", 11); | ||||||
|  |  | ||||||
|  |         /* deserializes it. */ | ||||||
|  |         msgpack_unpacked msg; | ||||||
|  |         msgpack_unpacked_init(&msg); | ||||||
|  |         msgpack_unpack_return ret = msgpack_unpack_next(&msg, buffer->data, buffer->size, NULL); | ||||||
|  |  | ||||||
|  |         /* prints the deserialized object. */ | ||||||
|  |         msgpack_object obj = msg.data; | ||||||
|  |         msgpack_object_print(stdout, obj);  /*=> ["Hello", "MessagePack"] */ | ||||||
|  |  | ||||||
|  |         /* cleaning */ | ||||||
|  |         msgpack_unpacked_destroy(&msg); | ||||||
|  |         msgpack_sbuffer_free(buffer); | ||||||
|  |         msgpack_packer_free(pk); | ||||||
|  | } | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ## Simple program with a loop | ||||||
|  |  | ||||||
|  | ```c | ||||||
|  | #include <msgpack.h> | ||||||
|  | #include <stdio.h> | ||||||
|  |  | ||||||
|  | int main(void) { | ||||||
|  |  | ||||||
|  |         /* creates buffer and serializer instance. */ | ||||||
|  |         msgpack_sbuffer* buffer = msgpack_sbuffer_new(); | ||||||
|  |         msgpack_packer* pk = msgpack_packer_new(buffer, msgpack_sbuffer_write); | ||||||
|  |  | ||||||
|  |         int j; | ||||||
|  |  | ||||||
|  |         for(j = 0; j<23; j++) { | ||||||
|  |            /* NB: the buffer needs to be cleared on each iteration */ | ||||||
|  |            msgpack_sbuffer_clear(buffer); | ||||||
|  |  | ||||||
|  |            /* serializes ["Hello", "MessagePack"]. */ | ||||||
|  |            msgpack_pack_array(pk, 3); | ||||||
|  |            msgpack_pack_bin(pk, 5); | ||||||
|  |            msgpack_pack_bin_body(pk, "Hello", 5); | ||||||
|  |            msgpack_pack_bin(pk, 11); | ||||||
|  |            msgpack_pack_bin_body(pk, "MessagePack", 11); | ||||||
|  |            msgpack_pack_int(pk, j); | ||||||
|  |  | ||||||
|  |            /* deserializes it. */ | ||||||
|  |            msgpack_unpacked msg; | ||||||
|  |            msgpack_unpacked_init(&msg); | ||||||
|  |            msgpack_unpack_return ret = msgpack_unpack_next(&msg, buffer->data, buffer->size, NULL); | ||||||
|  |  | ||||||
|  |            /* prints the deserialized object. */ | ||||||
|  |            msgpack_object obj = msg.data; | ||||||
|  |            msgpack_object_print(stdout, obj);  /*=> ["Hello", "MessagePack"] */ | ||||||
|  |            msgpack_unpacked_destroy(&msg); | ||||||
|  |            puts(""); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /* cleaning */ | ||||||
|  |         msgpack_sbuffer_free(buffer); | ||||||
|  |         msgpack_packer_free(pk); | ||||||
|  | } | ||||||
|  | ``` | ||||||
|  |  | ||||||
|  | ## Streaming feature | ||||||
|  |  | ||||||
|  | ```c | ||||||
|  | #include <msgpack.h> | ||||||
|  | #include <stdio.h> | ||||||
|  |  | ||||||
|  | int main(void) { | ||||||
|  |         /* serializes multiple objects using msgpack_packer. */ | ||||||
|  |         msgpack_sbuffer* buffer = msgpack_sbuffer_new(); | ||||||
|  |         msgpack_packer* pk = msgpack_packer_new(buffer, msgpack_sbuffer_write); | ||||||
|  |         msgpack_pack_int(pk, 1); | ||||||
|  |         msgpack_pack_int(pk, 2); | ||||||
|  |         msgpack_pack_int(pk, 3); | ||||||
|  |  | ||||||
|  |         /* deserializes these objects using msgpack_unpacker. */ | ||||||
|  |         msgpack_unpacker pac; | ||||||
|  |         msgpack_unpacker_init(&pac, MSGPACK_UNPACKER_INIT_BUFFER_SIZE); | ||||||
|  |  | ||||||
|  |         /* feeds the buffer. */ | ||||||
|  |         msgpack_unpacker_reserve_buffer(&pac, buffer->size); | ||||||
|  |         memcpy(msgpack_unpacker_buffer(&pac), buffer->data, buffer->size); | ||||||
|  |         msgpack_unpacker_buffer_consumed(&pac, buffer->size); | ||||||
|  |  | ||||||
|  |         /* now starts streaming deserialization. */ | ||||||
|  |         msgpack_unpacked result; | ||||||
|  |         msgpack_unpacked_init(&result); | ||||||
|  |  | ||||||
|  |         while(msgpack_unpacker_next(&pac, &result)) { | ||||||
|  |             msgpack_object_print(stdout, result.data); | ||||||
|  |             puts(""); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /* results: | ||||||
|  |          * $ gcc stream.cc -lmsgpackc -o stream | ||||||
|  |          * $ ./stream | ||||||
|  |          * 1 | ||||||
|  |          * 2 | ||||||
|  |          * 3 | ||||||
|  |          */ | ||||||
|  | } | ||||||
|  | ``` | ||||||
| @@ -1,159 +0,0 @@ | |||||||
| # Implementation Status |  | ||||||
|  |  | ||||||
| The serialization library is production-ready. |  | ||||||
|  |  | ||||||
| Currently, RPC implementation is in testing phase. Requires newer kernel, not running on RHEL5/CentOS5. |  | ||||||
|  |  | ||||||
| # Install |  | ||||||
|  |  | ||||||
| Same as QuickStart for C Language. |  | ||||||
|  |  | ||||||
| # Serialization QuickStart for C+\+ |  | ||||||
|  |  | ||||||
| ## First program |  | ||||||
|  |  | ||||||
| Include `msgpack.hpp` header and link `msgpack` library to use MessagePack on your program. |  | ||||||
|  |  | ||||||
| ```cpp |  | ||||||
| #include <msgpack.hpp> |  | ||||||
| #include <vector> |  | ||||||
| #include <string> |  | ||||||
| #include <iostream> |  | ||||||
|  |  | ||||||
| int main(void) { |  | ||||||
|         // serializes this object. |  | ||||||
|         std::vector<std::string> vec; |  | ||||||
|         vec.push_back("Hello"); |  | ||||||
|         vec.push_back("MessagePack"); |  | ||||||
|  |  | ||||||
|         // serialize it into simple buffer. |  | ||||||
|         msgpack::sbuffer sbuf; |  | ||||||
|         msgpack::pack(sbuf, vec); |  | ||||||
|  |  | ||||||
|         // deserialize it. |  | ||||||
|         msgpack::object_handle oh = |  | ||||||
|             msgpack::unpack(sbuf.data(), sbuf.size()); |  | ||||||
|  |  | ||||||
|         // print the deserialized object. |  | ||||||
|         msgpack::object obj = oh.get(); |  | ||||||
|         std::cout << obj << std::endl;  //=> ["Hello", "MessagePack"] |  | ||||||
|  |  | ||||||
|         // convert it into statically typed object. |  | ||||||
|         std::vector<std::string> rvec; |  | ||||||
|         obj.convert(rvec); |  | ||||||
| } |  | ||||||
| ``` |  | ||||||
|  |  | ||||||
| Compile it as follows: |  | ||||||
|  |  | ||||||
| ``` |  | ||||||
| $ g++ -Ipath_to_msgpack/include hello.cc -o hello |  | ||||||
| $ ./hello |  | ||||||
| ["Hello", "MessagePack"] |  | ||||||
| ``` |  | ||||||
|  |  | ||||||
| ## Streaming feature |  | ||||||
|  |  | ||||||
| ```cpp |  | ||||||
| #include <msgpack.hpp> |  | ||||||
| #include <iostream> |  | ||||||
| #include <string> |  | ||||||
|  |  | ||||||
| int main() { |  | ||||||
|         // serializes multiple objects using msgpack::packer. |  | ||||||
|         msgpack::sbuffer buffer; |  | ||||||
|  |  | ||||||
|         msgpack::packer<msgpack::sbuffer> pk(&buffer); |  | ||||||
|         pk.pack(std::string("Log message ... 1")); |  | ||||||
|         pk.pack(std::string("Log message ... 2")); |  | ||||||
|         pk.pack(std::string("Log message ... 3")); |  | ||||||
|  |  | ||||||
|         // deserializes these objects using msgpack::unpacker. |  | ||||||
|         msgpack::unpacker pac; |  | ||||||
|  |  | ||||||
|         // feeds the buffer. |  | ||||||
|         pac.reserve_buffer(buffer.size()); |  | ||||||
|         memcpy(pac.buffer(), buffer.data(), buffer.size()); |  | ||||||
|         pac.buffer_consumed(buffer.size()); |  | ||||||
|  |  | ||||||
|         // now starts streaming deserialization. |  | ||||||
|         msgpack::object_handle oh; |  | ||||||
|         while(pac.next(oh)) { |  | ||||||
|             std::cout << oh.get() << std::endl; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         // results: |  | ||||||
|         // $ g++ -Ipath_to_msgpack/include stream.cc -o stream |  | ||||||
|         // $ ./stream |  | ||||||
|         // "Log message ... 1" |  | ||||||
|         // "Log message ... 2" |  | ||||||
|         // "Log message ... 3" |  | ||||||
| } |  | ||||||
| ``` |  | ||||||
|  |  | ||||||
| ### Streaming into an array or map |  | ||||||
|  |  | ||||||
| ```cpp |  | ||||||
| #include <msgpack.hpp> |  | ||||||
| #include <iostream> |  | ||||||
| #include <string> |  | ||||||
|  |  | ||||||
| int main() { |  | ||||||
|         // serializes multiple objects into one message containing an array using msgpack::packer. |  | ||||||
|         msgpack::sbuffer buffer; |  | ||||||
|  |  | ||||||
|         msgpack::packer<msgpack::sbuffer> pk(&buffer); |  | ||||||
|         pk.pack_array(3); |  | ||||||
|         pk.pack(std::string("Log message ... 1")); |  | ||||||
|         pk.pack(std::string("Log message ... 2")); |  | ||||||
|         pk.pack(std::string("Log message ... 3")); |  | ||||||
|  |  | ||||||
|         // serializes multiple objects into one message containing a map using msgpack::packer. |  | ||||||
|         msgpack::sbuffer buffer2; |  | ||||||
|  |  | ||||||
|         msgpack::packer<msgpack::sbuffer> pk2(&buffer2); |  | ||||||
|         pk2.pack_map(2); |  | ||||||
|         pk2.pack(std::string("x")); |  | ||||||
|         pk2.pack(3); |  | ||||||
|         pk2.pack(std::string("y")); |  | ||||||
|         pk2.pack(3.4321); |  | ||||||
|  |  | ||||||
| } |  | ||||||
| ``` |  | ||||||
|  |  | ||||||
|  |  | ||||||
| ## User-defined classes |  | ||||||
|  |  | ||||||
| You can use serialize/deserializes user-defined classes using `MSGPACK_DEFINE` macro. |  | ||||||
|  |  | ||||||
| ```cpp |  | ||||||
| #include <msgpack.hpp> |  | ||||||
| #include <vector> |  | ||||||
| #include <string> |  | ||||||
|  |  | ||||||
| class myclass { |  | ||||||
| private: |  | ||||||
|     std::string m_str; |  | ||||||
|     std::vector<int> m_vec; |  | ||||||
| public: |  | ||||||
|     MSGPACK_DEFINE(m_str, m_vec); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| int main() { |  | ||||||
|         std::vector<myclass> vec; |  | ||||||
|         // add some elements into vec... |  | ||||||
|  |  | ||||||
|         // you can serialize myclass directly |  | ||||||
|         msgpack::sbuffer sbuf; |  | ||||||
|         msgpack::pack(sbuf, vec); |  | ||||||
|  |  | ||||||
|         msgpack::object_handle oh = |  | ||||||
|             msgpack::unpack(sbuf.data(), sbuf.size()); |  | ||||||
|  |  | ||||||
|         msgpack::object obj = oh.get(); |  | ||||||
|  |  | ||||||
|         // you can convert object to myclass directly |  | ||||||
|         std::vector<myclass> rvec; |  | ||||||
|         obj.convert(rvec); |  | ||||||
| } |  | ||||||
| ``` |  | ||||||
							
								
								
									
										176
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										176
									
								
								README.md
									
									
									
									
									
								
							| @@ -1,8 +1,8 @@ | |||||||
| `msgpack` for C++ | `msgpack` for C | ||||||
| =================== | =================== | ||||||
|  |  | ||||||
| Version 4.0.1 [](https://github.com/msgpack/msgpack-c/actions) [](https://ci.appveyor.com/project/redboltz/msgpack-c/branch/cpp_master) | Version 5.0.0 [](https://github.com/msgpack/msgpack-c/actions) [](https://ci.appveyor.com/project/redboltz/msgpack-c/branch/c_master) | ||||||
| [](https://codecov.io/gh/msgpack/msgpack-c/branch/cpp_master) | [](https://codecov.io/gh/msgpack/msgpack-c/branch/c_master) | ||||||
|  |  | ||||||
| It's like JSON but smaller and faster. | It's like JSON but smaller and faster. | ||||||
|  |  | ||||||
| @@ -18,158 +18,95 @@ addition to the strings themselves. | |||||||
| Example | Example | ||||||
| ------- | ------- | ||||||
|  |  | ||||||
| ```c++ | ```c | ||||||
| #include <msgpack.hpp> | #include <msgpack.h> | ||||||
| #include <string> | #include <stdio.h> | ||||||
| #include <iostream> |  | ||||||
| #include <sstream> |  | ||||||
|  |  | ||||||
| int main() | int main(void) | ||||||
| { | { | ||||||
|     msgpack::type::tuple<int, bool, std::string> src(1, true, "example"); |     /* msgpack::sbuffer is a simple buffer implementation. */ | ||||||
|  |     msgpack_sbuffer sbuf; | ||||||
|  |     msgpack_sbuffer_init(&sbuf); | ||||||
|  |  | ||||||
|     // serialize the object into the buffer. |     /* serialize values into the buffer using msgpack_sbuffer_write callback function. */ | ||||||
|     // any classes that implements write(const char*,size_t) can be a buffer. |     msgpack_packer pk; | ||||||
|     std::stringstream buffer; |     msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write); | ||||||
|     msgpack::pack(buffer, src); |  | ||||||
|  |  | ||||||
|     // send the buffer ... |     msgpack_pack_array(&pk, 3); | ||||||
|     buffer.seekg(0); |     msgpack_pack_int(&pk, 1); | ||||||
|  |     msgpack_pack_true(&pk); | ||||||
|  |     msgpack_pack_str(&pk, 7); | ||||||
|  |     msgpack_pack_str_body(&pk, "example", 7); | ||||||
|  |  | ||||||
|     // deserialize the buffer into msgpack::object instance. |     /* deserialize the buffer into msgpack_object instance. */ | ||||||
|     std::string str(buffer.str()); |     /* deserialized object is valid during the msgpack_zone instance alive. */ | ||||||
|  |     msgpack_zone mempool; | ||||||
|  |     msgpack_zone_init(&mempool, 2048); | ||||||
|  |  | ||||||
|     msgpack::object_handle oh = |     msgpack_object deserialized; | ||||||
|         msgpack::unpack(str.data(), str.size()); |     msgpack_unpack(sbuf.data, sbuf.size, NULL, &mempool, &deserialized); | ||||||
|  |  | ||||||
|     // deserialized object is valid during the msgpack::object_handle instance is alive. |     /* print the deserialized object. */ | ||||||
|     msgpack::object deserialized = oh.get(); |     msgpack_object_print(stdout, deserialized); | ||||||
|  |     puts(""); | ||||||
|  |  | ||||||
|     // msgpack::object supports ostream. |     msgpack_zone_destroy(&mempool); | ||||||
|     std::cout << deserialized << std::endl; |     msgpack_sbuffer_destroy(&sbuf); | ||||||
|  |  | ||||||
|     // convert msgpack::object instance into the original type. |  | ||||||
|     // if the type is mismatched, it throws msgpack::type_error exception. |  | ||||||
|     msgpack::type::tuple<int, bool, std::string> dst; |  | ||||||
|     deserialized.convert(dst); |  | ||||||
|  |  | ||||||
|     // or create the new instance |  | ||||||
|     msgpack::type::tuple<int, bool, std::string> dst2 = |  | ||||||
|         deserialized.as<msgpack::type::tuple<int, bool, std::string> >(); |  | ||||||
|  |  | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
| ``` | ``` | ||||||
|  |  | ||||||
| See [`QUICKSTART-CPP.md`](./QUICKSTART-CPP.md) for more details. | See [`QUICKSTART-C.md`](./QUICKSTART-C.md) for more details. | ||||||
|  |  | ||||||
| Dependency |  | ||||||
| ---------- |  | ||||||
|  |  | ||||||
| msgpack-c requires [boost library](https://www.boost.org/). |  | ||||||
| C++ version of msgpack-c itself is a header-only library and depends only on |  | ||||||
| boost headers. Tests depend on boost unit test framework and are linked with |  | ||||||
| it, so if you want to build them, you need to have this dependency installed. |  | ||||||
|  |  | ||||||
| Usage | Usage | ||||||
| ----- | ----- | ||||||
|  |  | ||||||
| - If you build your project with cmake, you can find msgpack-c with a | ### Building and Installing | ||||||
|   canonical cmake-way: |  | ||||||
|  |  | ||||||
|   ```cmake | #### Install from git repository | ||||||
|   # ... |  | ||||||
|   find_package(msgpack REQUIRED) |  | ||||||
|   # ... |  | ||||||
|   target_link_libraries(your_target_name <PRIVATE/PUBLIC/INTERFACE> msgpackc-cxx) |  | ||||||
|   # ... |  | ||||||
|   ``` |  | ||||||
|  |  | ||||||
|   This will search for `msgpack` cmake package in a system prefix and in | ##### Using the Terminal (CLI) | ||||||
|   prefixes from `CMAKE_PREFIX_PATH`. Note that msgpack-c depends on boost |  | ||||||
|   headers, and `msgpack` cmake package depends on `Boost` cmake package. The |  | ||||||
|   library is header-only and `target_link_libraries` command just adds path |  | ||||||
|   to msgpack-c headers to your compiler's include path. |  | ||||||
|  |  | ||||||
|   A usage example can be found at [test-install](test-install) directory. |  | ||||||
|  |  | ||||||
| - If you do not use cmake, you can just add path yo msgpack-c and boost |  | ||||||
|   headers to your include path: |  | ||||||
|  |  | ||||||
|   ```bash |  | ||||||
|   g++ -I msgpack-c/include -I path_to_boost your_source_file.cpp |  | ||||||
|   ``` |  | ||||||
|  |  | ||||||
| Building and Installing |  | ||||||
| ----------------------- |  | ||||||
|  |  | ||||||
| ### Install from git repository |  | ||||||
|  |  | ||||||
| #### Using the Terminal (CLI) |  | ||||||
|  |  | ||||||
| You will need: | You will need: | ||||||
|  |  | ||||||
| - `gcc >= 4.1.0` |  - `gcc >= 4.1.0` | ||||||
| - `cmake >= 3.1.0` |  - `cmake >= 2.8.0` | ||||||
|  |  | ||||||
| C++03: | How to build: | ||||||
|  |  | ||||||
| ```bash |     $ git clone https://github.com/msgpack/msgpack-c.git | ||||||
| git clone https://github.com/msgpack/msgpack-c.git |     $ cd msgpack-c | ||||||
| cd msgpack-c |     $ git checkout c_master | ||||||
| git checkout cpp_master |     $ cmake . | ||||||
| cmake . |     $ make | ||||||
| sudo cmake --build . --target install |     $ sudo make install | ||||||
| ``` |  | ||||||
|  |  | ||||||
| If you want to build tests with different C++ version, you can use | How to run tests: | ||||||
| `MSGPACK_CXX11`, `MSGPACK_CXX14`, `MSGPACK_CXX17`, `MSGPACK_CXX20` options. |  | ||||||
| Just replace the line |  | ||||||
|  |  | ||||||
| ```bash | In order to run tests you must have the [GoogleTest](https://github.com/google/googletest) framework installed. If you do not currently have it, install it and re-run `cmake`. | ||||||
| cmake . | Then: | ||||||
| ``` |  | ||||||
|  |  | ||||||
| with a line like that: |     $ make test | ||||||
|  |  | ||||||
| ```bash | When you use the C part of `msgpack-c`, you need to build and link the library. By default, both static/shared libraries are built. If you want to build only static library, set `BUILD_SHARED_LIBS=OFF` to cmake. If you want to build only shared library, set `BUILD_SHARED_LIBS=ON`. | ||||||
| cmake -DMSGPACK_CXX20=ON . |  | ||||||
| ``` |  | ||||||
|  |  | ||||||
| Note that these flags do not affect installation. They just switch test cases. |  | ||||||
| All files are installed in every settings. |  | ||||||
|  |  | ||||||
| If you don't have superuser permissions or don't want to install the library |  | ||||||
| to a system-wide prefix, you can use `CMAKE_INSTALL_PREFIX` option like that: |  | ||||||
|  |  | ||||||
| ```bash |  | ||||||
| cmake -DCMAKE_INSTALL_PREFIX=/your/custom/prefix . |  | ||||||
| ``` |  | ||||||
|  |  | ||||||
| Other useful options: |  | ||||||
|  |  | ||||||
| - `MSGPACK_BUILD_TESTS` (default `OFF`): build tests |  | ||||||
| - `MSGPACK_BUILD_EXAMPLES` (default `OFF`): build examples |  | ||||||
| - `MSGPACK_32BIT` (default `OFF`): 32bit compile |  | ||||||
| - `MSGPACK_USE_X3_PARSE` (default `OFF`): use Boost X3 parse |  | ||||||
|   (note that it requires C++14 or newer) |  | ||||||
|  |  | ||||||
| #### GUI on Windows | #### GUI on Windows | ||||||
|  |  | ||||||
| Clone msgpack-c git repository with the command: | Clone msgpack-c git repository. | ||||||
|  |  | ||||||
| ``` |     $ git clone https://github.com/msgpack/msgpack-c.git | ||||||
| git clone https://github.com/msgpack/msgpack-c.git |  | ||||||
| ``` |  | ||||||
|  |  | ||||||
| or using GUI git client (e.g. [tortoise git](https://code.google.com/p/tortoisegit/)). | or using GUI git client. | ||||||
|  |  | ||||||
| 1. Checkout to `cpp_master` branch | e.g.) tortoise git https://code.google.com/p/tortoisegit/ | ||||||
|  |  | ||||||
|  | 1. Checkout to c_master branch | ||||||
|  |  | ||||||
| 2. Launch [cmake GUI client](http://www.cmake.org/cmake/resources/software.html). | 2. Launch [cmake GUI client](http://www.cmake.org/cmake/resources/software.html). | ||||||
|  |  | ||||||
| 3. Set 'Where is the source code:' text box and | 3. Set 'Where is the source code:' text box and 'Where to build | ||||||
|    'Where to build the binaries:' text box. | the binaries:' text box. | ||||||
|  |  | ||||||
| 4. Click 'Configure' button. | 4. Click 'Configure' button. | ||||||
|  |  | ||||||
| @@ -181,8 +118,7 @@ or using GUI git client (e.g. [tortoise git](https://code.google.com/p/tortoiseg | |||||||
|  |  | ||||||
| 8. Build all. | 8. Build all. | ||||||
|  |  | ||||||
| Documentation | ### Documentation | ||||||
| ------------- |  | ||||||
|  |  | ||||||
| You can get additional information including the tutorial on the | You can get additional information including the tutorial on the | ||||||
| [wiki](https://github.com/msgpack/msgpack-c/wiki). | [wiki](https://github.com/msgpack/msgpack-c/wiki). | ||||||
|   | |||||||
							
								
								
									
										91
									
								
								appveyor.yml
									
									
									
									
									
								
							
							
						
						
									
										91
									
								
								appveyor.yml
									
									
									
									
									
								
							| @@ -1,66 +1,43 @@ | |||||||
| version: 4.0.1.{build} | version: 5.0.0.{build} | ||||||
|  |  | ||||||
| branches: | branches: | ||||||
|   only: |   only: | ||||||
|   - cpp_master |   - c_master | ||||||
|  |  | ||||||
|  | image: | ||||||
|  | - Visual Studio 2015 | ||||||
| environment: | environment: | ||||||
|   matrix: |   matrix: | ||||||
|     - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013 |     - msvc: '"Visual Studio 10 2010"' | ||||||
|       cpp11: -DMSGPACK_CXX11=OFF |     - msvc: '"Visual Studio 11 2012"' | ||||||
|       msvc: '"Visual Studio 12 2013"' |     - msvc: '"Visual Studio 12 2013"' | ||||||
|       boost_prefix: C:\Libraries\boost_1_58_0 |     - msvc: '"Visual Studio 14 2015"' | ||||||
|       boost_subdir: lib32-msvc-12.0 |  | ||||||
|     - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015 |  | ||||||
|       cpp11: -DMSGPACK_CXX11=OFF |  | ||||||
|       msvc: '"Visual Studio 14 2015"' |  | ||||||
|       boost_prefix: C:\Libraries\boost_1_69_0 |  | ||||||
|       boost_subdir: lib32-msvc-14.0 |  | ||||||
|     - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015 |  | ||||||
|       cpp11: -DMSGPACK_CXX11=ON |  | ||||||
|       msvc: '"Visual Studio 14 2015"' |  | ||||||
|       boost_prefix: C:\Libraries\boost_1_69_0 |  | ||||||
|       boost_subdir: lib32-msvc-14.0 |  | ||||||
| build_script: | build_script: | ||||||
|   - ps: | | - appveyor DownloadFile https://github.com/google/googletest/archive/release-1.7.0.zip -FileName googletest-release-1.7.0.zip | ||||||
|       appveyor DownloadFile http://zlib.net/zlib-1.2.11.tar.gz -FileName zlib-1.2.11.tar.gz | - 7z x googletest-release-1.7.0.zip > NUL | ||||||
|       7z x zlib-1.2.11.tar.gz 2> $null | - cd googletest-release-1.7.0 | ||||||
|       7z x zlib-1.2.11.tar 2> $null | - md build | ||||||
|       cd zlib-1.2.11 | - cd build | ||||||
|  | - cmake -G %msvc% -DBUILD_SHARED_LIBS=ON -DCMAKE_CXX_FLAGS=/D_VARIADIC_MAX=10 .. | ||||||
|       md build | - cmake --build . --config Release | ||||||
|       md prefix | - cd .. | ||||||
|       cd build | - cd .. | ||||||
|  | - appveyor DownloadFile http://zlib.net/zlib-1.2.13.tar.gz -FileName zlib-1.2.13.tar.gz | ||||||
|       cmake ` | - 7z x zlib-1.2.13.tar.gz > NUL | ||||||
|           -G $env:msvc ` | - 7z x zlib-1.2.13.tar > NUL | ||||||
|           -D CMAKE_INSTALL_PREFIX="$env:APPVEYOR_BUILD_FOLDER\zlib-1.2.11\prefix" ` | - cd zlib-1.2.13 | ||||||
|           .. | - md build | ||||||
|       if ($LastExitCode -ne 0) { exit $LastExitCode } | - cd build | ||||||
|  | - cmake -G %msvc% .. | ||||||
|       cmake --build . --target install --config Release | - cmake --build . --config Release | ||||||
|       if ($LastExitCode -ne 0) { exit $LastExitCode } | - copy zconf.h .. | ||||||
|       cd ..\.. | - cd .. | ||||||
|  | - cd .. | ||||||
|       md build | - md build | ||||||
|       md prefix | - cd build | ||||||
|       cd build | - cmake -G %msvc% -DGTEST_LIBRARY=%APPVEYOR_BUILD_FOLDER%\googletest-release-1.7.0\build\Release\gtest.lib -DGTEST_MAIN_LIBRARY=%APPVEYOR_BUILD_FOLDER%\googletest-release-1.7.0\build\Release\gtest_main.lib -DGTEST_INCLUDE_DIR=%APPVEYOR_BUILD_FOLDER%\googletest-release-1.7.0\include -DZLIB_LIBRARY=%APPVEYOR_BUILD_FOLDER%\zlib-1.2.13\build\Release\zlib.lib -DZLIB_INCLUDE_DIR=%APPVEYOR_BUILD_FOLDER%\zlib-1.2.13 -DCMAKE_CXX_FLAGS='"/D_VARIADIC_MAX=10 /EHsc"' .. | ||||||
|  | - cmake --build . --config Release -v | ||||||
|       cmake ` |  | ||||||
|           -G $env:msvc ` |  | ||||||
|           $env:cpp11 ` |  | ||||||
|           -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.11\prefix" ` |  | ||||||
|           -D CMAKE_INSTALL_PREFIX="$env:APPVEYOR_BUILD_FOLDER\prefix" ` |  | ||||||
|           -D CMAKE_CXX_FLAGS="/D_VARIADIC_MAX=10 /EHsc /DBOOST_ALL_DYN_LINK" ` |  | ||||||
|           .. |  | ||||||
|       if ($LastExitCode -ne 0) { exit $LastExitCode } |  | ||||||
|  |  | ||||||
|       cmake --build . --config Release |  | ||||||
|       if ($LastExitCode -ne 0) { exit $LastExitCode } |  | ||||||
|  |  | ||||||
| test_script: | test_script: | ||||||
| - set PATH=%PATH%;%APPVEYOR_BUILD_FOLDER%\zlib-1.2.11\build\Release;%APPVEYOR_BUILD_FOLDER%\build\release;%boost_prefix%\%boost_subdir% | - set PATH=%PATH%;%APPVEYOR_BUILD_FOLDER%\googletest-release-1.7.0\build\Release;%APPVEYOR_BUILD_FOLDER%\zlib-1.2.13\build\Release;%APPVEYOR_BUILD_FOLDER%\build\release | ||||||
| - ctest -VV -C Release | - ctest -V | ||||||
|   | |||||||
| @@ -1,11 +1,23 @@ | |||||||
| #!/bin/bash | #!/bin/bash | ||||||
|  |  | ||||||
| build_dir="$CXX-build" | mkdir build | ||||||
| prefix_dir="`pwd`/$CXX-prefix" |  | ||||||
| mkdir $build_dir  || exit 1 |  | ||||||
| mkdir $prefix_dir || exit 1 |  | ||||||
|  |  | ||||||
| if [ "${ARCH}" == "32" ]; then | ret=$? | ||||||
|  | if [ $ret -ne 0 ] | ||||||
|  | then | ||||||
|  |     exit $ret | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | cd build | ||||||
|  |  | ||||||
|  | ret=$? | ||||||
|  | if [ $ret -ne 0 ] | ||||||
|  | then | ||||||
|  |     exit $ret | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | if [ "${ARCH}" == "32" ] | ||||||
|  | then | ||||||
|     export BIT32="ON" |     export BIT32="ON" | ||||||
|     export ARCH_FLAG="-m32" |     export ARCH_FLAG="-m32" | ||||||
| else | else | ||||||
| @@ -13,25 +25,42 @@ else | |||||||
|     export ARCH_FLAG="-m64" |     export ARCH_FLAG="-m64" | ||||||
| fi | fi | ||||||
|  |  | ||||||
| cmake \ | cmake -DMSGPACK_32BIT=${BIT32} -DBUILD_SHARED_LIBS=${SHARED} -DMSGPACK_CHAR_SIGN=${CHAR_SIGN} -DCMAKE_CXX_FLAGS="${ARCH_FLAG} ${CXXFLAGS} ${SAN}" -DCMAKE_C_FLAGS="${CFLAGS} ${SAN}" .. | ||||||
|     -D CMAKE_PREFIX_PATH="${HOME}/boost-prefix/${ARCH};${HOME}/zlib-prefix/${ARCH}" \ |  | ||||||
|     -D MSGPACK_BUILD_TESTS=ON \ |  | ||||||
|     -D ${MSGPACK_CXX_VERSION} \ |  | ||||||
|     -D MSGPACK_32BIT=${BIT32} \ |  | ||||||
|     -D MSGPACK_CHAR_SIGN=${CHAR_SIGN} \ |  | ||||||
|     -D MSGPACK_DEFAULT_API_VERSION=${API_VERSION} \ |  | ||||||
|     -D MSGPACK_USE_X3_PARSE=${X3_PARSE} \ |  | ||||||
|     -D CMAKE_CXX_FLAGS="${CXXFLAGS} ${ARCH_FLAG}" \ |  | ||||||
|     -D CMAKE_INSTALL_PREFIX=$prefix_dir \ |  | ||||||
|     -B $build_dir \ |  | ||||||
|     -S . || exit 1 |  | ||||||
|  |  | ||||||
| cmake --build $build_dir --target install || exit 1 | ret=$? | ||||||
|  | if [ $ret -ne 0 ] | ||||||
|  | then | ||||||
|  |     exit $ret | ||||||
|  | fi | ||||||
|  |  | ||||||
| ctest -VV --test-dir $build_dir || exit 1 | make | ||||||
|  |  | ||||||
| if [ "${ARCH}" != "32" ] && [ `uname` = "Linux" ]; then | ret=$? | ||||||
|     ctest -T memcheck --test-dir $build_dir | tee memcheck.log | if [ $ret -ne 0 ] | ||||||
|  | then | ||||||
|  |     exit $ret | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | ctest -VV | ||||||
|  |  | ||||||
|  | ret=$? | ||||||
|  | if [ $ret -ne 0 ] | ||||||
|  | then | ||||||
|  |     exit $ret | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | cmake -DMSGPACK_32BIT=${BIT32} -DBUILD_SHARED_LIBS=${SHARED} -DMSGPACK_CHAR_SIGN=${CHAR_SIGN} -DCMAKE_CXX_FLAGS="${ARCH_FLAG} ${CXXFLAGS}" -DCMAKE_C_FLAGS="${CFLAGS}" .. | ||||||
|  | make install DESTDIR=`pwd`/install | ||||||
|  |  | ||||||
|  | ret=$? | ||||||
|  | if [ $ret -ne 0 ] | ||||||
|  | then | ||||||
|  |     exit $ret | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | if [ "${ARCH}" != "32" ] && [ `uname` = "Linux" ] | ||||||
|  | then | ||||||
|  |     ctest -T memcheck | tee memcheck.log | ||||||
|  |  | ||||||
|     ret=${PIPESTATUS[0]} |     ret=${PIPESTATUS[0]} | ||||||
|     if [ $ret -ne 0 ] |     if [ $ret -ne 0 ] | ||||||
| @@ -46,15 +75,39 @@ if [ "${ARCH}" != "32" ] && [ `uname` = "Linux" ]; then | |||||||
|     fi |     fi | ||||||
| fi | fi | ||||||
|  |  | ||||||
| if [ "${ARCH}" != "32" ]; then | if [ "${ARCH}" != "32" ] | ||||||
|     cd test-install || exit 1 | then | ||||||
|  |     mkdir install-test | ||||||
|  |  | ||||||
|     mkdir $build_dir |     ret=$? | ||||||
|     cmake \ |     if [ $ret -ne 0 ] | ||||||
|         -D CMAKE_PREFIX_PATH="$prefix_dir;${HOME}/boost-prefix/${ARCH}" \ |     then | ||||||
|         -B $build_dir \ |         exit $ret | ||||||
|         -S . || exit 1 |     fi | ||||||
|     cmake --build $build_dir --target all || exit 1 |  | ||||||
|  |  | ||||||
|     $build_dir/test-install || exit 1 |     cd install-test | ||||||
|  |  | ||||||
|  |     ret=$? | ||||||
|  |     if [ $ret -ne 0 ] | ||||||
|  |     then | ||||||
|  |         exit $ret | ||||||
|  |     fi | ||||||
|  |  | ||||||
|  |     cmake -DCMAKE_PREFIX_PATH=`pwd`/../install/usr/local/lib/cmake ../../example/cmake | ||||||
|  |  | ||||||
|  |     ret=$? | ||||||
|  |     if [ $ret -ne 0 ] | ||||||
|  |     then | ||||||
|  |         exit $ret | ||||||
|  |     fi | ||||||
|  |  | ||||||
|  |     make | ||||||
|  |  | ||||||
|  |     ret=$? | ||||||
|  |     if [ $ret -ne 0 ] | ||||||
|  |     then | ||||||
|  |         exit $ret | ||||||
|  |     fi | ||||||
| fi | fi | ||||||
|  |  | ||||||
|  | exit 0 | ||||||
|   | |||||||
							
								
								
									
										59
									
								
								ci/build_cmake_embedded.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										59
									
								
								ci/build_cmake_embedded.sh
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,59 @@ | |||||||
|  | #!/bin/bash | ||||||
|  |  | ||||||
|  | cd example/cmake | ||||||
|  |  | ||||||
|  | ret=$? | ||||||
|  | if [ $ret -ne 0 ] | ||||||
|  | then | ||||||
|  |     exit $ret | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | rm -f msgpack-c | ||||||
|  |  | ||||||
|  | ret=$? | ||||||
|  | if [ $ret -ne 0 ] | ||||||
|  | then | ||||||
|  |     exit $ret | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | ln -s ../.. msgpack-c | ||||||
|  |  | ||||||
|  | ret=$? | ||||||
|  | if [ $ret -ne 0 ] | ||||||
|  | then | ||||||
|  |     exit $ret | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | mkdir build | ||||||
|  |  | ||||||
|  | ret=$? | ||||||
|  | if [ $ret -ne 0 ] | ||||||
|  | then | ||||||
|  |     exit $ret | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | cd build | ||||||
|  |  | ||||||
|  | ret=$? | ||||||
|  | if [ $ret -ne 0 ] | ||||||
|  | then | ||||||
|  |     exit $ret | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | cmake -DEXAMPLE_MSGPACK_EMBEDDED=ON .. | ||||||
|  |  | ||||||
|  | ret=$? | ||||||
|  | if [ $ret -ne 0 ] | ||||||
|  | then | ||||||
|  |     exit $ret | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | make example example-static | ||||||
|  |  | ||||||
|  | ret=$? | ||||||
|  | if [ $ret -ne 0 ] | ||||||
|  | then | ||||||
|  |     exit $ret | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | exit 0 | ||||||
| @@ -1,25 +0,0 @@ | |||||||
| #!/bin/bash |  | ||||||
|  |  | ||||||
| build_dir="$CXX-build" |  | ||||||
| mkdir $build_dir || exit 1 |  | ||||||
|  |  | ||||||
| if [ "${ARCH}" == "32" ] |  | ||||||
| then |  | ||||||
|     echo "64 bit support required for regressions" |  | ||||||
|     exit 1 |  | ||||||
| fi |  | ||||||
|  |  | ||||||
| cmake \ |  | ||||||
|     -D CMAKE_PREFIX_PATH="${HOME}/boost-prefix/${ARCH};${HOME}/zlib-prefix/${ARCH}" \ |  | ||||||
|     -D MSGPACK_FUZZ_REGRESSION="ON" \ |  | ||||||
|     -D ${MSGPACK_CXX_VERSION} \ |  | ||||||
|     -D MSGPACK_CHAR_SIGN=${CHAR_SIGN} \ |  | ||||||
|     -D MSGPACK_DEFAULT_API_VERSION=${API_VERSION} \ |  | ||||||
|     -D MSGPACK_USE_X3_PARSE=${X3_PARSE} \ |  | ||||||
|     -D CMAKE_CXX_FLAGS="${CXXFLAGS}" \ |  | ||||||
|     -B $build_dir \ |  | ||||||
|     -S . || exit 1 |  | ||||||
|  |  | ||||||
| cmake --build $build_dir --target all || exit 1 |  | ||||||
|  |  | ||||||
| ctest -VV --test-dir $build_dir || exit 1 |  | ||||||
| @@ -1,17 +0,0 @@ | |||||||
| #!/bin/bash |  | ||||||
|  |  | ||||||
| version=10 |  | ||||||
| priority=100 |  | ||||||
|  |  | ||||||
| sudo update-alternatives --install /usr/bin/gcc         gcc         /usr/bin/gcc-${version}         ${priority} |  | ||||||
| sudo update-alternatives --install /usr/bin/gcc-ar      gcc-ar      /usr/bin/gcc-ar-${version}      ${priority} |  | ||||||
| sudo update-alternatives --install /usr/bin/gcc-nm      gcc-nm      /usr/bin/gcc-nm-${version}      ${priority} |  | ||||||
| sudo update-alternatives --install /usr/bin/gcc-ranlib  gcc-ranlib  /usr/bin/gcc-ranlib-${version}  ${priority} |  | ||||||
| sudo update-alternatives --install /usr/bin/gcov        gcov        /usr/bin/gcov-${version}        ${priority} |  | ||||||
| sudo update-alternatives --install /usr/bin/gcov-dump   gcov-dump   /usr/bin/gcov-dump-${version}   ${priority} |  | ||||||
| sudo update-alternatives --install /usr/bin/gcov-tool   gcov-tool   /usr/bin/gcov-tool-${version}   ${priority} |  | ||||||
| sudo update-alternatives --install /usr/bin/lto-dump    lto-dump    /usr/bin/lto-dump-${version}    ${priority} |  | ||||||
| sudo update-alternatives --install /usr/bin/g++         g++         /usr/bin/g++-${version}         ${priority} |  | ||||||
|  |  | ||||||
| sudo update-alternatives --install /usr/bin/cc   cc   /usr/bin/gcc-${version} ${priority} |  | ||||||
| sudo update-alternatives --install /usr/bin/c++  c++  /usr/bin/g++-${version} ${priority} |  | ||||||
							
								
								
									
										952
									
								
								cmake/pack_template.h.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										952
									
								
								cmake/pack_template.h.in
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,952 @@ | |||||||
|  | /* | ||||||
|  |  * MessagePack packing routine template | ||||||
|  |  * | ||||||
|  |  * Copyright (C) 2008-2010 FURUHASHI Sadayuki | ||||||
|  |  * | ||||||
|  |  *    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_ENDIAN_BIG_BYTE | ||||||
|  | #define MSGPACK_ENDIAN_BIG_BYTE @MSGPACK_ENDIAN_BIG_BYTE@ | ||||||
|  | #endif | ||||||
|  | #ifndef MSGPACK_ENDIAN_LITTLE_BYTE | ||||||
|  | #define MSGPACK_ENDIAN_LITTLE_BYTE @MSGPACK_ENDIAN_LITTLE_BYTE@ | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if MSGPACK_ENDIAN_LITTLE_BYTE | ||||||
|  | #define TAKE8_8(d)  ((uint8_t*)&d)[0] | ||||||
|  | #define TAKE8_16(d) ((uint8_t*)&d)[0] | ||||||
|  | #define TAKE8_32(d) ((uint8_t*)&d)[0] | ||||||
|  | #define TAKE8_64(d) ((uint8_t*)&d)[0] | ||||||
|  | #elif MSGPACK_ENDIAN_BIG_BYTE | ||||||
|  | #define TAKE8_8(d)  ((uint8_t*)&d)[0] | ||||||
|  | #define TAKE8_16(d) ((uint8_t*)&d)[1] | ||||||
|  | #define TAKE8_32(d) ((uint8_t*)&d)[3] | ||||||
|  | #define TAKE8_64(d) ((uint8_t*)&d)[7] | ||||||
|  | #else | ||||||
|  | #error msgpack-c supports only big endian and little endian | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #ifndef msgpack_pack_inline_func | ||||||
|  | #error msgpack_pack_inline_func template is not defined | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #ifndef msgpack_pack_user | ||||||
|  | #error msgpack_pack_user type is not defined | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #ifndef msgpack_pack_append_buffer | ||||||
|  | #error msgpack_pack_append_buffer callback is not defined | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(_MSC_VER) | ||||||
|  | #   pragma warning(push) | ||||||
|  | #   pragma warning(disable : 4204)   /* nonstandard extension used: non-constant aggregate initializer */ | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * Integer | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #define msgpack_pack_real_uint8(x, d) \ | ||||||
|  | do { \ | ||||||
|  |     if(d < (1<<7)) { \ | ||||||
|  |         /* fixnum */ \ | ||||||
|  |         msgpack_pack_append_buffer(x, &TAKE8_8(d), 1); \ | ||||||
|  |     } else { \ | ||||||
|  |         /* unsigned 8 */ \ | ||||||
|  |         unsigned char buf[2] = {0xcc, TAKE8_8(d)}; \ | ||||||
|  |         msgpack_pack_append_buffer(x, buf, 2); \ | ||||||
|  |     } \ | ||||||
|  | } while(0) | ||||||
|  |  | ||||||
|  | #define msgpack_pack_real_uint16(x, d) \ | ||||||
|  | do { \ | ||||||
|  |     if(d < (1<<7)) { \ | ||||||
|  |         /* fixnum */ \ | ||||||
|  |         msgpack_pack_append_buffer(x, &TAKE8_16(d), 1); \ | ||||||
|  |     } else if(d < (1<<8)) { \ | ||||||
|  |         /* unsigned 8 */ \ | ||||||
|  |         unsigned char buf[2] = {0xcc, TAKE8_16(d)}; \ | ||||||
|  |         msgpack_pack_append_buffer(x, buf, 2); \ | ||||||
|  |     } else { \ | ||||||
|  |         /* unsigned 16 */ \ | ||||||
|  |         unsigned char buf[3]; \ | ||||||
|  |         buf[0] = 0xcd; _msgpack_store16(&buf[1], (uint16_t)d); \ | ||||||
|  |         msgpack_pack_append_buffer(x, buf, 3); \ | ||||||
|  |     } \ | ||||||
|  | } while(0) | ||||||
|  |  | ||||||
|  | #define msgpack_pack_real_uint32(x, d) \ | ||||||
|  | do { \ | ||||||
|  |     if(d < (1<<8)) { \ | ||||||
|  |         if(d < (1<<7)) { \ | ||||||
|  |             /* fixnum */ \ | ||||||
|  |             msgpack_pack_append_buffer(x, &TAKE8_32(d), 1); \ | ||||||
|  |         } else { \ | ||||||
|  |             /* unsigned 8 */ \ | ||||||
|  |             unsigned char buf[2] = {0xcc, TAKE8_32(d)}; \ | ||||||
|  |             msgpack_pack_append_buffer(x, buf, 2); \ | ||||||
|  |         } \ | ||||||
|  |     } else { \ | ||||||
|  |         if(d < (1<<16)) { \ | ||||||
|  |             /* unsigned 16 */ \ | ||||||
|  |             unsigned char buf[3]; \ | ||||||
|  |             buf[0] = 0xcd; _msgpack_store16(&buf[1], (uint16_t)d); \ | ||||||
|  |             msgpack_pack_append_buffer(x, buf, 3); \ | ||||||
|  |         } else { \ | ||||||
|  |             /* unsigned 32 */ \ | ||||||
|  |             unsigned char buf[5]; \ | ||||||
|  |             buf[0] = 0xce; _msgpack_store32(&buf[1], (uint32_t)d); \ | ||||||
|  |             msgpack_pack_append_buffer(x, buf, 5); \ | ||||||
|  |         } \ | ||||||
|  |     } \ | ||||||
|  | } while(0) | ||||||
|  |  | ||||||
|  | #define msgpack_pack_real_uint64(x, d) \ | ||||||
|  | do { \ | ||||||
|  |     if(d < (1ULL<<8)) { \ | ||||||
|  |         if(d < (1ULL<<7)) { \ | ||||||
|  |             /* fixnum */ \ | ||||||
|  |             msgpack_pack_append_buffer(x, &TAKE8_64(d), 1); \ | ||||||
|  |         } else { \ | ||||||
|  |             /* unsigned 8 */ \ | ||||||
|  |             unsigned char buf[2] = {0xcc, TAKE8_64(d)}; \ | ||||||
|  |             msgpack_pack_append_buffer(x, buf, 2); \ | ||||||
|  |         } \ | ||||||
|  |     } else { \ | ||||||
|  |         if(d < (1ULL<<16)) { \ | ||||||
|  |             /* unsigned 16 */ \ | ||||||
|  |             unsigned char buf[3]; \ | ||||||
|  |             buf[0] = 0xcd; _msgpack_store16(&buf[1], (uint16_t)d); \ | ||||||
|  |             msgpack_pack_append_buffer(x, buf, 3); \ | ||||||
|  |         } else if(d < (1ULL<<32)) { \ | ||||||
|  |             /* unsigned 32 */ \ | ||||||
|  |             unsigned char buf[5]; \ | ||||||
|  |             buf[0] = 0xce; _msgpack_store32(&buf[1], (uint32_t)d); \ | ||||||
|  |             msgpack_pack_append_buffer(x, buf, 5); \ | ||||||
|  |         } else { \ | ||||||
|  |             /* unsigned 64 */ \ | ||||||
|  |             unsigned char buf[9]; \ | ||||||
|  |             buf[0] = 0xcf; _msgpack_store64(&buf[1], d); \ | ||||||
|  |             msgpack_pack_append_buffer(x, buf, 9); \ | ||||||
|  |         } \ | ||||||
|  |     } \ | ||||||
|  | } while(0) | ||||||
|  |  | ||||||
|  | #define msgpack_pack_real_int8(x, d) \ | ||||||
|  | do { \ | ||||||
|  |     if(d < -(1<<5)) { \ | ||||||
|  |         /* signed 8 */ \ | ||||||
|  |         unsigned char buf[2] = {0xd0, TAKE8_8(d)}; \ | ||||||
|  |         msgpack_pack_append_buffer(x, buf, 2); \ | ||||||
|  |     } else { \ | ||||||
|  |         /* fixnum */ \ | ||||||
|  |         msgpack_pack_append_buffer(x, &TAKE8_8(d), 1); \ | ||||||
|  |     } \ | ||||||
|  | } while(0) | ||||||
|  |  | ||||||
|  | #define msgpack_pack_real_int16(x, d) \ | ||||||
|  | do { \ | ||||||
|  |     if(d < -(1<<5)) { \ | ||||||
|  |         if(d < -(1<<7)) { \ | ||||||
|  |             /* signed 16 */ \ | ||||||
|  |             unsigned char buf[3]; \ | ||||||
|  |             buf[0] = 0xd1; _msgpack_store16(&buf[1], (int16_t)d); \ | ||||||
|  |             msgpack_pack_append_buffer(x, buf, 3); \ | ||||||
|  |         } else { \ | ||||||
|  |             /* signed 8 */ \ | ||||||
|  |             unsigned char buf[2] = {0xd0, TAKE8_16(d)}; \ | ||||||
|  |             msgpack_pack_append_buffer(x, buf, 2); \ | ||||||
|  |         } \ | ||||||
|  |     } else if(d < (1<<7)) { \ | ||||||
|  |         /* fixnum */ \ | ||||||
|  |         msgpack_pack_append_buffer(x, &TAKE8_16(d), 1); \ | ||||||
|  |     } else { \ | ||||||
|  |         if(d < (1<<8)) { \ | ||||||
|  |             /* unsigned 8 */ \ | ||||||
|  |             unsigned char buf[2] = {0xcc, TAKE8_16(d)}; \ | ||||||
|  |             msgpack_pack_append_buffer(x, buf, 2); \ | ||||||
|  |         } else { \ | ||||||
|  |             /* unsigned 16 */ \ | ||||||
|  |             unsigned char buf[3]; \ | ||||||
|  |             buf[0] = 0xcd; _msgpack_store16(&buf[1], (uint16_t)d); \ | ||||||
|  |             msgpack_pack_append_buffer(x, buf, 3); \ | ||||||
|  |         } \ | ||||||
|  |     } \ | ||||||
|  | } while(0) | ||||||
|  |  | ||||||
|  | #define msgpack_pack_real_int32(x, d) \ | ||||||
|  | do { \ | ||||||
|  |     if(d < -(1<<5)) { \ | ||||||
|  |         if(d < -(1<<15)) { \ | ||||||
|  |             /* signed 32 */ \ | ||||||
|  |             unsigned char buf[5]; \ | ||||||
|  |             buf[0] = 0xd2; _msgpack_store32(&buf[1], (int32_t)d); \ | ||||||
|  |             msgpack_pack_append_buffer(x, buf, 5); \ | ||||||
|  |         } else if(d < -(1<<7)) { \ | ||||||
|  |             /* signed 16 */ \ | ||||||
|  |             unsigned char buf[3]; \ | ||||||
|  |             buf[0] = 0xd1; _msgpack_store16(&buf[1], (int16_t)d); \ | ||||||
|  |             msgpack_pack_append_buffer(x, buf, 3); \ | ||||||
|  |         } else { \ | ||||||
|  |             /* signed 8 */ \ | ||||||
|  |             unsigned char buf[2] = {0xd0, TAKE8_32(d)}; \ | ||||||
|  |             msgpack_pack_append_buffer(x, buf, 2); \ | ||||||
|  |         } \ | ||||||
|  |     } else if(d < (1<<7)) { \ | ||||||
|  |         /* fixnum */ \ | ||||||
|  |         msgpack_pack_append_buffer(x, &TAKE8_32(d), 1); \ | ||||||
|  |     } else { \ | ||||||
|  |         if(d < (1<<8)) { \ | ||||||
|  |             /* unsigned 8 */ \ | ||||||
|  |             unsigned char buf[2] = {0xcc, TAKE8_32(d)}; \ | ||||||
|  |             msgpack_pack_append_buffer(x, buf, 2); \ | ||||||
|  |         } else if(d < (1<<16)) { \ | ||||||
|  |             /* unsigned 16 */ \ | ||||||
|  |             unsigned char buf[3]; \ | ||||||
|  |             buf[0] = 0xcd; _msgpack_store16(&buf[1], (uint16_t)d); \ | ||||||
|  |             msgpack_pack_append_buffer(x, buf, 3); \ | ||||||
|  |         } else { \ | ||||||
|  |             /* unsigned 32 */ \ | ||||||
|  |             unsigned char buf[5]; \ | ||||||
|  |             buf[0] = 0xce; _msgpack_store32(&buf[1], (uint32_t)d); \ | ||||||
|  |             msgpack_pack_append_buffer(x, buf, 5); \ | ||||||
|  |         } \ | ||||||
|  |     } \ | ||||||
|  | } while(0) | ||||||
|  |  | ||||||
|  | #define msgpack_pack_real_int64(x, d) \ | ||||||
|  | do { \ | ||||||
|  |     if(d < -(1LL<<5)) { \ | ||||||
|  |         if(d < -(1LL<<15)) { \ | ||||||
|  |             if(d < -(1LL<<31)) { \ | ||||||
|  |                 /* signed 64 */ \ | ||||||
|  |                 unsigned char buf[9]; \ | ||||||
|  |                 buf[0] = 0xd3; _msgpack_store64(&buf[1], d); \ | ||||||
|  |                 msgpack_pack_append_buffer(x, buf, 9); \ | ||||||
|  |             } else { \ | ||||||
|  |                 /* signed 32 */ \ | ||||||
|  |                 unsigned char buf[5]; \ | ||||||
|  |                 buf[0] = 0xd2; _msgpack_store32(&buf[1], (int32_t)d); \ | ||||||
|  |                 msgpack_pack_append_buffer(x, buf, 5); \ | ||||||
|  |             } \ | ||||||
|  |         } else { \ | ||||||
|  |             if(d < -(1<<7)) { \ | ||||||
|  |                 /* signed 16 */ \ | ||||||
|  |                 unsigned char buf[3]; \ | ||||||
|  |                 buf[0] = 0xd1; _msgpack_store16(&buf[1], (int16_t)d); \ | ||||||
|  |                 msgpack_pack_append_buffer(x, buf, 3); \ | ||||||
|  |             } else { \ | ||||||
|  |                 /* signed 8 */ \ | ||||||
|  |                 unsigned char buf[2] = {0xd0, TAKE8_64(d)}; \ | ||||||
|  |                 msgpack_pack_append_buffer(x, buf, 2); \ | ||||||
|  |             } \ | ||||||
|  |         } \ | ||||||
|  |     } else if(d < (1<<7)) { \ | ||||||
|  |         /* fixnum */ \ | ||||||
|  |         msgpack_pack_append_buffer(x, &TAKE8_64(d), 1); \ | ||||||
|  |     } else { \ | ||||||
|  |         if(d < (1LL<<16)) { \ | ||||||
|  |             if(d < (1<<8)) { \ | ||||||
|  |                 /* unsigned 8 */ \ | ||||||
|  |                 unsigned char buf[2] = {0xcc, TAKE8_64(d)}; \ | ||||||
|  |                 msgpack_pack_append_buffer(x, buf, 2); \ | ||||||
|  |             } else { \ | ||||||
|  |                 /* unsigned 16 */ \ | ||||||
|  |                 unsigned char buf[3]; \ | ||||||
|  |                 buf[0] = 0xcd; _msgpack_store16(&buf[1], (uint16_t)d); \ | ||||||
|  |                 msgpack_pack_append_buffer(x, buf, 3); \ | ||||||
|  |             } \ | ||||||
|  |         } else { \ | ||||||
|  |             if(d < (1LL<<32)) { \ | ||||||
|  |                 /* unsigned 32 */ \ | ||||||
|  |                 unsigned char buf[5]; \ | ||||||
|  |                 buf[0] = 0xce; _msgpack_store32(&buf[1], (uint32_t)d); \ | ||||||
|  |                 msgpack_pack_append_buffer(x, buf, 5); \ | ||||||
|  |             } else { \ | ||||||
|  |                 /* unsigned 64 */ \ | ||||||
|  |                 unsigned char buf[9]; \ | ||||||
|  |                 buf[0] = 0xcf; _msgpack_store64(&buf[1], d); \ | ||||||
|  |                 msgpack_pack_append_buffer(x, buf, 9); \ | ||||||
|  |             } \ | ||||||
|  |         } \ | ||||||
|  |     } \ | ||||||
|  | } while(0) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #ifdef msgpack_pack_inline_func_fixint | ||||||
|  |  | ||||||
|  | msgpack_pack_inline_func_fixint(_uint8)(msgpack_pack_user x, uint8_t d) | ||||||
|  | { | ||||||
|  |     unsigned char buf[2] = {0xcc, TAKE8_8(d)}; | ||||||
|  |     msgpack_pack_append_buffer(x, buf, 2); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | msgpack_pack_inline_func_fixint(_uint16)(msgpack_pack_user x, uint16_t d) | ||||||
|  | { | ||||||
|  |     unsigned char buf[3]; | ||||||
|  |     buf[0] = 0xcd; _msgpack_store16(&buf[1], d); | ||||||
|  |     msgpack_pack_append_buffer(x, buf, 3); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | msgpack_pack_inline_func_fixint(_uint32)(msgpack_pack_user x, uint32_t d) | ||||||
|  | { | ||||||
|  |     unsigned char buf[5]; | ||||||
|  |     buf[0] = 0xce; _msgpack_store32(&buf[1], d); | ||||||
|  |     msgpack_pack_append_buffer(x, buf, 5); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | msgpack_pack_inline_func_fixint(_uint64)(msgpack_pack_user x, uint64_t d) | ||||||
|  | { | ||||||
|  |     unsigned char buf[9]; | ||||||
|  |     buf[0] = 0xcf; _msgpack_store64(&buf[1], d); | ||||||
|  |     msgpack_pack_append_buffer(x, buf, 9); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | msgpack_pack_inline_func_fixint(_int8)(msgpack_pack_user x, int8_t d) | ||||||
|  | { | ||||||
|  |     unsigned char buf[2] = {0xd0, TAKE8_8(d)}; | ||||||
|  |     msgpack_pack_append_buffer(x, buf, 2); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | msgpack_pack_inline_func_fixint(_int16)(msgpack_pack_user x, int16_t d) | ||||||
|  | { | ||||||
|  |     unsigned char buf[3]; | ||||||
|  |     buf[0] = 0xd1; _msgpack_store16(&buf[1], d); | ||||||
|  |     msgpack_pack_append_buffer(x, buf, 3); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | msgpack_pack_inline_func_fixint(_int32)(msgpack_pack_user x, int32_t d) | ||||||
|  | { | ||||||
|  |     unsigned char buf[5]; | ||||||
|  |     buf[0] = 0xd2; _msgpack_store32(&buf[1], d); | ||||||
|  |     msgpack_pack_append_buffer(x, buf, 5); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | msgpack_pack_inline_func_fixint(_int64)(msgpack_pack_user x, int64_t d) | ||||||
|  | { | ||||||
|  |     unsigned char buf[9]; | ||||||
|  |     buf[0] = 0xd3; _msgpack_store64(&buf[1], d); | ||||||
|  |     msgpack_pack_append_buffer(x, buf, 9); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #undef msgpack_pack_inline_func_fixint | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  | msgpack_pack_inline_func(_uint8)(msgpack_pack_user x, uint8_t d) | ||||||
|  | { | ||||||
|  |     msgpack_pack_real_uint8(x, d); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | msgpack_pack_inline_func(_uint16)(msgpack_pack_user x, uint16_t d) | ||||||
|  | { | ||||||
|  |     msgpack_pack_real_uint16(x, d); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | msgpack_pack_inline_func(_uint32)(msgpack_pack_user x, uint32_t d) | ||||||
|  | { | ||||||
|  |     msgpack_pack_real_uint32(x, d); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | msgpack_pack_inline_func(_uint64)(msgpack_pack_user x, uint64_t d) | ||||||
|  | { | ||||||
|  |     msgpack_pack_real_uint64(x, d); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | msgpack_pack_inline_func(_int8)(msgpack_pack_user x, int8_t d) | ||||||
|  | { | ||||||
|  |     msgpack_pack_real_int8(x, d); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | msgpack_pack_inline_func(_int16)(msgpack_pack_user x, int16_t d) | ||||||
|  | { | ||||||
|  |     msgpack_pack_real_int16(x, d); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | msgpack_pack_inline_func(_int32)(msgpack_pack_user x, int32_t d) | ||||||
|  | { | ||||||
|  |     msgpack_pack_real_int32(x, d); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | msgpack_pack_inline_func(_int64)(msgpack_pack_user x, int64_t d) | ||||||
|  | { | ||||||
|  |     msgpack_pack_real_int64(x, d); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | msgpack_pack_inline_func(_char)(msgpack_pack_user x, char d) | ||||||
|  | { | ||||||
|  | #if defined(CHAR_MIN) | ||||||
|  | #if CHAR_MIN < 0 | ||||||
|  |         msgpack_pack_real_int8(x, d); | ||||||
|  | #else | ||||||
|  |         msgpack_pack_real_uint8(x, d); | ||||||
|  | #endif | ||||||
|  | #else | ||||||
|  | #error CHAR_MIN is not defined | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  |  | ||||||
|  | msgpack_pack_inline_func(_signed_char)(msgpack_pack_user x, signed char d) | ||||||
|  | { | ||||||
|  |     msgpack_pack_real_int8(x, d); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | msgpack_pack_inline_func(_unsigned_char)(msgpack_pack_user x, unsigned char d) | ||||||
|  | { | ||||||
|  |     msgpack_pack_real_uint8(x, d); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #ifdef msgpack_pack_inline_func_cint | ||||||
|  |  | ||||||
|  | msgpack_pack_inline_func_cint(_short)(msgpack_pack_user x, short d) | ||||||
|  | { | ||||||
|  | #if defined(SIZEOF_SHORT) | ||||||
|  | #if SIZEOF_SHORT == 2 | ||||||
|  |     msgpack_pack_real_int16(x, d); | ||||||
|  | #elif SIZEOF_SHORT == 4 | ||||||
|  |     msgpack_pack_real_int32(x, d); | ||||||
|  | #else | ||||||
|  |     msgpack_pack_real_int64(x, d); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #elif defined(SHRT_MAX) | ||||||
|  | #if SHRT_MAX == 0x7fff | ||||||
|  |     msgpack_pack_real_int16(x, d); | ||||||
|  | #elif SHRT_MAX == 0x7fffffff | ||||||
|  |     msgpack_pack_real_int32(x, d); | ||||||
|  | #else | ||||||
|  |     msgpack_pack_real_int64(x, d); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #else | ||||||
|  | if(sizeof(short) == 2) { | ||||||
|  |     msgpack_pack_real_int16(x, d); | ||||||
|  | } else if(sizeof(short) == 4) { | ||||||
|  |     msgpack_pack_real_int32(x, d); | ||||||
|  | } else { | ||||||
|  |     msgpack_pack_real_int64(x, d); | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  |  | ||||||
|  | msgpack_pack_inline_func_cint(_int)(msgpack_pack_user x, int d) | ||||||
|  | { | ||||||
|  | #if defined(SIZEOF_INT) | ||||||
|  | #if SIZEOF_INT == 2 | ||||||
|  |     msgpack_pack_real_int16(x, d); | ||||||
|  | #elif SIZEOF_INT == 4 | ||||||
|  |     msgpack_pack_real_int32(x, d); | ||||||
|  | #else | ||||||
|  |     msgpack_pack_real_int64(x, d); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #elif defined(INT_MAX) | ||||||
|  | #if INT_MAX == 0x7fff | ||||||
|  |     msgpack_pack_real_int16(x, d); | ||||||
|  | #elif INT_MAX == 0x7fffffff | ||||||
|  |     msgpack_pack_real_int32(x, d); | ||||||
|  | #else | ||||||
|  |     msgpack_pack_real_int64(x, d); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #else | ||||||
|  | if(sizeof(int) == 2) { | ||||||
|  |     msgpack_pack_real_int16(x, d); | ||||||
|  | } else if(sizeof(int) == 4) { | ||||||
|  |     msgpack_pack_real_int32(x, d); | ||||||
|  | } else { | ||||||
|  |     msgpack_pack_real_int64(x, d); | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  |  | ||||||
|  | msgpack_pack_inline_func_cint(_long)(msgpack_pack_user x, long d) | ||||||
|  | { | ||||||
|  | #if defined(SIZEOF_LONG) | ||||||
|  | #if SIZEOF_LONG == 2 | ||||||
|  |     msgpack_pack_real_int16(x, d); | ||||||
|  | #elif SIZEOF_LONG == 4 | ||||||
|  |     msgpack_pack_real_int32(x, d); | ||||||
|  | #else | ||||||
|  |     msgpack_pack_real_int64(x, d); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #elif defined(LONG_MAX) | ||||||
|  | #if LONG_MAX == 0x7fffL | ||||||
|  |     msgpack_pack_real_int16(x, d); | ||||||
|  | #elif LONG_MAX == 0x7fffffffL | ||||||
|  |     msgpack_pack_real_int32(x, d); | ||||||
|  | #else | ||||||
|  |     msgpack_pack_real_int64(x, d); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #else | ||||||
|  | if(sizeof(long) == 2) { | ||||||
|  |     msgpack_pack_real_int16(x, d); | ||||||
|  | } else if(sizeof(long) == 4) { | ||||||
|  |     msgpack_pack_real_int32(x, d); | ||||||
|  | } else { | ||||||
|  |     msgpack_pack_real_int64(x, d); | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  |  | ||||||
|  | msgpack_pack_inline_func_cint(_long_long)(msgpack_pack_user x, long long d) | ||||||
|  | { | ||||||
|  | #if defined(SIZEOF_LONG_LONG) | ||||||
|  | #if SIZEOF_LONG_LONG == 2 | ||||||
|  |     msgpack_pack_real_int16(x, d); | ||||||
|  | #elif SIZEOF_LONG_LONG == 4 | ||||||
|  |     msgpack_pack_real_int32(x, d); | ||||||
|  | #else | ||||||
|  |     msgpack_pack_real_int64(x, d); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #elif defined(LLONG_MAX) | ||||||
|  | #if LLONG_MAX == 0x7fffL | ||||||
|  |     msgpack_pack_real_int16(x, d); | ||||||
|  | #elif LLONG_MAX == 0x7fffffffL | ||||||
|  |     msgpack_pack_real_int32(x, d); | ||||||
|  | #else | ||||||
|  |     msgpack_pack_real_int64(x, d); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #else | ||||||
|  | if(sizeof(long long) == 2) { | ||||||
|  |     msgpack_pack_real_int16(x, d); | ||||||
|  | } else if(sizeof(long long) == 4) { | ||||||
|  |     msgpack_pack_real_int32(x, d); | ||||||
|  | } else { | ||||||
|  |     msgpack_pack_real_int64(x, d); | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  |  | ||||||
|  | msgpack_pack_inline_func_cint(_unsigned_short)(msgpack_pack_user x, unsigned short d) | ||||||
|  | { | ||||||
|  | #if defined(SIZEOF_SHORT) | ||||||
|  | #if SIZEOF_SHORT == 2 | ||||||
|  |     msgpack_pack_real_uint16(x, d); | ||||||
|  | #elif SIZEOF_SHORT == 4 | ||||||
|  |     msgpack_pack_real_uint32(x, d); | ||||||
|  | #else | ||||||
|  |     msgpack_pack_real_uint64(x, d); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #elif defined(USHRT_MAX) | ||||||
|  | #if USHRT_MAX == 0xffffU | ||||||
|  |     msgpack_pack_real_uint16(x, d); | ||||||
|  | #elif USHRT_MAX == 0xffffffffU | ||||||
|  |     msgpack_pack_real_uint32(x, d); | ||||||
|  | #else | ||||||
|  |     msgpack_pack_real_uint64(x, d); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #else | ||||||
|  | if(sizeof(unsigned short) == 2) { | ||||||
|  |     msgpack_pack_real_uint16(x, d); | ||||||
|  | } else if(sizeof(unsigned short) == 4) { | ||||||
|  |     msgpack_pack_real_uint32(x, d); | ||||||
|  | } else { | ||||||
|  |     msgpack_pack_real_uint64(x, d); | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  |  | ||||||
|  | msgpack_pack_inline_func_cint(_unsigned_int)(msgpack_pack_user x, unsigned int d) | ||||||
|  | { | ||||||
|  | #if defined(SIZEOF_INT) | ||||||
|  | #if SIZEOF_INT == 2 | ||||||
|  |     msgpack_pack_real_uint16(x, d); | ||||||
|  | #elif SIZEOF_INT == 4 | ||||||
|  |     msgpack_pack_real_uint32(x, d); | ||||||
|  | #else | ||||||
|  |     msgpack_pack_real_uint64(x, d); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #elif defined(UINT_MAX) | ||||||
|  | #if UINT_MAX == 0xffffU | ||||||
|  |     msgpack_pack_real_uint16(x, d); | ||||||
|  | #elif UINT_MAX == 0xffffffffU | ||||||
|  |     msgpack_pack_real_uint32(x, d); | ||||||
|  | #else | ||||||
|  |     msgpack_pack_real_uint64(x, d); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #else | ||||||
|  | if(sizeof(unsigned int) == 2) { | ||||||
|  |     msgpack_pack_real_uint16(x, d); | ||||||
|  | } else if(sizeof(unsigned int) == 4) { | ||||||
|  |     msgpack_pack_real_uint32(x, d); | ||||||
|  | } else { | ||||||
|  |     msgpack_pack_real_uint64(x, d); | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  |  | ||||||
|  | msgpack_pack_inline_func_cint(_unsigned_long)(msgpack_pack_user x, unsigned long d) | ||||||
|  | { | ||||||
|  | #if defined(SIZEOF_LONG) | ||||||
|  | #if SIZEOF_LONG == 2 | ||||||
|  |     msgpack_pack_real_uint16(x, d); | ||||||
|  | #elif SIZEOF_LONG == 4 | ||||||
|  |     msgpack_pack_real_uint32(x, d); | ||||||
|  | #else | ||||||
|  |     msgpack_pack_real_uint64(x, d); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #elif defined(ULONG_MAX) | ||||||
|  | #if ULONG_MAX == 0xffffUL | ||||||
|  |     msgpack_pack_real_uint16(x, d); | ||||||
|  | #elif ULONG_MAX == 0xffffffffUL | ||||||
|  |     msgpack_pack_real_uint32(x, d); | ||||||
|  | #else | ||||||
|  |     msgpack_pack_real_uint64(x, d); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #else | ||||||
|  | if(sizeof(unsigned long) == 2) { | ||||||
|  |     msgpack_pack_real_uint16(x, d); | ||||||
|  | } else if(sizeof(unsigned long) == 4) { | ||||||
|  |     msgpack_pack_real_uint32(x, d); | ||||||
|  | } else { | ||||||
|  |     msgpack_pack_real_uint64(x, d); | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  |  | ||||||
|  | msgpack_pack_inline_func_cint(_unsigned_long_long)(msgpack_pack_user x, unsigned long long d) | ||||||
|  | { | ||||||
|  | #if defined(SIZEOF_LONG_LONG) | ||||||
|  | #if SIZEOF_LONG_LONG == 2 | ||||||
|  |     msgpack_pack_real_uint16(x, d); | ||||||
|  | #elif SIZEOF_LONG_LONG == 4 | ||||||
|  |     msgpack_pack_real_uint32(x, d); | ||||||
|  | #else | ||||||
|  |     msgpack_pack_real_uint64(x, d); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #elif defined(ULLONG_MAX) | ||||||
|  | #if ULLONG_MAX == 0xffffUL | ||||||
|  |     msgpack_pack_real_uint16(x, d); | ||||||
|  | #elif ULLONG_MAX == 0xffffffffUL | ||||||
|  |     msgpack_pack_real_uint32(x, d); | ||||||
|  | #else | ||||||
|  |     msgpack_pack_real_uint64(x, d); | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #else | ||||||
|  | if(sizeof(unsigned long long) == 2) { | ||||||
|  |     msgpack_pack_real_uint16(x, d); | ||||||
|  | } else if(sizeof(unsigned long long) == 4) { | ||||||
|  |     msgpack_pack_real_uint32(x, d); | ||||||
|  | } else { | ||||||
|  |     msgpack_pack_real_uint64(x, d); | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #undef msgpack_pack_inline_func_cint | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * Float | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | msgpack_pack_inline_func(_float)(msgpack_pack_user x, float d) | ||||||
|  | { | ||||||
|  |     unsigned char buf[5]; | ||||||
|  |     union { float f; uint32_t i; } mem; | ||||||
|  |     mem.f = d; | ||||||
|  |     buf[0] = 0xca; _msgpack_store32(&buf[1], mem.i); | ||||||
|  |     msgpack_pack_append_buffer(x, buf, 5); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | msgpack_pack_inline_func(_double)(msgpack_pack_user x, double d) | ||||||
|  | { | ||||||
|  |     unsigned char buf[9]; | ||||||
|  |     union { double f; uint64_t i; } mem; | ||||||
|  |     mem.f = d; | ||||||
|  |     buf[0] = 0xcb; | ||||||
|  | #if defined(TARGET_OS_IPHONE) | ||||||
|  |     // 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); | ||||||
|  | #endif | ||||||
|  |     _msgpack_store64(&buf[1], mem.i); | ||||||
|  |     msgpack_pack_append_buffer(x, buf, 9); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * Nil | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | msgpack_pack_inline_func(_nil)(msgpack_pack_user x) | ||||||
|  | { | ||||||
|  |     static const unsigned char d = 0xc0; | ||||||
|  |     msgpack_pack_append_buffer(x, &d, 1); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * Boolean | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | msgpack_pack_inline_func(_true)(msgpack_pack_user x) | ||||||
|  | { | ||||||
|  |     static const unsigned char d = 0xc3; | ||||||
|  |     msgpack_pack_append_buffer(x, &d, 1); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | msgpack_pack_inline_func(_false)(msgpack_pack_user x) | ||||||
|  | { | ||||||
|  |     static const unsigned char d = 0xc2; | ||||||
|  |     msgpack_pack_append_buffer(x, &d, 1); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * Array | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | msgpack_pack_inline_func(_array)(msgpack_pack_user x, size_t n) | ||||||
|  | { | ||||||
|  |     if(n < 16) { | ||||||
|  |         unsigned char d = 0x90 | (uint8_t)n; | ||||||
|  |         msgpack_pack_append_buffer(x, &d, 1); | ||||||
|  |     } else if(n < 65536) { | ||||||
|  |         unsigned char buf[3]; | ||||||
|  |         buf[0] = 0xdc; _msgpack_store16(&buf[1], (uint16_t)n); | ||||||
|  |         msgpack_pack_append_buffer(x, buf, 3); | ||||||
|  |     } else { | ||||||
|  |         unsigned char buf[5]; | ||||||
|  |         buf[0] = 0xdd; _msgpack_store32(&buf[1], (uint32_t)n); | ||||||
|  |         msgpack_pack_append_buffer(x, buf, 5); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * Map | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | msgpack_pack_inline_func(_map)(msgpack_pack_user x, size_t n) | ||||||
|  | { | ||||||
|  |     if(n < 16) { | ||||||
|  |         unsigned char d = 0x80 | (uint8_t)n; | ||||||
|  |         msgpack_pack_append_buffer(x, &TAKE8_8(d), 1); | ||||||
|  |     } else if(n < 65536) { | ||||||
|  |         unsigned char buf[3]; | ||||||
|  |         buf[0] = 0xde; _msgpack_store16(&buf[1], (uint16_t)n); | ||||||
|  |         msgpack_pack_append_buffer(x, buf, 3); | ||||||
|  |     } else { | ||||||
|  |         unsigned char buf[5]; | ||||||
|  |         buf[0] = 0xdf; _msgpack_store32(&buf[1], (uint32_t)n); | ||||||
|  |         msgpack_pack_append_buffer(x, buf, 5); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * Str | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | msgpack_pack_inline_func(_str)(msgpack_pack_user x, size_t l) | ||||||
|  | { | ||||||
|  |     if(l < 32) { | ||||||
|  |         unsigned char d = 0xa0 | (uint8_t)l; | ||||||
|  |         msgpack_pack_append_buffer(x, &TAKE8_8(d), 1); | ||||||
|  |     } else if(l < 256) { | ||||||
|  |         unsigned char buf[2]; | ||||||
|  |         buf[0] = 0xd9; buf[1] = (uint8_t)l; | ||||||
|  |         msgpack_pack_append_buffer(x, buf, 2); | ||||||
|  |     } else if(l < 65536) { | ||||||
|  |         unsigned char buf[3]; | ||||||
|  |         buf[0] = 0xda; _msgpack_store16(&buf[1], (uint16_t)l); | ||||||
|  |         msgpack_pack_append_buffer(x, buf, 3); | ||||||
|  |     } else { | ||||||
|  |         unsigned char buf[5]; | ||||||
|  |         buf[0] = 0xdb; _msgpack_store32(&buf[1], (uint32_t)l); | ||||||
|  |         msgpack_pack_append_buffer(x, buf, 5); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | msgpack_pack_inline_func(_str_body)(msgpack_pack_user x, const void* b, size_t l) | ||||||
|  | { | ||||||
|  |     msgpack_pack_append_buffer(x, (const unsigned char*)b, l); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * Raw (V4) | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | msgpack_pack_inline_func(_v4raw)(msgpack_pack_user x, size_t l) | ||||||
|  | { | ||||||
|  |     if(l < 32) { | ||||||
|  |         unsigned char d = 0xa0 | (uint8_t)l; | ||||||
|  |         msgpack_pack_append_buffer(x, &TAKE8_8(d), 1); | ||||||
|  |     } else if(l < 65536) { | ||||||
|  |         unsigned char buf[3]; | ||||||
|  |         buf[0] = 0xda; _msgpack_store16(&buf[1], (uint16_t)l); | ||||||
|  |         msgpack_pack_append_buffer(x, buf, 3); | ||||||
|  |     } else { | ||||||
|  |         unsigned char buf[5]; | ||||||
|  |         buf[0] = 0xdb; _msgpack_store32(&buf[1], (uint32_t)l); | ||||||
|  |         msgpack_pack_append_buffer(x, buf, 5); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | msgpack_pack_inline_func(_v4raw_body)(msgpack_pack_user x, const void* b, size_t l) | ||||||
|  | { | ||||||
|  |     msgpack_pack_append_buffer(x, (const unsigned char*)b, l); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * Bin | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | msgpack_pack_inline_func(_bin)(msgpack_pack_user x, size_t l) | ||||||
|  | { | ||||||
|  |     if(l < 256) { | ||||||
|  |         unsigned char buf[2]; | ||||||
|  |         buf[0] = 0xc4; buf[1] = (uint8_t)l; | ||||||
|  |         msgpack_pack_append_buffer(x, buf, 2); | ||||||
|  |     } else if(l < 65536) { | ||||||
|  |         unsigned char buf[3]; | ||||||
|  |         buf[0] = 0xc5; _msgpack_store16(&buf[1], (uint16_t)l); | ||||||
|  |         msgpack_pack_append_buffer(x, buf, 3); | ||||||
|  |     } else { | ||||||
|  |         unsigned char buf[5]; | ||||||
|  |         buf[0] = 0xc6; _msgpack_store32(&buf[1], (uint32_t)l); | ||||||
|  |         msgpack_pack_append_buffer(x, buf, 5); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | msgpack_pack_inline_func(_bin_body)(msgpack_pack_user x, const void* b, size_t l) | ||||||
|  | { | ||||||
|  |     msgpack_pack_append_buffer(x, (const unsigned char*)b, l); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * Ext | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | msgpack_pack_inline_func(_ext)(msgpack_pack_user x, size_t l, int8_t type) | ||||||
|  | { | ||||||
|  |     switch(l) { | ||||||
|  |     case 1: { | ||||||
|  |         unsigned char buf[2]; | ||||||
|  |         buf[0] = 0xd4; | ||||||
|  |         buf[1] = (unsigned char)type; | ||||||
|  |         msgpack_pack_append_buffer(x, buf, 2); | ||||||
|  |     } break; | ||||||
|  |     case 2: { | ||||||
|  |         unsigned char buf[2]; | ||||||
|  |         buf[0] = 0xd5; | ||||||
|  |         buf[1] = (unsigned char)type; | ||||||
|  |         msgpack_pack_append_buffer(x, buf, 2); | ||||||
|  |     } break; | ||||||
|  |     case 4: { | ||||||
|  |         unsigned char buf[2]; | ||||||
|  |         buf[0] = 0xd6; | ||||||
|  |         buf[1] = (unsigned char)type; | ||||||
|  |         msgpack_pack_append_buffer(x, buf, 2); | ||||||
|  |     } break; | ||||||
|  |     case 8: { | ||||||
|  |         unsigned char buf[2]; | ||||||
|  |         buf[0] = 0xd7; | ||||||
|  |         buf[1] = (unsigned char)type; | ||||||
|  |         msgpack_pack_append_buffer(x, buf, 2); | ||||||
|  |     } break; | ||||||
|  |     case 16: { | ||||||
|  |         unsigned char buf[2]; | ||||||
|  |         buf[0] = 0xd8; | ||||||
|  |         buf[1] = (unsigned char)type; | ||||||
|  |         msgpack_pack_append_buffer(x, buf, 2); | ||||||
|  |     } break; | ||||||
|  |     default: | ||||||
|  |         if(l < 256) { | ||||||
|  |             unsigned char buf[3]; | ||||||
|  |             buf[0] = 0xc7; | ||||||
|  |             buf[1] = (unsigned char)l; | ||||||
|  |             buf[2] = (unsigned char)type; | ||||||
|  |             msgpack_pack_append_buffer(x, buf, 3); | ||||||
|  |         } else if(l < 65536) { | ||||||
|  |             unsigned char buf[4]; | ||||||
|  |             buf[0] = 0xc8; | ||||||
|  |             _msgpack_store16(&buf[1], l); | ||||||
|  |             buf[3] = (unsigned char)type; | ||||||
|  |             msgpack_pack_append_buffer(x, buf, 4); | ||||||
|  |         } else { | ||||||
|  |             unsigned char buf[6]; | ||||||
|  |             buf[0] = 0xc9; | ||||||
|  |             _msgpack_store32(&buf[1], l); | ||||||
|  |             buf[5] = (unsigned char)type; | ||||||
|  |             msgpack_pack_append_buffer(x, buf, 6); | ||||||
|  |         } | ||||||
|  |         break; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | msgpack_pack_inline_func(_ext_body)(msgpack_pack_user x, const void* b, size_t l) | ||||||
|  | { | ||||||
|  |     msgpack_pack_append_buffer(x, (const unsigned char*)b, l); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | msgpack_pack_inline_func(_timestamp)(msgpack_pack_user x, const msgpack_timestamp* d) | ||||||
|  | { | ||||||
|  |     if ((((int64_t)d->tv_sec) >> 34) == 0) { | ||||||
|  |         uint64_t data64 = ((uint64_t) d->tv_nsec << 34) | (uint64_t)d->tv_sec; | ||||||
|  |         if ((data64 & 0xffffffff00000000L) == 0)   { | ||||||
|  |             // timestamp 32 | ||||||
|  |             char buf[4]; | ||||||
|  |             uint32_t data32 = (uint32_t)data64; | ||||||
|  |             msgpack_pack_ext(x, 4, -1); | ||||||
|  |             _msgpack_store32(buf, data32); | ||||||
|  |             msgpack_pack_append_buffer(x, buf, 4); | ||||||
|  |         } else { | ||||||
|  |             // timestamp 64 | ||||||
|  |             char buf[8]; | ||||||
|  |             msgpack_pack_ext(x, 8, -1); | ||||||
|  |             _msgpack_store64(buf, data64); | ||||||
|  |             msgpack_pack_append_buffer(x, buf, 8); | ||||||
|  |         } | ||||||
|  |     } else  { | ||||||
|  |         // timestamp 96 | ||||||
|  |         char buf[12]; | ||||||
|  |         _msgpack_store32(&buf[0], d->tv_nsec); | ||||||
|  |         _msgpack_store64(&buf[4], d->tv_sec); | ||||||
|  |         msgpack_pack_ext(x, 12, -1); | ||||||
|  |         msgpack_pack_append_buffer(x, buf, 12); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #undef msgpack_pack_inline_func | ||||||
|  | #undef msgpack_pack_user | ||||||
|  | #undef msgpack_pack_append_buffer | ||||||
|  |  | ||||||
|  | #undef TAKE8_8 | ||||||
|  | #undef TAKE8_16 | ||||||
|  | #undef TAKE8_32 | ||||||
|  | #undef TAKE8_64 | ||||||
|  |  | ||||||
|  | #undef msgpack_pack_real_uint8 | ||||||
|  | #undef msgpack_pack_real_uint16 | ||||||
|  | #undef msgpack_pack_real_uint32 | ||||||
|  | #undef msgpack_pack_real_uint64 | ||||||
|  | #undef msgpack_pack_real_int8 | ||||||
|  | #undef msgpack_pack_real_int16 | ||||||
|  | #undef msgpack_pack_real_int32 | ||||||
|  | #undef msgpack_pack_real_int64 | ||||||
|  |  | ||||||
|  | #if defined(_MSC_VER) | ||||||
|  | #   pragma warning(pop) | ||||||
|  | #endif | ||||||
| @@ -7,12 +7,19 @@ | |||||||
|  *    (See accompanying file LICENSE_1_0.txt or copy at |  *    (See accompanying file LICENSE_1_0.txt or copy at | ||||||
|  *    http://www.boost.org/LICENSE_1_0.txt)
 |  *    http://www.boost.org/LICENSE_1_0.txt)
 | ||||||
|  */ |  */ | ||||||
| #ifndef MSGPACK_SYSDEP_HPP | #ifndef MSGPACK_SYSDEP_H | ||||||
| #define MSGPACK_SYSDEP_HPP | #define MSGPACK_SYSDEP_H | ||||||
| 
 | 
 | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
| #include <stddef.h> | #include <stddef.h> | ||||||
| 
 | 
 | ||||||
|  | #ifndef MSGPACK_ENDIAN_BIG_BYTE | ||||||
|  | #define MSGPACK_ENDIAN_BIG_BYTE @MSGPACK_ENDIAN_BIG_BYTE@ | ||||||
|  | #endif | ||||||
|  | #ifndef MSGPACK_ENDIAN_LITTLE_BYTE | ||||||
|  | #define MSGPACK_ENDIAN_LITTLE_BYTE @MSGPACK_ENDIAN_LITTLE_BYTE@ | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| #if defined(_MSC_VER) && _MSC_VER <= 1800 | #if defined(_MSC_VER) && _MSC_VER <= 1800 | ||||||
| #   define snprintf(buf, len, format,...) _snprintf_s(buf, len, _TRUNCATE, format, __VA_ARGS__) | #   define snprintf(buf, len, format,...) _snprintf_s(buf, len, _TRUNCATE, format, __VA_ARGS__) | ||||||
| #endif | #endif | ||||||
| @@ -67,7 +74,11 @@ | |||||||
| #endif | #endif | ||||||
| #elif defined(__GNUC__) && ((__GNUC__*10 + __GNUC_MINOR__) < 41) | #elif defined(__GNUC__) && ((__GNUC__*10 + __GNUC_MINOR__) < 41) | ||||||
| 
 | 
 | ||||||
| #   define _msgpack_atomic_counter_header "msgpack/gcc_atomic.hpp" | #   if defined(__cplusplus) | ||||||
|  | #       define _msgpack_atomic_counter_header "msgpack/gcc_atomic.hpp" | ||||||
|  | #   else | ||||||
|  | #       define _msgpack_atomic_counter_header "msgpack/gcc_atomic.h" | ||||||
|  | #   endif | ||||||
| 
 | 
 | ||||||
| #else | #else | ||||||
|     typedef unsigned int _msgpack_atomic_counter_t; |     typedef unsigned int _msgpack_atomic_counter_t; | ||||||
| @@ -77,12 +88,14 @@ | |||||||
| 
 | 
 | ||||||
| #ifdef _WIN32 | #ifdef _WIN32 | ||||||
| 
 | 
 | ||||||
|  | #   ifdef __cplusplus | ||||||
|     /* numeric_limits<T>::min,max */ |     /* numeric_limits<T>::min,max */ | ||||||
| #   ifdef max | #       ifdef max | ||||||
| #       undef max | #           undef max | ||||||
| #   endif | #       endif | ||||||
| #   ifdef min | #       ifdef min | ||||||
| #       undef min | #           undef min | ||||||
|  | #       endif | ||||||
| #   endif | #   endif | ||||||
| 
 | 
 | ||||||
| #elif defined(unix) || defined(__unix) || defined(__APPLE__) || defined(__OpenBSD__) | #elif defined(unix) || defined(__unix) || defined(__APPLE__) || defined(__OpenBSD__) | ||||||
| @@ -95,9 +108,7 @@ | |||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #if !defined(MSGPACK_ENDIAN_LITTLE_BYTE) && !defined(MSGPACK_ENDIAN_BIG_BYTE) | #if !defined(MSGPACK_ENDIAN_LITTLE_BYTE) && !defined(MSGPACK_ENDIAN_BIG_BYTE) | ||||||
| #include <boost/predef/other/endian.h> | #include <msgpack/predef/other/endian.h> | ||||||
| #define MSGPACK_ENDIAN_LITTLE_BYTE BOOST_ENDIAN_LITTLE_BYTE |  | ||||||
| #define MSGPACK_ENDIAN_BIG_BYTE BOOST_ENDIAN_BIG_BYTE |  | ||||||
| #endif // !defined(MSGPACK_ENDIAN_LITTLE_BYTE) && !defined(MSGPACK_ENDIAN_BIG_BYTE)
 | #endif // !defined(MSGPACK_ENDIAN_LITTLE_BYTE) && !defined(MSGPACK_ENDIAN_BIG_BYTE)
 | ||||||
| 
 | 
 | ||||||
| #if MSGPACK_ENDIAN_LITTLE_BYTE | #if MSGPACK_ENDIAN_LITTLE_BYTE | ||||||
| @@ -191,8 +202,27 @@ | |||||||
| */ | */ | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | #if !defined(__cplusplus) && defined(_MSC_VER) | ||||||
|  | #  if !defined(_KERNEL_MODE) | ||||||
|  | #    if !defined(FALSE) | ||||||
|  | #      define FALSE (0) | ||||||
|  | #    endif | ||||||
|  | #    if !defined(TRUE) | ||||||
|  | #      define TRUE (!FALSE) | ||||||
|  | #    endif | ||||||
|  | #  endif | ||||||
|  | #  if _MSC_VER >= 1800 | ||||||
|  | #    include <stdbool.h> | ||||||
|  | #  else | ||||||
|  | #    define bool int | ||||||
|  | #    define true TRUE | ||||||
|  | #    define false FALSE | ||||||
|  | #  endif | ||||||
|  | #  define inline __inline | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| #ifdef __APPLE__ | #ifdef __APPLE__ | ||||||
| #  include <TargetConditionals.h> | #  include <TargetConditionals.h> | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #endif /* msgpack/sysdep.hpp */ | #endif /* msgpack/sysdep.h */ | ||||||
| @@ -1,110 +0,0 @@ | |||||||
| // |  | ||||||
| // MessagePack for C++ static resolution routine |  | ||||||
| // |  | ||||||
| // Copyright (C) 2008-2016 FURUHASHI Sadayuki and KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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_CPP03_DEFINE_ARRAY_HPP |  | ||||||
| #define MSGPACK_V1_CPP03_DEFINE_ARRAY_HPP |  | ||||||
|  |  | ||||||
| #include "msgpack/v1/adaptor/detail/cpp03_define_array_decl.hpp" |  | ||||||
| #include "msgpack/adaptor/msgpack_tuple.hpp" |  | ||||||
| #include "msgpack/adaptor/adaptor_base.hpp" |  | ||||||
| #include "msgpack/object_fwd.hpp" |  | ||||||
|  |  | ||||||
| namespace msgpack { |  | ||||||
| /// @cond |  | ||||||
| MSGPACK_API_VERSION_NAMESPACE(v1) { |  | ||||||
| /// @endcond |  | ||||||
| namespace type { |  | ||||||
|  |  | ||||||
| <% GENERATION_LIMIT = 31 %> |  | ||||||
| template <> |  | ||||||
| struct define_array<> { |  | ||||||
|     typedef define_array<> value_type; |  | ||||||
|     typedef tuple<> tuple_type; |  | ||||||
|     template <typename Packer> |  | ||||||
|     void msgpack_pack(Packer& pk) const |  | ||||||
|     { |  | ||||||
|         pk.pack_array(0); |  | ||||||
|     } |  | ||||||
|     void msgpack_unpack(msgpack::object const& o) |  | ||||||
|     { |  | ||||||
|         if(o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); } |  | ||||||
|     } |  | ||||||
|     void msgpack_object(msgpack::object* o, msgpack::zone&) const |  | ||||||
|     { |  | ||||||
|         o->type = msgpack::type::ARRAY; |  | ||||||
|         o->via.array.ptr = MSGPACK_NULLPTR; |  | ||||||
|         o->via.array.size = 0; |  | ||||||
|     } |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| /// @cond |  | ||||||
| <%0.upto(GENERATION_LIMIT) {|i|%> |  | ||||||
| template <typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>> |  | ||||||
| struct define_array<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> { |  | ||||||
|     typedef define_array<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> value_type; |  | ||||||
|     typedef tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> tuple_type; |  | ||||||
|     define_array(A0& _a0<%1.upto(i) {|j|%>, A<%=j%>& _a<%=j%><%}%>) : |  | ||||||
|         a0(_a0)<%1.upto(i) {|j|%>, a<%=j%>(_a<%=j%>)<%}%> {} |  | ||||||
|     template <typename Packer> |  | ||||||
|     void msgpack_pack(Packer& pk) const |  | ||||||
|     { |  | ||||||
|         pk.pack_array(<%=i+1%>); |  | ||||||
|         <%0.upto(i) {|j|%> |  | ||||||
|         pk.pack(a<%=j%>);<%}%> |  | ||||||
|     } |  | ||||||
|     void msgpack_unpack(msgpack::object const& o) |  | ||||||
|     { |  | ||||||
|         if(o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); } |  | ||||||
|         const size_t size = o.via.array.size; |  | ||||||
|         if(size > 0) { |  | ||||||
|             msgpack::object *ptr = o.via.array.ptr; |  | ||||||
|             switch(size) { |  | ||||||
|             default:<%(i).downto(0) {|j|%> |  | ||||||
|             case <%=j+1%>: ptr[<%=j%>].convert(a<%=j%>); |  | ||||||
|             // fallthrough |  | ||||||
| <%}%> |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     void msgpack_object(msgpack::object* o, msgpack::zone& z) const |  | ||||||
|     { |  | ||||||
|         o->type = msgpack::type::ARRAY; |  | ||||||
|         o->via.array.ptr = static_cast<msgpack::object*>(z.allocate_align(sizeof(msgpack::object)*<%=i+1%>, MSGPACK_ZONE_ALIGNOF(msgpack::object))); |  | ||||||
|         o->via.array.size = <%=i+1%>; |  | ||||||
|         <%0.upto(i) {|j|%> |  | ||||||
|         o->via.array.ptr[<%=j%>] = msgpack::object(a<%=j%>, z);<%}%> |  | ||||||
|     } |  | ||||||
|     <%0.upto(i) {|j|%> |  | ||||||
|     A<%=j%>& a<%=j%>;<%}%> |  | ||||||
| }; |  | ||||||
| <%}%> |  | ||||||
| /// @endcond |  | ||||||
|  |  | ||||||
| inline define_array<> make_define_array() |  | ||||||
| { |  | ||||||
|     return define_array<>(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /// @cond |  | ||||||
| <%0.upto(GENERATION_LIMIT) {|i|%> |  | ||||||
| template <typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>> |  | ||||||
| inline define_array<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> make_define_array(A0& a0<%1.upto(i) {|j|%>, A<%=j%>& a<%=j%><%}%>) |  | ||||||
| { |  | ||||||
|     return define_array<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>>(a0<%1.upto(i) {|j|%>, a<%=j%><%}%>); |  | ||||||
| } |  | ||||||
| <%}%> |  | ||||||
| /// @endcond |  | ||||||
|  |  | ||||||
| }  // namespace type |  | ||||||
| /// @cond |  | ||||||
| }  // MSGPACK_API_VERSION_NAMESPACE(v1) |  | ||||||
| /// @endcond |  | ||||||
| }  // namespace msgpack |  | ||||||
|  |  | ||||||
| #endif // MSGPACK_V1_CPP03_DEFINE_ARRAY_HPP |  | ||||||
| @@ -1,42 +0,0 @@ | |||||||
| // |  | ||||||
| // MessagePack for C++ static resolution routine |  | ||||||
| // |  | ||||||
| // Copyright (C) 2008-2016 FURUHASHI Sadayuki and KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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_CPP03_DEFINE_ARRAY_DECL_HPP |  | ||||||
| #define MSGPACK_V1_CPP03_DEFINE_ARRAY_DECL_HPP |  | ||||||
|  |  | ||||||
| #include "msgpack/versioning.hpp" |  | ||||||
|  |  | ||||||
| namespace msgpack { |  | ||||||
| /// @cond |  | ||||||
| MSGPACK_API_VERSION_NAMESPACE(v1) { |  | ||||||
| /// @endcond |  | ||||||
| namespace type { |  | ||||||
|  |  | ||||||
| /// @cond |  | ||||||
| <% GENERATION_LIMIT = 31 %> |  | ||||||
| template <typename A0 = void<%1.upto(GENERATION_LIMIT+1) {|i|%>, typename A<%=i%> = void<%}%>> |  | ||||||
| struct define_array; |  | ||||||
| /// @endcond |  | ||||||
|  |  | ||||||
| define_array<> make_define_array(); |  | ||||||
|  |  | ||||||
| /// @cond |  | ||||||
| <%0.upto(GENERATION_LIMIT) {|i|%> |  | ||||||
| template <typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>> |  | ||||||
| inline define_array<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> make_define_array(A0& a0<%1.upto(i) {|j|%>, A<%=j%>& a<%=j%><%}%>); |  | ||||||
| <%}%> |  | ||||||
| /// @endcond |  | ||||||
|  |  | ||||||
| }  // namespace type |  | ||||||
| /// @cond |  | ||||||
| }  // MSGPACK_API_VERSION_NAMESPACE(v1) |  | ||||||
| /// @endcond |  | ||||||
| }  // namespace msgpack |  | ||||||
|  |  | ||||||
| #endif // MSGPACK_V1_CPP03_DEFINE_ARRAY_DECL_HPP |  | ||||||
| @@ -1,120 +0,0 @@ | |||||||
| // |  | ||||||
| // MessagePack for C++ static resolution routine |  | ||||||
| // |  | ||||||
| // Copyright (C) 2015-2016 KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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_CPP03_DEFINE_MAP_HPP |  | ||||||
| #define MSGPACK_V1_CPP03_DEFINE_MAP_HPP |  | ||||||
|  |  | ||||||
| #include "msgpack/v1/adaptor/detail/cpp03_define_map_decl.hpp" |  | ||||||
| #include "msgpack/adaptor/msgpack_tuple.hpp" |  | ||||||
| #include "msgpack/adaptor/adaptor_base.hpp" |  | ||||||
| #include "msgpack/object_fwd.hpp" |  | ||||||
|  |  | ||||||
| #include <map> |  | ||||||
|  |  | ||||||
| namespace msgpack { |  | ||||||
| /// @cond |  | ||||||
| MSGPACK_API_VERSION_NAMESPACE(v1) { |  | ||||||
| /// @endcond |  | ||||||
| namespace type { |  | ||||||
|  |  | ||||||
| <% GENERATION_LIMIT = 31 %> |  | ||||||
| template <> |  | ||||||
| struct define_map<> { |  | ||||||
|     template <typename Packer> |  | ||||||
|     void msgpack_pack(Packer& pk) const |  | ||||||
|     { |  | ||||||
|         pk.pack_map(0); |  | ||||||
|     } |  | ||||||
|     void msgpack_unpack(msgpack::object const& o) const |  | ||||||
|     { |  | ||||||
|         if(o.type != msgpack::type::MAP) { throw msgpack::type_error(); } |  | ||||||
|     } |  | ||||||
|     void msgpack_object(msgpack::object* o, msgpack::zone&) const |  | ||||||
|     { |  | ||||||
|         o->type = msgpack::type::MAP; |  | ||||||
|         o->via.map.ptr = MSGPACK_NULLPTR; |  | ||||||
|         o->via.map.size = 0; |  | ||||||
|     } |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| /// @cond |  | ||||||
| <%1.step(GENERATION_LIMIT+1,2) {|i|%> |  | ||||||
| template <typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>> |  | ||||||
| struct define_map<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> { |  | ||||||
|     define_map(A0& _a0<%1.upto(i) {|j|%>, A<%=j%>& _a<%=j%><%}%>) : |  | ||||||
|         a0(_a0)<%1.upto(i) {|j|%>, a<%=j%>(_a<%=j%>)<%}%> {} |  | ||||||
|     template <typename Packer> |  | ||||||
|     void msgpack_pack(Packer& pk) const |  | ||||||
|     { |  | ||||||
|         pk.pack_map(<%=(i+1)/2%>); |  | ||||||
|         <%0.upto(i) {|j|%> |  | ||||||
|         pk.pack(a<%=j%>);<%}%> |  | ||||||
|     } |  | ||||||
|     void msgpack_unpack(msgpack::object const& o) const |  | ||||||
|     { |  | ||||||
|         if(o.type != msgpack::type::MAP) { throw msgpack::type_error(); } |  | ||||||
|         std::map<std::string, msgpack::object const*> kvmap; |  | ||||||
|         for (uint32_t i = 0; i < o.via.map.size; ++i) { |  | ||||||
|             if (o.via.map.ptr[i].key.type != msgpack::type::STR) { throw msgpack::type_error(); } |  | ||||||
|             kvmap.insert( |  | ||||||
|                 std::map<std::string, msgpack::object const*>::value_type( |  | ||||||
|                     std::string( |  | ||||||
|                         o.via.map.ptr[i].key.via.str.ptr, |  | ||||||
|                         o.via.map.ptr[i].key.via.str.size), |  | ||||||
|                     &o.via.map.ptr[i].val |  | ||||||
|                 ) |  | ||||||
|             ); |  | ||||||
|         } |  | ||||||
|         <%0.step(i,2) {|j|%> |  | ||||||
|         { |  | ||||||
|             std::map<std::string, msgpack::object const*>::const_iterator it = kvmap.find(a<%=j%>); |  | ||||||
|             if (it != kvmap.end()) { |  | ||||||
|                 it->second->convert(a<%=j+1%>); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         <%}%> |  | ||||||
|     } |  | ||||||
|     void msgpack_object(msgpack::object* o, msgpack::zone& z) const |  | ||||||
|     { |  | ||||||
|         o->type = msgpack::type::MAP; |  | ||||||
|         o->via.map.ptr = static_cast<msgpack::object_kv*>(z.allocate_align(sizeof(msgpack::object_kv)*<%=(i+1)/2%>, MSGPACK_ZONE_ALIGNOF(msgpack::object_kv))); |  | ||||||
|         o->via.map.size = <%=(i+1)/2%>; |  | ||||||
|         <%0.step(i,2) {|j|%> |  | ||||||
|         o->via.map.ptr[<%=j/2%>].key = msgpack::object(a<%=j%>, z); |  | ||||||
|         o->via.map.ptr[<%=j/2%>].val = msgpack::object(a<%=j+1%>, z); |  | ||||||
|         <%}%> |  | ||||||
|     } |  | ||||||
|     <%0.upto(i) {|j|%> |  | ||||||
|     A<%=j%>& a<%=j%>;<%}%> |  | ||||||
| }; |  | ||||||
| <%}%> |  | ||||||
| /// @endcond |  | ||||||
|  |  | ||||||
| inline define_map<> make_define_map() |  | ||||||
| { |  | ||||||
|     return define_map<>(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /// @cond |  | ||||||
| <%0.upto(GENERATION_LIMIT) {|i|%> |  | ||||||
| template <typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>> |  | ||||||
| inline define_map<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> make_define_map(A0& a0<%1.upto(i) {|j|%>, A<%=j%>& a<%=j%><%}%>) |  | ||||||
| { |  | ||||||
|     return define_map<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>>(a0<%1.upto(i) {|j|%>, a<%=j%><%}%>); |  | ||||||
| } |  | ||||||
| <%}%> |  | ||||||
| /// @endcond |  | ||||||
|  |  | ||||||
| }  // namespace type |  | ||||||
| /// @cond |  | ||||||
| }  // MSGPACK_API_VERSION_NAMESPACE(v1) |  | ||||||
| /// @endcond |  | ||||||
| }  // namespace msgpack |  | ||||||
|  |  | ||||||
| #endif // MSGPACK_V1_CPP03_DEFINE_MAP_HPP |  | ||||||
| @@ -1,42 +0,0 @@ | |||||||
| // |  | ||||||
| // MessagePack for C++ static resolution routine |  | ||||||
| // |  | ||||||
| // Copyright (C) 2015-2016 KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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_CPP03_DEFINE_MAP_DECL_HPP |  | ||||||
| #define MSGPACK_V1_CPP03_DEFINE_MAP_DECL_HPP |  | ||||||
|  |  | ||||||
| #include "msgpack/versioning.hpp" |  | ||||||
|  |  | ||||||
| namespace msgpack { |  | ||||||
| /// @cond |  | ||||||
| MSGPACK_API_VERSION_NAMESPACE(v1) { |  | ||||||
| /// @endcond |  | ||||||
| namespace type { |  | ||||||
|  |  | ||||||
| /// @cond |  | ||||||
| <% GENERATION_LIMIT = 31 %> |  | ||||||
| template <typename A0 = void<%1.upto(GENERATION_LIMIT+1) {|i|%>, typename A<%=i%> = void<%}%>> |  | ||||||
| struct define_map; |  | ||||||
| /// @endcond |  | ||||||
|  |  | ||||||
| define_map<> make_define_map(); |  | ||||||
|  |  | ||||||
| /// @cond |  | ||||||
| <%0.upto(GENERATION_LIMIT) {|i|%> |  | ||||||
| template <typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>> |  | ||||||
| define_map<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> make_define_map(A0& a0<%1.upto(i) {|j|%>, A<%=j%>& a<%=j%><%}%>); |  | ||||||
| <%}%> |  | ||||||
| /// @endcond |  | ||||||
|  |  | ||||||
| }  // namespace type |  | ||||||
| /// @cond |  | ||||||
| }  // MSGPACK_API_VERSION_NAMESPACE(v1) |  | ||||||
| /// @endcond |  | ||||||
| }  // namespace msgpack |  | ||||||
|  |  | ||||||
| #endif // MSGPACK_V1_CPP03_DEFINE_MAP_DECL_HPP |  | ||||||
| @@ -1,227 +0,0 @@ | |||||||
| // |  | ||||||
| // MessagePack for C++ static resolution routine |  | ||||||
| // |  | ||||||
| // Copyright (C) 2008-2016 FURUHASHI Sadayuki and KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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_CPP03_MSGPACK_TUPLE_HPP |  | ||||||
| #define MSGPACK_V1_CPP03_MSGPACK_TUPLE_HPP |  | ||||||
|  |  | ||||||
| #include "msgpack/v1/adaptor/msgpack_tuple_decl.hpp" |  | ||||||
|  |  | ||||||
| namespace msgpack { |  | ||||||
|  |  | ||||||
| /// @cond |  | ||||||
| MSGPACK_API_VERSION_NAMESPACE(v1) { |  | ||||||
| /// @endcond |  | ||||||
|  |  | ||||||
| namespace type { |  | ||||||
|  |  | ||||||
| // FIXME operator== |  | ||||||
| // FIXME operator!= |  | ||||||
| <% GENERATION_LIMIT = 31 %> |  | ||||||
|  |  | ||||||
| template <typename T> |  | ||||||
| struct tuple_type { |  | ||||||
|     typedef T type; |  | ||||||
|     typedef T value_type; |  | ||||||
|     typedef T& reference; |  | ||||||
|     typedef const T& const_reference; |  | ||||||
|     typedef const T& transparent_reference; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| template <typename T> |  | ||||||
| struct tuple_type<T&> { |  | ||||||
|     typedef T type; |  | ||||||
|     typedef T& value_type; |  | ||||||
|     typedef T& reference; |  | ||||||
|     typedef const T& const_reference; |  | ||||||
|     typedef T& transparent_reference; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| template <typename T> |  | ||||||
| struct tuple_type<const T&> { |  | ||||||
|     typedef T type; |  | ||||||
|     typedef T& value_type; |  | ||||||
|     typedef T& reference; |  | ||||||
|     typedef const T& const_reference; |  | ||||||
|     typedef const T& transparent_reference; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| /// @cond |  | ||||||
| <%0.upto(GENERATION_LIMIT) {|i|%> |  | ||||||
| <%0.upto(i) {|j|%> |  | ||||||
| template <typename A0<%1.upto(i) {|k|%>, typename A<%=k%><%}%>> |  | ||||||
| struct tuple_element<tuple<A0<%1.upto(i) {|k|%>, A<%=k%><%}%>>, <%=j%>> : tuple_type<A<%=j%>> { |  | ||||||
|     tuple_element(tuple<A0<%1.upto(i) {|k|%>, A<%=k%> <%}%>>& x) : m_x(x.a<%=j%>) {} |  | ||||||
|     typename tuple_type<A<%=j%>>::reference get() { return m_x; } |  | ||||||
|     typename tuple_type<A<%=j%>>::const_reference get() const { return m_x; } |  | ||||||
| private: |  | ||||||
|     typename tuple_type<A<%=j%>>::reference m_x; |  | ||||||
| }; |  | ||||||
| <%}%> |  | ||||||
| <%}%> |  | ||||||
|  |  | ||||||
| <%0.upto(GENERATION_LIMIT) {|i|%> |  | ||||||
| <%0.upto(i) {|j|%> |  | ||||||
| template <typename A0<%1.upto(i) {|k|%>, typename A<%=k%><%}%>> |  | ||||||
| struct const_tuple_element<tuple<A0<%1.upto(i) {|k|%>, A<%=k%><%}%>>, <%=j%>> : tuple_type<A<%=j%>> { |  | ||||||
|     const_tuple_element(const tuple<A0<%1.upto(i) {|k|%>, A<%=k%><%}%>>& x) : m_x(x.a<%=j%>) {} |  | ||||||
|     typename tuple_type<A<%=j%>>::const_reference get() const { return m_x; } |  | ||||||
| private: |  | ||||||
|     typename tuple_type<A<%=j%>>::const_reference m_x; |  | ||||||
| }; |  | ||||||
| <%}%> |  | ||||||
| <%}%> |  | ||||||
| /// @endcond |  | ||||||
|  |  | ||||||
| template <> |  | ||||||
| struct tuple<> { |  | ||||||
|     tuple() {} |  | ||||||
|     tuple(msgpack::object const& o) { o.convert(*this); } |  | ||||||
|     typedef tuple<> value_type; |  | ||||||
|     std::size_t size() const { return 0; } |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| /// @cond |  | ||||||
| <%0.upto(GENERATION_LIMIT) {|i|%> |  | ||||||
| template <typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>> |  | ||||||
| struct tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> { |  | ||||||
|     typedef tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> value_type; |  | ||||||
|     std::size_t size() const { return <%=i+1%>; } |  | ||||||
|     tuple() {} |  | ||||||
|     tuple(typename tuple_type<A0>::transparent_reference _a0<%1.upto(i) {|j|%>, typename tuple_type<A<%=j%>>::transparent_reference _a<%=j%><%}%>) : |  | ||||||
|         a0(_a0)<%1.upto(i) {|j|%>, a<%=j%>(_a<%=j%>)<%}%> {} |  | ||||||
|     tuple(msgpack::object const& o) { o.convert(*this); } |  | ||||||
|     template <int N> typename tuple_element<value_type, N>::reference get() |  | ||||||
|         { return tuple_element<value_type, N>(*this).get(); } |  | ||||||
|     template <int N> typename const_tuple_element<value_type, N>::const_reference get() const |  | ||||||
|         { return const_tuple_element<value_type, N>(*this).get(); } |  | ||||||
|     <%0.upto(i) {|j|%> |  | ||||||
|     A<%=j%> a<%=j%>;<%}%> |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| template <int N, typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>> |  | ||||||
| inline typename type::tuple_element<type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>>, N>::reference get(type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>>& t) |  | ||||||
| { return t.template get<N>(); } |  | ||||||
| template <int N, typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>> |  | ||||||
| inline typename type::const_tuple_element<type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>>, N>::const_reference get(type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> const& t) |  | ||||||
| { return t.template get<N>(); } |  | ||||||
| <%}%> |  | ||||||
| /// @endcond |  | ||||||
|  |  | ||||||
| inline tuple<> make_tuple() |  | ||||||
| { |  | ||||||
|     return tuple<>(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /// @cond |  | ||||||
| <%0.upto(GENERATION_LIMIT) {|i|%> |  | ||||||
| template <typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>> |  | ||||||
| tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> make_tuple(A0 const& a0<%1.upto(i) {|j|%>, A<%=j%> const& a<%=j%><%}%>) |  | ||||||
| { |  | ||||||
|     return tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>>(a0<%1.upto(i) {|j|%>, a<%=j%><%}%>); |  | ||||||
| } |  | ||||||
| <%}%> |  | ||||||
| /// @endcond |  | ||||||
|  |  | ||||||
| }  // namespace type |  | ||||||
|  |  | ||||||
| namespace adaptor { |  | ||||||
|  |  | ||||||
| template <> |  | ||||||
| struct convert<type::tuple<> > { |  | ||||||
|     msgpack::object const& operator()( |  | ||||||
|         msgpack::object const& o, |  | ||||||
|         type::tuple<>&) const { |  | ||||||
|         if(o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); } |  | ||||||
|         return o; |  | ||||||
|     } |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| /// @cond |  | ||||||
| <%0.upto(GENERATION_LIMIT) {|i|%> |  | ||||||
| template <typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>> |  | ||||||
| struct convert<type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> > { |  | ||||||
|     msgpack::object const& operator()( |  | ||||||
|         msgpack::object const& o, |  | ||||||
|         type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>>& v) const { |  | ||||||
|         if(o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); } |  | ||||||
|         <%0.upto(i) {|j|%> |  | ||||||
|         // In order to avoid clang++'s invalid warning, msgpack::object:: has been added. |  | ||||||
|         if(o.via.array.size > <%=j%>) |  | ||||||
|             o.via.array.ptr[<%=j%>].msgpack::object::convert<typename type::tuple_type<A<%=j%>>::type>(v.template get<<%=j%>>());<%}%> |  | ||||||
|         return o; |  | ||||||
|     } |  | ||||||
| }; |  | ||||||
| <%}%> |  | ||||||
| /// @endcond |  | ||||||
|  |  | ||||||
| template <> |  | ||||||
| struct pack<type::tuple<> > { |  | ||||||
|     template <typename Stream> |  | ||||||
|     msgpack::packer<Stream>& operator()( |  | ||||||
|         msgpack::packer<Stream>& o, |  | ||||||
|         const type::tuple<>&) const { |  | ||||||
|         o.pack_array(0); |  | ||||||
|         return o; |  | ||||||
|     } |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| /// @cond |  | ||||||
| <%0.upto(GENERATION_LIMIT) {|i|%> |  | ||||||
| template <typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>> |  | ||||||
| struct pack<type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> > { |  | ||||||
|     template <typename Stream> |  | ||||||
|     msgpack::packer<Stream>& operator()( |  | ||||||
|         msgpack::packer<Stream>& o, |  | ||||||
|         const type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>>& v) const { |  | ||||||
|         o.pack_array(<%=i+1%>); |  | ||||||
|         <%0.upto(i) {|j|%> |  | ||||||
|         o.pack(v.template get<<%=j%>>());<%}%> |  | ||||||
|         return o; |  | ||||||
|     } |  | ||||||
| }; |  | ||||||
| <%}%> |  | ||||||
| /// @endcond |  | ||||||
|  |  | ||||||
| template <> |  | ||||||
| struct object_with_zone<type::tuple<> > { |  | ||||||
|     void operator()( |  | ||||||
|         msgpack::object::with_zone& o, |  | ||||||
|         const type::tuple<>&) const { |  | ||||||
|         o.type = msgpack::type::ARRAY; |  | ||||||
|         o.via.array.ptr = MSGPACK_NULLPTR; |  | ||||||
|         o.via.array.size = 0; |  | ||||||
|     } |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| /// @cond |  | ||||||
| <%0.upto(GENERATION_LIMIT) {|i|%> |  | ||||||
| template <typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>> |  | ||||||
| struct object_with_zone<type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> > { |  | ||||||
|     void operator()( |  | ||||||
|         msgpack::object::with_zone& o, |  | ||||||
|         const type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>>& v) const { |  | ||||||
|         o.type = msgpack::type::ARRAY; |  | ||||||
|         o.via.array.ptr = static_cast<msgpack::object*>(o.zone.allocate_align(sizeof(msgpack::object)*<%=i+1%>, MSGPACK_ZONE_ALIGNOF(msgpack::object))); |  | ||||||
|         o.via.array.size = <%=i+1%>; |  | ||||||
|         <%0.upto(i) {|j|%> |  | ||||||
|         o.via.array.ptr[<%=j%>] = msgpack::object(v.template get<<%=j%>>(), o.zone);<%}%> |  | ||||||
|     } |  | ||||||
| }; |  | ||||||
| <%}%> |  | ||||||
| /// @endcond |  | ||||||
|  |  | ||||||
| } // namespace adaptor |  | ||||||
|  |  | ||||||
| /// @cond |  | ||||||
| }  // MSGPACK_API_VERSION_NAMESPACE(v1) |  | ||||||
| /// @endcond |  | ||||||
|  |  | ||||||
| }  // namespace msgpack |  | ||||||
|  |  | ||||||
| #endif // MSGPACK_V1_CPP03_MSGPACK_TUPLE_HPP |  | ||||||
| @@ -1,69 +0,0 @@ | |||||||
| // |  | ||||||
| // MessagePack for C++ static resolution routine |  | ||||||
| // |  | ||||||
| // Copyright (C) 2008-2016 FURUHASHI Sadayuki and KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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_CPP03_MSGPACK_TUPLE_DECL_HPP |  | ||||||
| #define MSGPACK_V1_CPP03_MSGPACK_TUPLE_DECL_HPP |  | ||||||
|  |  | ||||||
| #include "msgpack/versioning.hpp" |  | ||||||
| #include "msgpack/object.hpp" |  | ||||||
| #include "msgpack/adaptor/adaptor_base.hpp" |  | ||||||
|  |  | ||||||
| namespace msgpack { |  | ||||||
|  |  | ||||||
| /// @cond |  | ||||||
| MSGPACK_API_VERSION_NAMESPACE(v1) { |  | ||||||
| /// @endcond |  | ||||||
|  |  | ||||||
| namespace type { |  | ||||||
|  |  | ||||||
| // FIXME operator== |  | ||||||
| // FIXME operator!= |  | ||||||
| <% GENERATION_LIMIT = 31 %> |  | ||||||
|  |  | ||||||
| /// @cond |  | ||||||
| template <typename A0 = void<%1.upto(GENERATION_LIMIT+1) {|i|%>, typename A<%=i%> = void<%}%>> |  | ||||||
| struct tuple; |  | ||||||
| /// @endcond |  | ||||||
|  |  | ||||||
| template <typename Tuple, int N> |  | ||||||
| struct tuple_element; |  | ||||||
|  |  | ||||||
| template <typename Tuple, int N> |  | ||||||
| struct const_tuple_element; |  | ||||||
|  |  | ||||||
| template <typename T> |  | ||||||
| struct tuple_type; |  | ||||||
|  |  | ||||||
| /// @cond |  | ||||||
| <%0.upto(GENERATION_LIMIT) {|i|%> |  | ||||||
| template <int N, typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>> |  | ||||||
| typename type::tuple_element<type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>>, N>::reference get(type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>>& t); |  | ||||||
| template <int N, typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>> |  | ||||||
| typename type::const_tuple_element<type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>>, N>::const_reference get(type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> const& t); |  | ||||||
| <%}%> |  | ||||||
| /// @endcond |  | ||||||
|  |  | ||||||
| tuple<> make_tuple(); |  | ||||||
|  |  | ||||||
| /// @cond |  | ||||||
| <%0.upto(GENERATION_LIMIT) {|i|%> |  | ||||||
| template <typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>> |  | ||||||
| tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> make_tuple(A0 const& a0<%1.upto(i) {|j|%>, A<%=j%> const& a<%=j%><%}%>); |  | ||||||
| <%}%> |  | ||||||
| /// @endcond |  | ||||||
|  |  | ||||||
| }  // namespace type |  | ||||||
|  |  | ||||||
| /// @cond |  | ||||||
| }  // MSGPACK_API_VERSION_NAMESPACE(v1) |  | ||||||
| /// @endcond |  | ||||||
|  |  | ||||||
| }  // namespace msgpack |  | ||||||
|  |  | ||||||
| #endif // MSGPACK_V1_CPP03_MSGPACK_TUPLE_DECL_HPP |  | ||||||
| @@ -1,344 +0,0 @@ | |||||||
| // |  | ||||||
| // MessagePack for C++ memory pool |  | ||||||
| // |  | ||||||
| // Copyright (C) 2008-2016 FURUHASHI Sadayuki and KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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_CPP03_ZONE_HPP |  | ||||||
| #define MSGPACK_V1_CPP03_ZONE_HPP |  | ||||||
|  |  | ||||||
| #include "msgpack/versioning.hpp" |  | ||||||
| #include "msgpack/cpp_config.hpp" |  | ||||||
| #include "msgpack/zone_decl.hpp" |  | ||||||
|  |  | ||||||
| #include <stdint.h> |  | ||||||
| #include <cstdlib> |  | ||||||
| #include <memory> |  | ||||||
| #include <vector> |  | ||||||
|  |  | ||||||
| #include <boost/assert.hpp> |  | ||||||
|  |  | ||||||
| <% GENERATION_LIMIT = 15 %> |  | ||||||
| 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; |  | ||||||
|  |  | ||||||
|             if(fin == m_end) { |  | ||||||
|                 push_expand(func, data); |  | ||||||
|                 return; |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             fin->m_func = func; |  | ||||||
|             fin->m_data = data; |  | ||||||
|  |  | ||||||
|             ++m_tail; |  | ||||||
|         } |  | ||||||
|         void push_expand(void (*func)(void*), void* data) { |  | ||||||
|             const size_t nused = static_cast<size_t>(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<finalizer*>(::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<chunk*>(::malloc(sizeof(chunk) + chunk_size)); |  | ||||||
|             if(!c) { |  | ||||||
|                 throw std::bad_alloc(); |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             m_head = c; |  | ||||||
|             m_free = chunk_size; |  | ||||||
|             m_ptr  = reinterpret_cast<char*>(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) { |  | ||||||
|                     ::free(c); |  | ||||||
|                     c = n; |  | ||||||
|                 } else { |  | ||||||
|                     m_head = c; |  | ||||||
|                     break; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|             m_head->m_next = MSGPACK_NULLPTR; |  | ||||||
|             m_free = chunk_size; |  | ||||||
|             m_ptr  = reinterpret_cast<char*>(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) /* throw() */; |  | ||||||
|  |  | ||||||
| public: |  | ||||||
|     void* allocate_align(size_t size, size_t align = MSGPACK_ZONE_ALIGN); |  | ||||||
|     void* allocate_no_align(size_t size); |  | ||||||
|  |  | ||||||
|     void push_finalizer(void (*func)(void*), void* data); |  | ||||||
|  |  | ||||||
|     template <typename T> |  | ||||||
|     void push_finalizer(msgpack::unique_ptr<T> obj); |  | ||||||
|  |  | ||||||
|     void clear(); |  | ||||||
|  |  | ||||||
|     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 |  | ||||||
|     <%0.upto(GENERATION_LIMIT) {|i|%> |  | ||||||
|     template <typename T<%1.upto(i) {|j|%>, typename A<%=j%><%}%>> |  | ||||||
|     T* allocate(<%=(1..i).map{|j|"A#{j} a#{j}"}.join(', ')%>); |  | ||||||
|     <%}%> |  | ||||||
|     /// @endcond |  | ||||||
|  |  | ||||||
| private: |  | ||||||
|     void undo_allocate(size_t size); |  | ||||||
|  |  | ||||||
|     template <typename T> |  | ||||||
|     static void object_destruct(void* obj); |  | ||||||
|  |  | ||||||
|     template <typename T> |  | ||||||
|     static void object_delete(void* obj); |  | ||||||
|  |  | ||||||
|     static char* get_aligned(char* ptr, size_t align); |  | ||||||
|  |  | ||||||
|     char* allocate_expand(size_t size); |  | ||||||
| private: |  | ||||||
|     zone(const zone&); |  | ||||||
|     zone& operator=(const zone&); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| inline zone::zone(size_t chunk_size) /* throw() */ :m_chunk_size(chunk_size), m_chunk_list(m_chunk_size) |  | ||||||
| { |  | ||||||
| } |  | ||||||
|  |  | ||||||
| inline char* zone::get_aligned(char* ptr, size_t align) |  | ||||||
| { |  | ||||||
|     BOOST_ASSERT(align != 0 && (align & (align - 1)) == 0); // align must be 2^n (n >= 0) |  | ||||||
|     return |  | ||||||
|         reinterpret_cast<char*>( |  | ||||||
|             reinterpret_cast<uintptr_t>(ptr + (align - 1)) & ~static_cast<uintptr_t>(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<size_t>(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<size_t>(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; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| inline char* zone::allocate_expand(size_t size) |  | ||||||
| { |  | ||||||
|     chunk_list* const cl = &m_chunk_list; |  | ||||||
|  |  | ||||||
|     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; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     chunk* c = static_cast<chunk*>(::malloc(sizeof(chunk) + sz)); |  | ||||||
|     if (!c) throw std::bad_alloc(); |  | ||||||
|  |  | ||||||
|     char* ptr = reinterpret_cast<char*>(c) + sizeof(chunk); |  | ||||||
|  |  | ||||||
|     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) |  | ||||||
| { |  | ||||||
|     m_finalizer_array.push(func, data); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename T> |  | ||||||
| inline void zone::push_finalizer(msgpack::unique_ptr<T> obj) |  | ||||||
| { |  | ||||||
|     m_finalizer_array.push(&zone::object_delete<T>, obj.release()); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| inline void zone::clear() |  | ||||||
| { |  | ||||||
|     m_finalizer_array.clear(); |  | ||||||
|     m_chunk_list.clear(m_chunk_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 <typename T> |  | ||||||
| void zone::object_destruct(void* obj) |  | ||||||
| { |  | ||||||
|     static_cast<T*>(obj)->~T(); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| template <typename T> |  | ||||||
| void zone::object_delete(void* obj) |  | ||||||
| { |  | ||||||
|     delete static_cast<T*>(obj); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| inline void zone::undo_allocate(size_t size) |  | ||||||
| { |  | ||||||
|     m_chunk_list.m_ptr  -= size; |  | ||||||
|     m_chunk_list.m_free += size; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| inline std::size_t aligned_size( |  | ||||||
|     std::size_t size, |  | ||||||
|     std::size_t align) { |  | ||||||
|     return (size + align - 1) / align * align; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /// @cond |  | ||||||
| <%0.upto(GENERATION_LIMIT) {|i|%> |  | ||||||
| template <typename T<%1.upto(i) {|j|%>, typename A<%=j%><%}%>> |  | ||||||
| T* zone::allocate(<%=(1..i).map{|j|"A#{j} a#{j}"}.join(', ')%>) |  | ||||||
| { |  | ||||||
|     void* x = allocate_align(sizeof(T), MSGPACK_ZONE_ALIGNOF(T)); |  | ||||||
|     try { |  | ||||||
|         m_finalizer_array.push(&zone::object_destruct<T>, x); |  | ||||||
|     } catch (...) { |  | ||||||
|         undo_allocate(sizeof(T)); |  | ||||||
|         throw; |  | ||||||
|     } |  | ||||||
|     try { |  | ||||||
|         return new (x) T(<%=(1..i).map{|j|"a#{j}"}.join(', ')%>); |  | ||||||
|     } catch (...) { |  | ||||||
|         --m_finalizer_array.m_tail; |  | ||||||
|         undo_allocate(sizeof(T)); |  | ||||||
|         throw; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| <%}%> |  | ||||||
| /// @endcond |  | ||||||
|  |  | ||||||
| /// @cond |  | ||||||
| }  // MSGPACK_API_VERSION_NAMESPACE(v1) |  | ||||||
| /// @endcond |  | ||||||
|  |  | ||||||
| }  // namespace msgpack |  | ||||||
|  |  | ||||||
| #endif // MSGPACK_V1_CPP03_ZONE_HPP |  | ||||||
| @@ -1,54 +0,0 @@ | |||||||
| // |  | ||||||
| // MessagePack for C++ memory pool |  | ||||||
| // |  | ||||||
| // Copyright (C) 2008-2016 FURUHASHI Sadayuki and KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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_CPP03_ZONE_DECL_HPP |  | ||||||
| #define MSGPACK_V1_CPP03_ZONE_DECL_HPP |  | ||||||
|  |  | ||||||
| #include <cstdlib> |  | ||||||
| #include <memory> |  | ||||||
| #include <vector> |  | ||||||
|  |  | ||||||
| #include "msgpack/versioning.hpp" |  | ||||||
|  |  | ||||||
| #ifndef MSGPACK_ZONE_CHUNK_SIZE |  | ||||||
| #define MSGPACK_ZONE_CHUNK_SIZE 8192 |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #ifndef MSGPACK_ZONE_ALIGN |  | ||||||
| #define MSGPACK_ZONE_ALIGN sizeof(void*) |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #if defined(_MSC_VER) |  | ||||||
| #define MSGPACK_ZONE_ALIGNOF(type) __alignof(type) |  | ||||||
| #else |  | ||||||
| #define MSGPACK_ZONE_ALIGNOF(type) __alignof__(type) |  | ||||||
| #endif |  | ||||||
| // For a compiler that doesn't support __alignof__: |  | ||||||
| // #define MSGPACK_ZONE_ALIGNOF(type) MSGPACK_ZONE_ALIGN |  | ||||||
|  |  | ||||||
| <% GENERATION_LIMIT = 15 %> |  | ||||||
| namespace msgpack { |  | ||||||
|  |  | ||||||
| /// @cond |  | ||||||
| MSGPACK_API_VERSION_NAMESPACE(v1) { |  | ||||||
| /// @endcond |  | ||||||
|  |  | ||||||
| class zone; |  | ||||||
|  |  | ||||||
| std::size_t aligned_size( |  | ||||||
|     std::size_t size, |  | ||||||
|     std::size_t align = MSGPACK_ZONE_ALIGN); |  | ||||||
|  |  | ||||||
| /// @cond |  | ||||||
| }  // MSGPACK_API_VERSION_NAMESPACE(v1) |  | ||||||
| /// @endcond |  | ||||||
|  |  | ||||||
| }  // namespace msgpack |  | ||||||
|  |  | ||||||
| #endif // MSGPACK_V1_CPP03_ZONE_DECL_HPP |  | ||||||
| @@ -1,4 +1,44 @@ | |||||||
| ADD_SUBDIRECTORY (cpp03) | FIND_PACKAGE (cJSON) | ||||||
| ADD_SUBDIRECTORY (cpp11) |  | ||||||
| ADD_SUBDIRECTORY (boost) | LIST (APPEND exec_PROGRAMS | ||||||
| ADD_SUBDIRECTORY (x3) |     boundary.c | ||||||
|  |     lib_buffer_unpack.c | ||||||
|  |     simple_c.c | ||||||
|  |     speed_test_uint32_array.c | ||||||
|  |     speed_test_uint64_array.c | ||||||
|  |     user_buffer_unpack.c | ||||||
|  | ) | ||||||
|  | IF (cJSON_FOUND) | ||||||
|  |     LIST (APPEND exec_PROGRAMS jsonconv.c) | ||||||
|  | ENDIF () | ||||||
|  |  | ||||||
|  | FOREACH (source_file ${exec_PROGRAMS}) | ||||||
|  |     GET_FILENAME_COMPONENT (source_file_we ${source_file} NAME_WE) | ||||||
|  |     ADD_EXECUTABLE ( | ||||||
|  |         ${source_file_we} | ||||||
|  |         ${source_file} | ||||||
|  |     ) | ||||||
|  |     TARGET_LINK_LIBRARIES (${source_file_we} | ||||||
|  |         msgpackc | ||||||
|  |     ) | ||||||
|  |     IF ("${CMAKE_C_COMPILER_ID}" STREQUAL "Clang" OR "${CMAKE_C_COMPILER_ID}" STREQUAL "GNU") | ||||||
|  |         SET_PROPERTY (TARGET ${source_file_we} APPEND_STRING PROPERTY COMPILE_FLAGS " -Wall -Wextra") | ||||||
|  |     ENDIF () | ||||||
|  |  | ||||||
|  |     IF ("${CMAKE_C_COMPILER_ID}" STREQUAL "Clang") | ||||||
|  |         SET_PROPERTY (TARGET ${source_file_we} APPEND_STRING PROPERTY COMPILE_FLAGS " -Wno-mismatched-tags") | ||||||
|  |     ENDIF () | ||||||
|  |  | ||||||
|  |     IF ("${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC") | ||||||
|  |         IF (CMAKE_C_FLAGS MATCHES "/W[0-4]") | ||||||
|  |             STRING(REGEX REPLACE "/W[0-4]" "/W3 /WX" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") | ||||||
|  |         ELSE () | ||||||
|  |             SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W3 /WX") | ||||||
|  |         ENDIF () | ||||||
|  |     ENDIF () | ||||||
|  | ENDFOREACH () | ||||||
|  |  | ||||||
|  | IF (cJSON_FOUND) | ||||||
|  |     TARGET_LINK_LIBRARIES (jsonconv ${CJSON_LIBRARIES}) | ||||||
|  |     TARGET_INCLUDE_DIRECTORIES(jsonconv PRIVATE ${CJSON_INCLUDE_DIRS}) | ||||||
|  | ENDIF () | ||||||
|   | |||||||
| @@ -1,46 +0,0 @@ | |||||||
| FIND_PACKAGE (Boost REQUIRED COMPONENTS system) |  | ||||||
| FIND_PACKAGE (Threads REQUIRED) |  | ||||||
| FIND_PACKAGE (ZLIB REQUIRED) |  | ||||||
|  |  | ||||||
| LIST (APPEND exec_PROGRAMS |  | ||||||
|     msgpack_variant_capitalize.cpp |  | ||||||
|     msgpack_variant_mapbased.cpp |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| IF (MSGPACK_CXX11 OR MSGPACK_CXX14 OR MSGPACK_CXX17 OR MSGPACK_CXX20) |  | ||||||
|     LIST (APPEND exec_PROGRAMS asio_send_recv.cpp) |  | ||||||
|     IF (ZLIB_FOUND) |  | ||||||
|         LIST (APPEND exec_PROGRAMS asio_send_recv_zlib.cpp) |  | ||||||
|     ENDIF () |  | ||||||
| ENDIF () |  | ||||||
|  |  | ||||||
| FOREACH (source_file ${exec_PROGRAMS}) |  | ||||||
|     GET_FILENAME_COMPONENT (source_file_we ${source_file} NAME_WE) |  | ||||||
|     ADD_EXECUTABLE ( |  | ||||||
|         ${source_file_we} |  | ||||||
|         ${source_file} |  | ||||||
|     ) |  | ||||||
|     TARGET_LINK_LIBRARIES (${source_file_we} PRIVATE |  | ||||||
|         msgpackc-cxx |  | ||||||
|         Boost::system |  | ||||||
|         Threads::Threads |  | ||||||
|     ) |  | ||||||
|     IF (ZLIB_FOUND) |  | ||||||
|         TARGET_LINK_LIBRARIES (${source_file_we} PRIVATE ZLIB::ZLIB) |  | ||||||
|     ENDIF () |  | ||||||
|     IF ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") |  | ||||||
|         SET_PROPERTY (TARGET ${source_file_we} APPEND_STRING PROPERTY COMPILE_FLAGS " -Wall -Wextra") |  | ||||||
|     ENDIF () |  | ||||||
|  |  | ||||||
|     IF ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") |  | ||||||
|         SET_PROPERTY (TARGET ${source_file_we} APPEND_STRING PROPERTY COMPILE_FLAGS " -Wno-mismatched-tags") |  | ||||||
|     ENDIF () |  | ||||||
|  |  | ||||||
|     IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") |  | ||||||
|         IF (CMAKE_CXX_FLAGS MATCHES "/W[0-4]") |  | ||||||
|             STRING(REGEX REPLACE "/W[0-4]" "/W3 /WX" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") |  | ||||||
|         ELSE () |  | ||||||
|             SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3 /WX") |  | ||||||
|         ENDIF () |  | ||||||
|     ENDIF () |  | ||||||
| ENDFOREACH () |  | ||||||
| @@ -1,104 +0,0 @@ | |||||||
| // MessagePack for C++ example |  | ||||||
| // |  | ||||||
| // Copyright (C) 2017 KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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) |  | ||||||
| // |  | ||||||
|  |  | ||||||
| #include <string> |  | ||||||
| #include <sstream> |  | ||||||
| #include <iostream> |  | ||||||
|  |  | ||||||
| #include <boost/asio.hpp> |  | ||||||
| #include <boost/lexical_cast.hpp> |  | ||||||
|  |  | ||||||
| #include <msgpack.hpp> |  | ||||||
|  |  | ||||||
| int main() { |  | ||||||
|     boost::asio::io_service ios; |  | ||||||
|     std::uint16_t const port = 12345; |  | ||||||
|  |  | ||||||
|     // Server |  | ||||||
|     std::size_t const window_size = 10; |  | ||||||
|     boost::asio::ip::tcp::acceptor ac(ios, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), port)); |  | ||||||
|     boost::asio::ip::tcp::socket ss(ios); |  | ||||||
|     std::function<void()> do_accept; |  | ||||||
|     std::function<void()> do_async_read_some; |  | ||||||
|  |  | ||||||
|     msgpack::unpacker unp; |  | ||||||
|  |  | ||||||
|     do_accept = [&] { |  | ||||||
|         ac.async_accept( |  | ||||||
|             ss, |  | ||||||
|             [&] |  | ||||||
|             (boost::system::error_code const& e) { |  | ||||||
|                 if (e) { |  | ||||||
|                     std::cout << __LINE__ << ":" << e.message() << std::endl; |  | ||||||
|                     return; |  | ||||||
|                 } |  | ||||||
|                 do_async_read_some = [&] { |  | ||||||
|                     unp.reserve_buffer(window_size); |  | ||||||
|                     ss.async_read_some( |  | ||||||
|                         boost::asio::buffer(unp.buffer(), window_size), |  | ||||||
|                         [&](boost::system::error_code const& e, std::size_t bytes_transferred) { |  | ||||||
|                             if (e) { |  | ||||||
|                                 std::cout << __LINE__ << ":" << e.message() << std::endl; |  | ||||||
|                                 return; |  | ||||||
|                             } |  | ||||||
|                             std::cout << bytes_transferred << " bytes read." << std::endl; |  | ||||||
|                             unp.buffer_consumed(bytes_transferred); |  | ||||||
|                             msgpack::object_handle oh; |  | ||||||
|                             while (unp.next(oh)) { |  | ||||||
|                                 std::cout << oh.get() << std::endl; |  | ||||||
|                                 // In order to finish the program, |  | ||||||
|                                 // return if one complete msgpack is processed. |  | ||||||
|                                 // In actual server, don't return here. |  | ||||||
|                                 return; |  | ||||||
|                             } |  | ||||||
|                             do_async_read_some(); |  | ||||||
|                         } |  | ||||||
|                     ); |  | ||||||
|                 }; |  | ||||||
|                 do_async_read_some(); |  | ||||||
|             } |  | ||||||
|         ); |  | ||||||
|     }; |  | ||||||
|     do_accept(); |  | ||||||
|  |  | ||||||
|     // Client |  | ||||||
|     auto host = "localhost"; |  | ||||||
|     boost::asio::ip::tcp::resolver r(ios); |  | ||||||
|  |  | ||||||
| #if BOOST_VERSION < 106600 |  | ||||||
|     boost::asio::ip::tcp::resolver::query q(host, boost::lexical_cast<std::string>(port)); |  | ||||||
|     auto it = r.resolve(q); |  | ||||||
|     boost::asio::ip::tcp::resolver::iterator end; |  | ||||||
| #else  // BOOST_VERSION < 106600 |  | ||||||
|     auto eps = r.resolve(host, boost::lexical_cast<std::string>(port)); |  | ||||||
|     auto it = eps.begin(); |  | ||||||
|     auto end = eps.end(); |  | ||||||
| #endif // BOOST_VERSION < 106600 |  | ||||||
|  |  | ||||||
|     boost::asio::ip::tcp::socket cs(ios); |  | ||||||
|     boost::asio::async_connect( |  | ||||||
|         cs, |  | ||||||
|         it, |  | ||||||
|         end, |  | ||||||
|         [&] |  | ||||||
|         (boost::system::error_code const& e, boost::asio::ip::tcp::resolver::iterator) { |  | ||||||
|             if (e) { |  | ||||||
|                 std::cout << __LINE__ << ":" << e.message() << std::endl; |  | ||||||
|                 return; |  | ||||||
|             } |  | ||||||
|             std::cout << __LINE__ << ":client connected" << std::endl; |  | ||||||
|             msgpack::sbuffer sb; |  | ||||||
|             msgpack::pack(sb, std::make_tuple(42, false, "hello world", 12.3456)); |  | ||||||
|             write(cs, boost::asio::buffer(sb.data(), sb.size())); |  | ||||||
|         } |  | ||||||
|     ); |  | ||||||
|  |  | ||||||
|     // Start |  | ||||||
|     ios.run(); |  | ||||||
| } |  | ||||||
| @@ -1,176 +0,0 @@ | |||||||
| // MessagePack for C++ example |  | ||||||
| // |  | ||||||
| // Copyright (C) 2017 KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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) |  | ||||||
| // |  | ||||||
|  |  | ||||||
| #include <string> |  | ||||||
| #include <sstream> |  | ||||||
| #include <iostream> |  | ||||||
|  |  | ||||||
| #include <boost/asio.hpp> |  | ||||||
| #include <boost/lexical_cast.hpp> |  | ||||||
|  |  | ||||||
| #include <msgpack.hpp> |  | ||||||
| #include <msgpack/zbuffer.hpp> |  | ||||||
|  |  | ||||||
| #include <zlib.h> |  | ||||||
|  |  | ||||||
| void print(std::string const& buf) { |  | ||||||
|     for (std::string::const_iterator it = buf.begin(), end = buf.end(); |  | ||||||
|          it != end; |  | ||||||
|          ++it) { |  | ||||||
|         std::cout |  | ||||||
|             << std::setw(2) |  | ||||||
|             << std::hex |  | ||||||
|             << std::setfill('0') |  | ||||||
|             << (static_cast<int>(*it) & 0xff) |  | ||||||
|             << ' '; |  | ||||||
|     } |  | ||||||
|     std::cout << std::dec << std::endl; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| int main() { |  | ||||||
|     boost::asio::io_service ios; |  | ||||||
|     std::uint16_t const port = 12345; |  | ||||||
|  |  | ||||||
|     int num_of_zlib_data = 2; |  | ||||||
|     int idx_zlib_data = 0; |  | ||||||
|  |  | ||||||
|     // Server |  | ||||||
|     std::size_t const window_size = 11; |  | ||||||
|     boost::asio::ip::tcp::acceptor ac(ios, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), port)); |  | ||||||
|     boost::asio::ip::tcp::socket ss(ios); |  | ||||||
|     std::function<void()> do_accept; |  | ||||||
|     std::function<void()> do_async_read_some; |  | ||||||
|  |  | ||||||
|     // zlib for decompress |  | ||||||
|     z_stream strm; |  | ||||||
|     auto zlib_init = [&] { |  | ||||||
|         strm.zalloc = Z_NULL; |  | ||||||
|         strm.zfree = Z_NULL; |  | ||||||
|         strm.opaque = Z_NULL; |  | ||||||
|         strm.next_in = Z_NULL; |  | ||||||
|         { |  | ||||||
|             int zret = inflateInit(&strm); |  | ||||||
|             if (zret != Z_OK) { |  | ||||||
|                 std::cout << "Zlib inflateInit() error = " << zret << std::endl; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     }; |  | ||||||
|     zlib_init(); |  | ||||||
|     std::vector<char> buf(4); // buf size |  | ||||||
|  |  | ||||||
|     msgpack::unpacker unp; |  | ||||||
|  |  | ||||||
|     do_accept = [&] { |  | ||||||
|         ac.async_accept( |  | ||||||
|             ss, |  | ||||||
|             [&] |  | ||||||
|             (boost::system::error_code const& e) { |  | ||||||
|                 if (e) { |  | ||||||
|                     std::cout << __LINE__ << ":" << e.message() << std::endl; |  | ||||||
|                     return; |  | ||||||
|                 } |  | ||||||
|                 do_async_read_some = [&] { |  | ||||||
|                     ss.async_read_some( |  | ||||||
|                         boost::asio::buffer(buf), |  | ||||||
|                         [&](boost::system::error_code const& e, std::size_t bytes_transferred) { |  | ||||||
|                             if (e) { |  | ||||||
|                                 std::cout << __LINE__ << ":" << e.message() << std::endl; |  | ||||||
|                                 return; |  | ||||||
|                             } |  | ||||||
|                             std::cout << bytes_transferred << " bytes read." << std::endl; |  | ||||||
|                             print(std::string(std::string(&buf[0], buf.size()))); |  | ||||||
|                             strm.avail_in = static_cast<uInt>(bytes_transferred); |  | ||||||
|                             do { |  | ||||||
|                                 strm.next_in = reinterpret_cast<unsigned char*>(&buf[0]) + (bytes_transferred - strm.avail_in); |  | ||||||
|                                 int zret; |  | ||||||
|                                 unp.reserve_buffer(window_size); |  | ||||||
|                                 strm.avail_out = static_cast<uInt>(window_size); |  | ||||||
|                                 strm.next_out = reinterpret_cast<unsigned char*>(unp.buffer()); |  | ||||||
|                                 do { |  | ||||||
|                                     zret = inflate(&strm, Z_NO_FLUSH); |  | ||||||
|                                     assert(zret != Z_STREAM_ERROR); |  | ||||||
|                                     switch (zret) { |  | ||||||
|                                     case Z_NEED_DICT: |  | ||||||
|                                         zret = Z_DATA_ERROR; |  | ||||||
|                                         // fall through |  | ||||||
|                                     case Z_DATA_ERROR: |  | ||||||
|                                     case Z_MEM_ERROR: |  | ||||||
|                                         inflateEnd(&strm); |  | ||||||
|                                         std::cout << "Zlib inflate() error = " << zret << std::endl; |  | ||||||
|                                         std::exit(-1); |  | ||||||
|                                     } |  | ||||||
|                                     std::size_t decompressed_size = window_size - strm.avail_out; |  | ||||||
|                                     std::cout << decompressed_size << " bytes decompressed." << std::endl; |  | ||||||
|                                     unp.buffer_consumed(decompressed_size); |  | ||||||
|                                     msgpack::object_handle oh; |  | ||||||
|                                     while (unp.next(oh)) { |  | ||||||
|                                         std::cout << oh.get() << std::endl; |  | ||||||
|                                     } |  | ||||||
|                                 } while (strm.avail_out == 0); |  | ||||||
|                                 if (zret == Z_STREAM_END) { |  | ||||||
|                                     inflateEnd(&strm); |  | ||||||
|                                     std::cout << "Zlib decompress finished." << std::endl; |  | ||||||
|                                     ++idx_zlib_data; |  | ||||||
|                                     if (idx_zlib_data == num_of_zlib_data) { |  | ||||||
|                                         std::cout << "All zlib decompress finished." << std::endl; |  | ||||||
|                                         return; |  | ||||||
|                                     } |  | ||||||
|                                     zlib_init(); |  | ||||||
|                                 } |  | ||||||
|                             } while (strm.avail_in != 0); |  | ||||||
|                             do_async_read_some(); |  | ||||||
|                         } |  | ||||||
|                     ); |  | ||||||
|                 }; |  | ||||||
|                 do_async_read_some(); |  | ||||||
|             } |  | ||||||
|         ); |  | ||||||
|     }; |  | ||||||
|     do_accept(); |  | ||||||
|  |  | ||||||
|     // Client |  | ||||||
|     auto host = "localhost"; |  | ||||||
|  |  | ||||||
|     boost::asio::ip::tcp::resolver r(ios); |  | ||||||
|  |  | ||||||
| #if BOOST_VERSION < 106600 |  | ||||||
|     boost::asio::ip::tcp::resolver::query q(host, boost::lexical_cast<std::string>(port)); |  | ||||||
|     auto it = r.resolve(q); |  | ||||||
|     boost::asio::ip::tcp::resolver::iterator end; |  | ||||||
| #else  // BOOST_VERSION < 106600 |  | ||||||
|     auto eps = r.resolve(host, boost::lexical_cast<std::string>(port)); |  | ||||||
|     auto it = eps.begin(); |  | ||||||
|     auto end = eps.end(); |  | ||||||
| #endif // BOOST_VERSION < 106600 |  | ||||||
|  |  | ||||||
|     boost::asio::ip::tcp::socket cs(ios); |  | ||||||
|     boost::asio::async_connect( |  | ||||||
|         cs, |  | ||||||
|         it, |  | ||||||
|         end, |  | ||||||
|         [&] |  | ||||||
|         (boost::system::error_code const& e, boost::asio::ip::tcp::resolver::iterator) { |  | ||||||
|             if (e) { |  | ||||||
|                 std::cout << __LINE__ << ":" << e.message() << std::endl; |  | ||||||
|                 return; |  | ||||||
|             } |  | ||||||
|             std::cout << __LINE__ << ":client connected" << std::endl; |  | ||||||
|             for (int i = 0; i != num_of_zlib_data; ++i) { |  | ||||||
|                 msgpack::zbuffer zb; |  | ||||||
|                 msgpack::pack(zb, std::make_tuple(i, false, "hello world", 12.3456)); |  | ||||||
|                 zb.flush(); // finalize zbuffer (don't forget it) |  | ||||||
|                 print(std::string(zb.data(), zb.size())); |  | ||||||
|                 write(cs, boost::asio::buffer(zb.data(), zb.size())); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     ); |  | ||||||
|  |  | ||||||
|     // Start |  | ||||||
|     ios.run(); |  | ||||||
| } |  | ||||||
| @@ -1,94 +0,0 @@ | |||||||
| // MessagePack for C++ example |  | ||||||
| // |  | ||||||
| // Copyright (C) 2015 KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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) |  | ||||||
| // |  | ||||||
|  |  | ||||||
| #include <string> |  | ||||||
| #include <sstream> |  | ||||||
| #include <iostream> |  | ||||||
| #include <algorithm> |  | ||||||
| #include <cctype> |  | ||||||
|  |  | ||||||
| #include <msgpack.hpp> |  | ||||||
|  |  | ||||||
| struct user { |  | ||||||
|     std::string name; |  | ||||||
|     int age; |  | ||||||
|     std::string address; |  | ||||||
|     MSGPACK_DEFINE(name, age, address); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| struct proc:boost::static_visitor<void> { |  | ||||||
|     void operator()(std::string& v) const { |  | ||||||
|         std::cout << "  match std::string& v" << std::endl; |  | ||||||
|         std::cout << "    v: " << v << std::endl; |  | ||||||
|         std::cout << "    capitalize" << std::endl; |  | ||||||
|         for (std::string::iterator it = v.begin(), end = v.end(); |  | ||||||
|              it != end; |  | ||||||
|              ++it) { |  | ||||||
|             *it = std::toupper(*it); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     void operator()(std::vector<msgpack::type::variant>& v) const { |  | ||||||
|         std::cout << "match vector (msgpack::type::ARRAY)" << std::endl; |  | ||||||
|         std::vector<msgpack::type::variant>::iterator it = v.begin(); |  | ||||||
|         std::vector<msgpack::type::variant>::const_iterator end = v.end(); |  | ||||||
|         for (; it != end; ++it) { |  | ||||||
|             boost::apply_visitor(*this, *it); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     template <typename T> |  | ||||||
|     void operator()(T const&) const { |  | ||||||
|         std::cout << "  match others" << std::endl; |  | ||||||
|     } |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| void print(std::string const& buf) { |  | ||||||
|     for (std::string::const_iterator it = buf.begin(), end = buf.end(); |  | ||||||
|          it != end; |  | ||||||
|          ++it) { |  | ||||||
|         std::cout |  | ||||||
|             << std::setw(2) |  | ||||||
|             << std::hex |  | ||||||
|             << std::setfill('0') |  | ||||||
|             << (static_cast<int>(*it) & 0xff) |  | ||||||
|             << ' '; |  | ||||||
|     } |  | ||||||
|     std::cout << std::dec << std::endl; |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  |  | ||||||
| int main() { |  | ||||||
|     std::stringstream ss1; |  | ||||||
|     user u; |  | ||||||
|     u.name = "Takatoshi Kondo"; |  | ||||||
|     u.age = 42; |  | ||||||
|     u.address = "Tokyo, JAPAN"; |  | ||||||
|  |  | ||||||
|     std::cout << "Packing object." << std::endl; |  | ||||||
|     msgpack::pack(ss1, u); |  | ||||||
|     print(ss1.str()); |  | ||||||
|  |  | ||||||
|     msgpack::object_handle oh1 = msgpack::unpack(ss1.str().data(), ss1.str().size()); |  | ||||||
|     msgpack::object const& obj1 = oh1.get(); |  | ||||||
|     std::cout << "Unpacked msgpack object." << std::endl; |  | ||||||
|     std::cout << obj1 << std::endl; |  | ||||||
|  |  | ||||||
|     msgpack::type::variant v = obj1.as<msgpack::type::variant>(); |  | ||||||
|     std::cout << "Applying proc..." << std::endl; |  | ||||||
|     boost::apply_visitor(proc(), v); |  | ||||||
|  |  | ||||||
|     std::stringstream ss2; |  | ||||||
|     std::cout << "Packing modified object." << std::endl; |  | ||||||
|     msgpack::pack(ss2, v); |  | ||||||
|     print(ss2.str()); |  | ||||||
|  |  | ||||||
|     msgpack::object_handle oh2 = msgpack::unpack(ss2.str().data(), ss2.str().size()); |  | ||||||
|     msgpack::object const& obj2 = oh2.get(); |  | ||||||
|     std::cout << "Modified msgpack object." << std::endl; |  | ||||||
|     std::cout << obj2 << std::endl; |  | ||||||
| } |  | ||||||
| @@ -1,97 +0,0 @@ | |||||||
| // MessagePack for C++ example |  | ||||||
| // |  | ||||||
| // Copyright (C) 2015 KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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) |  | ||||||
| // |  | ||||||
|  |  | ||||||
| #include <string> |  | ||||||
| #include <sstream> |  | ||||||
| #include <iostream> |  | ||||||
|  |  | ||||||
| #include <msgpack.hpp> |  | ||||||
|  |  | ||||||
| struct user { |  | ||||||
|     std::string name; |  | ||||||
|     int age; |  | ||||||
|     std::string address; |  | ||||||
|     MSGPACK_DEFINE_MAP(name, age, address); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| struct proc:boost::static_visitor<void> { |  | ||||||
|     // msgpack::type::MAP is converted to std::multimap, not std::map. |  | ||||||
|     void operator()(std::multimap<msgpack::type::variant_ref, msgpack::type::variant_ref>& v) const { |  | ||||||
|         std::cout << "match map" << std::endl; |  | ||||||
|         std::multimap<msgpack::type::variant_ref, msgpack::type::variant_ref>::iterator it = v.begin(); |  | ||||||
|         std::multimap<msgpack::type::variant_ref, msgpack::type::variant_ref>::iterator end = v.end(); |  | ||||||
|         while(it != end) { |  | ||||||
|             boost::string_ref const& key = it->first.as_boost_string_ref(); |  | ||||||
|             if (key == "name") { |  | ||||||
|                 boost::string_ref const& value = it->second.as_boost_string_ref(); |  | ||||||
|                 if (value == "Takatoshi Kondo") { |  | ||||||
|                     // You can add values to msgpack::type::variant_ref. |  | ||||||
|                     v.insert( |  | ||||||
|                         std::multimap<msgpack::type::variant_ref, msgpack::type::variant_ref>::value_type( |  | ||||||
|                             "role", |  | ||||||
|                             "msgpack-c committer" |  | ||||||
|                         ) |  | ||||||
|                     ); |  | ||||||
|                 } |  | ||||||
|                 ++it; |  | ||||||
|             } |  | ||||||
|             else if (key == "age") { |  | ||||||
|                 // You can remove key-value pair from msgpack::type::variant_ref |  | ||||||
|  |  | ||||||
| #if defined(MSGPACK_USE_CPP03) |  | ||||||
| #  if MSGPACK_LIB_STD_CXX |  | ||||||
|                 v.erase(std::multimap<msgpack::type::variant_ref, msgpack::type::variant_ref>::const_iterator(it++)); |  | ||||||
| #  else  // MSGPACK_LIB_STD_CXX |  | ||||||
|                 v.erase(it++); |  | ||||||
| #  endif // MSGPACK_LIB_STD_CXX |  | ||||||
| #else  // defined(MSGPACK_USE_CPP03) |  | ||||||
| #  if MSGPACK_LIB_STD_CXX |  | ||||||
|                 it = v.erase(std::multimap<msgpack::type::variant_ref, msgpack::type::variant_ref>::const_iterator(it)); |  | ||||||
| #  else  // MSGPACK_LIB_STD_CXX |  | ||||||
|                 it = v.erase(it); |  | ||||||
| #  endif // MSGPACK_LIB_STD_CXX |  | ||||||
| #endif // defined(MSGPACK_USE_CPP03) |  | ||||||
|             } |  | ||||||
|             else if (key == "address") { |  | ||||||
|                 // When you want to append string |  | ||||||
|                 // "Tokyo" -> "Tokyo, JAPAN" |  | ||||||
|                 // Use msgpack::type::variant instead of msgpack::type::variant_ref |  | ||||||
|                 // or do as follows: |  | ||||||
|                 boost::string_ref const& value = it->second.as_boost_string_ref(); |  | ||||||
|                 it->second = std::string(&value.front(), value.size()) + ", JAPAN"; |  | ||||||
|                 ++it; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     template <typename T> |  | ||||||
|     void operator()(T const&) const { |  | ||||||
|         std::cout << "  match others" << std::endl; |  | ||||||
|     } |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| int main() { |  | ||||||
|     std::stringstream ss; |  | ||||||
|     user u; |  | ||||||
|     u.name = "Takatoshi Kondo"; |  | ||||||
|     u.age = 42; |  | ||||||
|     u.address = "Tokyo"; |  | ||||||
|     msgpack::pack(ss, u); |  | ||||||
|  |  | ||||||
|     std::string const& str = ss.str(); |  | ||||||
|     msgpack::object_handle oh = msgpack::unpack(str.data(), str.size()); |  | ||||||
|     msgpack::object const& obj = oh.get(); |  | ||||||
|     std::cout << "Unpacked msgpack object." << std::endl; |  | ||||||
|     std::cout << obj << std::endl; |  | ||||||
|     msgpack::type::variant_ref v = obj.as<msgpack::type::variant_ref>(); |  | ||||||
|     std::cout << "Applying proc..." << std::endl; |  | ||||||
|     boost::apply_visitor(proc(), v); |  | ||||||
|     msgpack::zone z; |  | ||||||
|     std::cout << "Applied msgpack object." << std::endl; |  | ||||||
|     std::cout << msgpack::object(v, z) << std::endl; |  | ||||||
| } |  | ||||||
							
								
								
									
										296
									
								
								example/boundary.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										296
									
								
								example/boundary.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,296 @@ | |||||||
|  | /* gcc boundary.c -o boundary -Wconversion -Wpointer-sign */ | ||||||
|  | #include <msgpack.h> | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <assert.h> | ||||||
|  |  | ||||||
|  | static inline unsigned char atohex(char a) | ||||||
|  | { | ||||||
|  |     int x; | ||||||
|  |     if (a >= 'a') { | ||||||
|  |         x = a - 'a' + 10; | ||||||
|  |     } else if (a >= 'A') { | ||||||
|  |         x = a - 'A' + 10; | ||||||
|  |     } else { | ||||||
|  |         x = a - '0'; | ||||||
|  |     } | ||||||
|  |     assert(x >= 0 && x < 16); | ||||||
|  |     return (unsigned char)x; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Return 0 if equal | ||||||
|  | static inline int bytesncmp(char *data, const char *bytes, size_t len) | ||||||
|  | { | ||||||
|  |     size_t n = len >> 1; | ||||||
|  |     size_t i = 0; | ||||||
|  |     int diff; | ||||||
|  |     for (; i < n; i++) { | ||||||
|  |         diff = (unsigned char)data[i] - (atohex(bytes[2 * i]) << 4) - atohex(bytes[2 * i + 1]); | ||||||
|  |         if (diff != 0) { | ||||||
|  |             return diff; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int main() | ||||||
|  | { | ||||||
|  |     msgpack_sbuffer sbuf; | ||||||
|  |     msgpack_packer *x; | ||||||
|  |     size_t offset = 0; | ||||||
|  |     char data[65536]; | ||||||
|  |     msgpack_timestamp ts[] = { | ||||||
|  |         { 0xFFFFFFFF, 0 }, | ||||||
|  |         { 0x100000000, 0 }, | ||||||
|  |         { 0x3FFFFFFFF, 0 }, | ||||||
|  |         { 0x400000000, 0 }, | ||||||
|  |         { INT64_MAX, UINT32_MAX } | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  | #define check_sbuffer(b)                                     \ | ||||||
|  |     do {                                                     \ | ||||||
|  |         size_t len = strlen(#b);                             \ | ||||||
|  |         assert((sbuf.size - offset) * 2 == len);             \ | ||||||
|  |         assert(bytesncmp(sbuf.data + offset, #b, len) == 0); \ | ||||||
|  |         offset = sbuf.size;                                  \ | ||||||
|  |     } while (0) | ||||||
|  |  | ||||||
|  |     msgpack_sbuffer_init(&sbuf); | ||||||
|  |     x = msgpack_packer_new(&sbuf, msgpack_sbuffer_write); | ||||||
|  |  | ||||||
|  |     msgpack_pack_fix_uint8(x, 0); check_sbuffer(cc00);          /* cc 00 */ | ||||||
|  |     msgpack_pack_fix_uint8(x, 0xFF); check_sbuffer(ccff);       /* cc ff */ | ||||||
|  |     msgpack_pack_fix_uint16(x, 0); check_sbuffer(cd0000);       /* cd 00 00 */ | ||||||
|  |     msgpack_pack_fix_uint16(x, 0xFFFF); check_sbuffer(cdffff);  /* cd ff ff */ | ||||||
|  |     msgpack_pack_fix_uint32(x, 0); check_sbuffer(ce00000000);   /* ce 00 00 00 00 */ | ||||||
|  |     msgpack_pack_fix_uint32(x, 0xFFFFFFFF); check_sbuffer(ceffffffff);  /* ce ff ff ff ff */ | ||||||
|  |     msgpack_pack_fix_uint64(x, 0); check_sbuffer(cf0000000000000000);   /* cf 00 00 00 00 00 00 00 00 */ | ||||||
|  |     msgpack_pack_fix_uint64(x, 0xFFFFFFFFFFFFFFFF); check_sbuffer(cfffffffffffffffff);  /* cf ff ff ff ff ff ff ff ff */ | ||||||
|  |  | ||||||
|  |     msgpack_pack_uint8(x, 0); check_sbuffer(00);            /* 00 */ | ||||||
|  |     msgpack_pack_uint8(x, 0x7F); check_sbuffer(7f);         /* 7f */ | ||||||
|  |     msgpack_pack_uint8(x, 0x80); check_sbuffer(cc80);       /* cc 80 */ | ||||||
|  |     msgpack_pack_uint8(x, 0xFF); check_sbuffer(ccff);       /* cc ff */ | ||||||
|  |  | ||||||
|  |     msgpack_pack_uint16(x, 0); check_sbuffer(00);           /* 00 */ | ||||||
|  |     msgpack_pack_uint16(x, 0x7F); check_sbuffer(7f);        /* 7f */ | ||||||
|  |     msgpack_pack_uint16(x, 0x80); check_sbuffer(cc80);      /* cc 80 */ | ||||||
|  |     msgpack_pack_uint16(x, 0xFF); check_sbuffer(ccff);      /* cc ff */ | ||||||
|  |     msgpack_pack_uint16(x, 0x100); check_sbuffer(cd0100);   /* cd 01 00 */ | ||||||
|  |     msgpack_pack_uint16(x, 0xFFFF); check_sbuffer(cdffff);  /* cd ff ff */ | ||||||
|  |  | ||||||
|  |     msgpack_pack_uint32(x, 0); check_sbuffer(00);           /* 00 */ | ||||||
|  |     msgpack_pack_uint32(x, 0x7F); check_sbuffer(7f);        /* 7f */ | ||||||
|  |     msgpack_pack_uint32(x, 0x80); check_sbuffer(cc80);      /* cc 80 */ | ||||||
|  |     msgpack_pack_uint32(x, 0xFF); check_sbuffer(ccff);      /* cc ff */ | ||||||
|  |     msgpack_pack_uint32(x, 0x100); check_sbuffer(cd0100);   /* cd 01 00 */ | ||||||
|  |     msgpack_pack_uint32(x, 0xFFFF); check_sbuffer(cdffff);  /* cd ff ff */ | ||||||
|  |     msgpack_pack_uint32(x, 0x10000); check_sbuffer(ce00010000);     /* ce 00 01 00 00 */ | ||||||
|  |     msgpack_pack_uint32(x, 0xFFFFFFFF); check_sbuffer(ceffffffff);  /* ce ff ff ff ff */ | ||||||
|  |  | ||||||
|  |     msgpack_pack_uint64(x, 0); check_sbuffer(00);           /* 00 */ | ||||||
|  |     msgpack_pack_uint64(x, 0x7F); check_sbuffer(7f);        /* 7f */ | ||||||
|  |     msgpack_pack_uint64(x, 0x80); check_sbuffer(cc80);      /* cc 80 */ | ||||||
|  |     msgpack_pack_uint64(x, 0xFF); check_sbuffer(ccff);      /* cc ff */ | ||||||
|  |     msgpack_pack_uint64(x, 0x100); check_sbuffer(cd0100);   /* cd 01 00 */ | ||||||
|  |     msgpack_pack_uint64(x, 0xFFFF); check_sbuffer(cdffff);  /* cd ff ff */ | ||||||
|  |     msgpack_pack_uint64(x, 0x10000); check_sbuffer(ce00010000);     /* ce 00 01 00 00 */ | ||||||
|  |     msgpack_pack_uint64(x, 0xFFFFFFFF); check_sbuffer(ceffffffff);  /* ce ff ff ff ff */ | ||||||
|  |     msgpack_pack_uint64(x, 0x100000000); check_sbuffer(cf0000000100000000);         /* cf 00 00 00 01 00 00 00 00 */ | ||||||
|  |     msgpack_pack_uint64(x, 0xFFFFFFFFFFFFFFFF); check_sbuffer(cfffffffffffffffff);  /* cf ff ff ff ff ff ff ff ff */ | ||||||
|  |  | ||||||
|  |     msgpack_pack_fix_int8(x, 0x7F); check_sbuffer(d07f);            /* d0 7f */ | ||||||
|  |     msgpack_pack_fix_int8(x, -0x7F-1); check_sbuffer(d080);         /* d0 80 */ | ||||||
|  |     msgpack_pack_fix_int16(x, 0x7FFF); check_sbuffer(d17fff);       /* d1 7f ff */ | ||||||
|  |     msgpack_pack_fix_int16(x, -0x7FFF-1); check_sbuffer(d18000);    /* d1 80 00 */ | ||||||
|  |     msgpack_pack_fix_int32(x, 0x7FFFFFFF); check_sbuffer(d27fffffff);       /* d2 7f ff ff ff */ | ||||||
|  |     msgpack_pack_fix_int32(x, -0x7FFFFFFF-1); check_sbuffer(d280000000);    /* d2 80 00 00 00 */ | ||||||
|  |     msgpack_pack_fix_int64(x, 0x7FFFFFFFFFFFFFFF); check_sbuffer(d37fffffffffffffff);       /* d3 7f ff ff ff ff ff ff ff */ | ||||||
|  |     msgpack_pack_fix_int64(x, -0x7FFFFFFFFFFFFFFF-1); check_sbuffer(d38000000000000000);    /* d3 80 00 00 00 00 00 00 00 */ | ||||||
|  |  | ||||||
|  |     msgpack_pack_int8(x, -0x7F-1); check_sbuffer(d080);         /* d0 80 */ | ||||||
|  |     msgpack_pack_int8(x, -0x21); check_sbuffer(d0df);           /* d0 df */ | ||||||
|  |     msgpack_pack_int8(x, -0x20); check_sbuffer(e0);             /* e0 */ | ||||||
|  |     msgpack_pack_int8(x, -1); check_sbuffer(ff);                /* ff */ | ||||||
|  |     msgpack_pack_int8(x, 0); check_sbuffer(00);                 /* 00 */ | ||||||
|  |     msgpack_pack_int8(x, 0x7F); check_sbuffer(7f);              /* 7f */ | ||||||
|  |  | ||||||
|  |     msgpack_pack_int16(x, -0x7FFF-1); check_sbuffer(d18000);    /* d1 80 00 */ | ||||||
|  |     msgpack_pack_int16(x, -0x81); check_sbuffer(d1ff7f);        /* d1 ff 7f */ | ||||||
|  |     msgpack_pack_int16(x, -0x80); check_sbuffer(d080);          /* d0 80 */ | ||||||
|  |     msgpack_pack_int16(x, -0x21); check_sbuffer(d0df);          /* d0 df */ | ||||||
|  |     msgpack_pack_int16(x, -0x20); check_sbuffer(e0);            /* e0 */ | ||||||
|  |     msgpack_pack_int16(x, -0x1); check_sbuffer(ff);             /* ff */ | ||||||
|  |     msgpack_pack_int16(x, 0); check_sbuffer(00);                /* 00 */ | ||||||
|  |     msgpack_pack_int16(x, 0x7F); check_sbuffer(7f);             /* 7f */ | ||||||
|  |     msgpack_pack_int16(x, 0x80); check_sbuffer(cc80);           /* cc 80 */ | ||||||
|  |     msgpack_pack_int16(x, 0xFF); check_sbuffer(ccff);           /* cc ff */ | ||||||
|  |     msgpack_pack_int16(x, 0x100); check_sbuffer(cd0100);        /* cd 01 00 */ | ||||||
|  |     msgpack_pack_int16(x, 0x7FFF); check_sbuffer(cd7fff);       /* cd 7f ff */ | ||||||
|  |  | ||||||
|  |     msgpack_pack_int32(x, -0x7FFFFFFF-1); check_sbuffer(d280000000);    /* d2 80 00 00 00 */ | ||||||
|  |     msgpack_pack_int32(x, -0x8001); check_sbuffer(d2ffff7fff);          /* d2 ff ff 7f ff */ | ||||||
|  |     msgpack_pack_int32(x, -0x8000); check_sbuffer(d18000);              /* d1 80 00 */ | ||||||
|  |     msgpack_pack_int32(x, -0x81); check_sbuffer(d1ff7f);                /* d1 ff 7f */ | ||||||
|  |     msgpack_pack_int32(x, -0x80); check_sbuffer(d080);                  /* d0 80 */ | ||||||
|  |     msgpack_pack_int32(x, -0x21); check_sbuffer(d0df);                  /* d0 df */ | ||||||
|  |     msgpack_pack_int32(x, -0x20); check_sbuffer(e0);                    /* e0 */ | ||||||
|  |     msgpack_pack_int32(x, -0x1); check_sbuffer(ff);                     /* ff */ | ||||||
|  |     msgpack_pack_int32(x, 0); check_sbuffer(00);                        /* 00 */ | ||||||
|  |     msgpack_pack_int32(x, 0x7F); check_sbuffer(7f);                     /* 7f */ | ||||||
|  |     msgpack_pack_int32(x, 0x80); check_sbuffer(cc80);                   /* cc 80 */ | ||||||
|  |     msgpack_pack_int32(x, 0xFF); check_sbuffer(ccff);                   /* cc ff */ | ||||||
|  |     msgpack_pack_int32(x, 0x100); check_sbuffer(cd0100);                /* cd 01 00 */ | ||||||
|  |     msgpack_pack_int32(x, 0xFFFF); check_sbuffer(cdffff);               /* cd ff ff */ | ||||||
|  |     msgpack_pack_int32(x, 0x10000); check_sbuffer(ce00010000);          /* ce 00 01 00 00 */ | ||||||
|  |     msgpack_pack_int32(x, 0x7FFFFFFF); check_sbuffer(ce7fffffff);       /* ce 7f ff ff ff */ | ||||||
|  |  | ||||||
|  |     msgpack_pack_int64(x, -0x7FFFFFFFFFFFFFFF-1); check_sbuffer(d38000000000000000);    /* d3 80 00 00 00 00 00 00 00 */ | ||||||
|  |     msgpack_pack_int64(x, -((1LL<<31)+1)); check_sbuffer(d3ffffffff7fffffff);   /* d3 ff ff ff ff 7f ff ff ff */ | ||||||
|  |     msgpack_pack_int64(x, -(1LL<<31)); check_sbuffer(d280000000);               /* d2 80 00 00 00 */ | ||||||
|  |     msgpack_pack_int64(x, -0x8001); check_sbuffer(d2ffff7fff);                  /* d2 ff ff 7f ff */ | ||||||
|  |     msgpack_pack_int64(x, -0x8000); check_sbuffer(d18000);                      /* d1 80 00 */ | ||||||
|  |     msgpack_pack_int64(x, -0x81); check_sbuffer(d1ff7f);                        /* d1 ff 7f */ | ||||||
|  |     msgpack_pack_int64(x, -0x80); check_sbuffer(d080);                          /* d0 80 */ | ||||||
|  |     msgpack_pack_int64(x, -0x21); check_sbuffer(d0df);                          /* d0 df */ | ||||||
|  |     msgpack_pack_int64(x, -0x20); check_sbuffer(e0);                            /* e0 */ | ||||||
|  |     msgpack_pack_int64(x, -0x1); check_sbuffer(ff);                             /* ff */ | ||||||
|  |     msgpack_pack_int64(x, 0); check_sbuffer(00);                                /* 00 */ | ||||||
|  |     msgpack_pack_int64(x, 0x7F); check_sbuffer(7f);                             /* 7f */ | ||||||
|  |     msgpack_pack_int64(x, 0x80); check_sbuffer(cc80);                           /* cc 80 */ | ||||||
|  |     msgpack_pack_int64(x, 0xFF); check_sbuffer(ccff);                           /* cc ff */ | ||||||
|  |     msgpack_pack_int64(x, 0x100); check_sbuffer(cd0100);                        /* cd 01 00 */ | ||||||
|  |     msgpack_pack_int64(x, 0xFFFF); check_sbuffer(cdffff);                       /* cd ff ff */ | ||||||
|  |     msgpack_pack_int64(x, 0x10000); check_sbuffer(ce00010000);                  /* ce 00 01 00 00 */ | ||||||
|  |     msgpack_pack_int64(x, 0xFFFFFFFF); check_sbuffer(ceffffffff);               /* ce ff ff ff ff */ | ||||||
|  |     msgpack_pack_int64(x, 0x100000000); check_sbuffer(cf0000000100000000);      /* cf 00 00 00 01 00 00 00 00 */ | ||||||
|  |     msgpack_pack_int64(x, 0x7FFFFFFFFFFFFFFF); check_sbuffer(cf7fffffffffffffff);   /* cf 7f ff ff ff ff ff ff ff */ | ||||||
|  |  | ||||||
|  |     msgpack_pack_nil(x);    check_sbuffer(c0);          /* c0 */ | ||||||
|  |     msgpack_pack_false(x);  check_sbuffer(c2);          /* c2 */ | ||||||
|  |     msgpack_pack_true(x);   check_sbuffer(c3);          /* c3 */ | ||||||
|  |  | ||||||
|  |     msgpack_pack_float(x, 1.0); check_sbuffer(ca3f800000);          /* ca 3f 80 00 00 */ | ||||||
|  |     msgpack_pack_double(x, 1.0); check_sbuffer(cb3ff0000000000000); /* cb 3f f0 00 00 00 00 00 00 */ | ||||||
|  |  | ||||||
|  |     msgpack_pack_unsigned_char(x, UINT8_MAX);       /* same as msgpack_pack_uint8() */ | ||||||
|  |     msgpack_pack_unsigned_short(x, (unsigned short)UINT64_MAX); | ||||||
|  |     msgpack_pack_unsigned_int(x, (unsigned int)UINT64_MAX); | ||||||
|  |     msgpack_pack_unsigned_long(x, (unsigned long)UINT64_MAX); | ||||||
|  |     msgpack_pack_unsigned_long_long(x, (unsigned long long)UINT64_MAX); | ||||||
|  |  | ||||||
|  |     msgpack_pack_signed_char(x, INT8_MAX);          /* same as msgpack_pack_int8() */ | ||||||
|  |  | ||||||
|  | #define check_sbuffer_n(b)                                   \ | ||||||
|  |     do {                                                     \ | ||||||
|  |         size_t len = strlen(#b);                             \ | ||||||
|  |         assert(bytesncmp(sbuf.data + offset, #b, len) == 0); \ | ||||||
|  |         offset = sbuf.size;                                  \ | ||||||
|  |     } while (0) | ||||||
|  |  | ||||||
|  | #define fill_str(n) msgpack_pack_str_body(x, data, n) | ||||||
|  |  | ||||||
|  |     offset = sbuf.size; | ||||||
|  |     msgpack_pack_str(x, 0); /* "" */ check_sbuffer(a0); /* a0 */ | ||||||
|  |     msgpack_pack_str(x, 31); | ||||||
|  |     fill_str(31); check_sbuffer_n(bf);                  /* bf ... */ | ||||||
|  |     msgpack_pack_str(x, 32); | ||||||
|  |     fill_str(32); check_sbuffer_n(d920);                /* d9 20 ... */ | ||||||
|  |     msgpack_pack_str(x, 255); | ||||||
|  |     fill_str(255); check_sbuffer_n(d9ff);               /* d9 ff ... */ | ||||||
|  |     msgpack_pack_str(x, 256); | ||||||
|  |     fill_str(256); check_sbuffer_n(da0100);             /* da 01 00 ... */ | ||||||
|  |     msgpack_pack_str(x, 65535); | ||||||
|  |     fill_str(65535); check_sbuffer_n(daffff);           /* da ff ff ... */ | ||||||
|  |     msgpack_pack_str(x, 65536); | ||||||
|  |     fill_str(65536); check_sbuffer_n(db00010000);       /* db 00 01 00 00 ... */ | ||||||
|  |  | ||||||
|  | #define fill_map(n)                                             \ | ||||||
|  |     do {                                                        \ | ||||||
|  |         size_t i = 0;                                           \ | ||||||
|  |         for (; i < n * 2; i++) { msgpack_pack_int8(x, 0x1); }   \ | ||||||
|  |     } while (0); | ||||||
|  |  | ||||||
|  |     msgpack_pack_map(x, 0); /* {} */ check_sbuffer(80); /* 80 */ | ||||||
|  |     msgpack_pack_map(x, 1); | ||||||
|  |     fill_map(1); check_sbuffer_n(81);                   /* 81 ... */ | ||||||
|  |     msgpack_pack_map(x, 15); | ||||||
|  |     fill_map(15); check_sbuffer_n(8f);                  /* 8f ... */ | ||||||
|  |     msgpack_pack_map(x, 16); | ||||||
|  |     fill_map(16); check_sbuffer_n(de0010);              /* de 00 10 ... */ | ||||||
|  |     msgpack_pack_map(x, 65535); | ||||||
|  |     fill_map(65535); check_sbuffer_n(deffff);           /* de ff ff ... */ | ||||||
|  |     msgpack_pack_map(x, 65536); | ||||||
|  |     fill_map(65536); check_sbuffer_n(df00010000);       /* df 00 01 00 00 ... */ | ||||||
|  |  | ||||||
|  | #define fill_array(n)                                       \ | ||||||
|  |     do {                                                    \ | ||||||
|  |         size_t i = 0;                                       \ | ||||||
|  |         for (; i < n; i++) { msgpack_pack_int8(x, 0x1); }   \ | ||||||
|  |     } while (0); | ||||||
|  |  | ||||||
|  |     msgpack_pack_array(x, 0); /* [] */ check_sbuffer(90);   /* 90 */ | ||||||
|  |     msgpack_pack_array(x, 1); | ||||||
|  |     fill_array(1); check_sbuffer_n(91);                 /* 91 ... */ | ||||||
|  |     msgpack_pack_array(x, 15); | ||||||
|  |     fill_array(15); check_sbuffer_n(9f);                /* 9f ... */ | ||||||
|  |     msgpack_pack_array(x, 16); | ||||||
|  |     fill_array(16); check_sbuffer_n(dc0010);            /* dc 00 10 ... */ | ||||||
|  |     msgpack_pack_array(x, 65535); | ||||||
|  |     fill_array(65535); check_sbuffer_n(dcffff);         /* dc ff ff ... */ | ||||||
|  |     msgpack_pack_array(x, 65536); | ||||||
|  |     fill_array(65536); check_sbuffer_n(dd00010000);     /* dd 00 01 00 00 ... */ | ||||||
|  |  | ||||||
|  | #define fill_bin(n) msgpack_pack_bin_body(x, data, n) | ||||||
|  |  | ||||||
|  |     msgpack_pack_bin(x, 0); check_sbuffer(c400);        /* c4 00 */ | ||||||
|  |     msgpack_pack_bin(x, 1); | ||||||
|  |     fill_bin(1); check_sbuffer_n(c401);                 /* c4 01 ... */ | ||||||
|  |     msgpack_pack_bin(x, 255); | ||||||
|  |     fill_bin(255); check_sbuffer_n(c4ff);               /* c4 ff ... */ | ||||||
|  |     msgpack_pack_bin(x, 256); | ||||||
|  |     fill_bin(256); check_sbuffer_n(c50100);             /* c5 01 00 ... */ | ||||||
|  |     msgpack_pack_bin(x, 65535); | ||||||
|  |     fill_bin(65535); check_sbuffer_n(c5ffff);           /* c5 ff ff ... */ | ||||||
|  |     msgpack_pack_bin(x, 65536); | ||||||
|  |     fill_bin(65536); check_sbuffer_n(c600010000);       /* c6 00 01 00 00 ... */ | ||||||
|  |  | ||||||
|  | #define fill_ext(n) msgpack_pack_ext_body(x, data, n) | ||||||
|  |  | ||||||
|  |     msgpack_pack_ext(x, 1, 0x7F); | ||||||
|  |     fill_ext(1); check_sbuffer_n(d47f);                 /* d4 7f ... */ | ||||||
|  |     msgpack_pack_ext(x, 2, 0x7F); | ||||||
|  |     fill_ext(2); check_sbuffer_n(d57f);                 /* d5 7f ... */ | ||||||
|  |     msgpack_pack_ext(x, 4, 0x7F); | ||||||
|  |     fill_ext(4); check_sbuffer_n(d67f);                 /* d6 7f ... */ | ||||||
|  |     msgpack_pack_ext(x, 8, 0x7F); | ||||||
|  |     fill_ext(8); check_sbuffer_n(d77f);                 /* d7 7f ... */ | ||||||
|  |     msgpack_pack_ext(x, 16, 0x7F); | ||||||
|  |     fill_ext(16); check_sbuffer_n(d87f);                /* d8 7f ... */ | ||||||
|  |  | ||||||
|  |     msgpack_pack_ext(x, 0, 0x7F); check_sbuffer(c7007f); /* c7 00 7f */ | ||||||
|  |     msgpack_pack_ext(x, 3, 0x7F); | ||||||
|  |     fill_ext(3); check_sbuffer_n(c7037f);               /* c7 03 7f */ | ||||||
|  |     msgpack_pack_ext(x, 5, 0x7F); | ||||||
|  |     fill_ext(5); check_sbuffer_n(c7057f);               /* c7 05 7f */ | ||||||
|  |     msgpack_pack_ext(x, 17, 0x7F); | ||||||
|  |     fill_ext(17); check_sbuffer_n(c7117f);              /* c7 11 7f */ | ||||||
|  |     msgpack_pack_ext(x, 255, 0x7F); | ||||||
|  |     fill_ext(255); check_sbuffer_n(c7ff7f);             /* c7 ff 7f ... */ | ||||||
|  |     msgpack_pack_ext(x, 256, 0x7F); | ||||||
|  |     fill_ext(256); check_sbuffer_n(c801007f);           /* c8 01 00 7f ... */ | ||||||
|  |     msgpack_pack_ext(x, 65535, 0x7F); | ||||||
|  |     fill_ext(65535); check_sbuffer_n(c8ffff7f);         /* c8 ff ff 7f ... */ | ||||||
|  |     msgpack_pack_ext(x, 65536, 0x7F); | ||||||
|  |     fill_ext(65536); check_sbuffer_n(c9000100007f);     /* c9 00 01 00 00 7f ... */ | ||||||
|  |  | ||||||
|  |     msgpack_pack_timestamp(x, ts); check_sbuffer(d6ffffffffff); /* d6 ff ff ff ff ff */ | ||||||
|  |     msgpack_pack_timestamp(x, ts + 1); check_sbuffer(d7ff0000000100000000); /* d7 ff 00 00 00 01 00 00 00 00 */ | ||||||
|  |     msgpack_pack_timestamp(x, ts + 2); check_sbuffer(d7ff00000003ffffffff); /* d7 ff 00 00 00 03 ff ff ff ff */ | ||||||
|  |     msgpack_pack_timestamp(x, ts + 3); check_sbuffer(c70cff000000000000000400000000);   /* c7 0c ff 00 00 00 00 00 00 00 04 00 00 00 00 */ | ||||||
|  |     msgpack_pack_timestamp(x, ts + 4); check_sbuffer(c70cffffffffff7fffffffffffffff);   /* c7 0c ff ff ff ff ff 7f ff ff ff ff ff ff ff */ | ||||||
|  |  | ||||||
|  |     msgpack_sbuffer_destroy(&sbuf); | ||||||
|  |     msgpack_packer_free(x); | ||||||
|  |  | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
							
								
								
									
										17
									
								
								example/cmake/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								example/cmake/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | |||||||
|  | cmake_minimum_required (VERSION 3.0) | ||||||
|  | project (example) | ||||||
|  |  | ||||||
|  | if(EXAMPLE_MSGPACK_EMBEDDED) | ||||||
|  |     add_subdirectory(msgpack-c) | ||||||
|  |     set(msgpackc_DIR ${CMAKE_CURRENT_BINARY_DIR}/msgpack-c) | ||||||
|  | endif() | ||||||
|  |  | ||||||
|  | find_package(msgpackc REQUIRED) | ||||||
|  |  | ||||||
|  | add_executable (${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR}/../simple_c.c) | ||||||
|  | target_link_libraries(${PROJECT_NAME} msgpackc) | ||||||
|  |  | ||||||
|  | if(TARGET msgpackc-static) | ||||||
|  |     add_executable (${PROJECT_NAME}-static ${CMAKE_CURRENT_LIST_DIR}/../simple_c.c) | ||||||
|  |     target_link_libraries(${PROJECT_NAME}-static msgpackc-static) | ||||||
|  | endif() | ||||||
| @@ -1,110 +0,0 @@ | |||||||
| FIND_PACKAGE (Threads REQUIRED) |  | ||||||
|  |  | ||||||
| FIND_PACKAGE (Boost COMPONENTS timer) |  | ||||||
|  |  | ||||||
| LIST (APPEND exec_PROGRAMS |  | ||||||
|     class_intrusive.cpp |  | ||||||
|     class_intrusive_map.cpp |  | ||||||
|     class_non_intrusive.cpp |  | ||||||
|     custom.cpp |  | ||||||
|     enum.cpp |  | ||||||
|     map_based_versionup.cpp |  | ||||||
|     protocol_new.cpp |  | ||||||
|     reuse_zone.cpp |  | ||||||
|     simple.cpp |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| IF (MSGPACK_DEFAULT_API_VERSION EQUAL 1) |  | ||||||
|     LIST (APPEND exec_PROGRAMS |  | ||||||
|         protocol.cpp |  | ||||||
|     ) |  | ||||||
| ENDIF () |  | ||||||
|  |  | ||||||
| IF (NOT MSVC) |  | ||||||
|     LIST (APPEND with_pthread_PROGRAMS |  | ||||||
|         stream.cpp |  | ||||||
|     ) |  | ||||||
| ENDIF () |  | ||||||
|  |  | ||||||
| if (Boost_TIMER_LIBRARY) |  | ||||||
|     LIST (APPEND with_boost_lib_PROGRAMS |  | ||||||
|         speed_test.cpp |  | ||||||
|         speed_test_nested_array.cpp |  | ||||||
|     ) |  | ||||||
| endif() |  | ||||||
|  |  | ||||||
| FOREACH (source_file ${exec_PROGRAMS}) |  | ||||||
|     GET_FILENAME_COMPONENT (source_file_we ${source_file} NAME_WE) |  | ||||||
|     ADD_EXECUTABLE ( |  | ||||||
|         ${source_file_we} |  | ||||||
|         ${source_file} |  | ||||||
|     ) |  | ||||||
|     TARGET_LINK_LIBRARIES (${source_file_we} PRIVATE |  | ||||||
|         msgpackc-cxx |  | ||||||
|     ) |  | ||||||
|     IF ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") |  | ||||||
|         SET_PROPERTY (TARGET ${source_file_we} APPEND_STRING PROPERTY COMPILE_FLAGS " -Wall -Wextra") |  | ||||||
|     ENDIF () |  | ||||||
|     IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") |  | ||||||
|         IF (CMAKE_CXX_FLAGS MATCHES "/W[0-4]") |  | ||||||
|             STRING(REGEX REPLACE "/W[0-4]" "/W3 /WX" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") |  | ||||||
|         ELSE () |  | ||||||
|             SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3 /WX") |  | ||||||
|         ENDIF () |  | ||||||
|     ENDIF () |  | ||||||
| ENDFOREACH () |  | ||||||
|  |  | ||||||
| FOREACH (source_file ${with_pthread_PROGRAMS}) |  | ||||||
|     GET_FILENAME_COMPONENT (source_file_we ${source_file} NAME_WE) |  | ||||||
|     ADD_EXECUTABLE ( |  | ||||||
|         ${source_file_we} |  | ||||||
|         ${source_file} |  | ||||||
|     ) |  | ||||||
|     TARGET_LINK_LIBRARIES (${source_file_we} PRIVATE |  | ||||||
|         msgpackc-cxx |  | ||||||
|         Threads::Threads |  | ||||||
|     ) |  | ||||||
|     IF ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") |  | ||||||
|         SET_PROPERTY (TARGET ${source_file_we} APPEND_STRING PROPERTY COMPILE_FLAGS " -Wall -Wextra") |  | ||||||
|     ENDIF () |  | ||||||
|     IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") |  | ||||||
|         IF (CMAKE_CXX_FLAGS MATCHES "/W[0-4]") |  | ||||||
|             STRING(REGEX REPLACE "/W[0-4]" "/W3 /WX" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") |  | ||||||
|         ELSE () |  | ||||||
|             SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3 /WX") |  | ||||||
|         ENDIF () |  | ||||||
|     ENDIF () |  | ||||||
| ENDFOREACH () |  | ||||||
|  |  | ||||||
| FOREACH (source_file ${with_boost_lib_PROGRAMS}) |  | ||||||
|     GET_FILENAME_COMPONENT (source_file_we ${source_file} NAME_WE) |  | ||||||
|     ADD_EXECUTABLE ( |  | ||||||
|         ${source_file_we} |  | ||||||
|         ${source_file} |  | ||||||
|     ) |  | ||||||
|     TARGET_LINK_LIBRARIES (${source_file_we} PRIVATE |  | ||||||
|         msgpackc-cxx |  | ||||||
|         Boost::timer |  | ||||||
|     ) |  | ||||||
|     IF (NOT MSVC AND NOT APPLE) |  | ||||||
|         TARGET_LINK_LIBRARIES (${source_file_we} PRIVATE |  | ||||||
|             rt |  | ||||||
|         ) |  | ||||||
|     ENDIF () |  | ||||||
|  |  | ||||||
|     IF ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") |  | ||||||
|         SET_PROPERTY (TARGET ${source_file_we} APPEND_STRING PROPERTY COMPILE_FLAGS "-Wall -Wextra -Werror -O3") |  | ||||||
|     ENDIF () |  | ||||||
|  |  | ||||||
|     IF ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") |  | ||||||
|         SET_PROPERTY (TARGET ${source_file_we} APPEND_STRING PROPERTY COMPILE_FLAGS " -Wno-mismatched-tags") |  | ||||||
|     ENDIF () |  | ||||||
|  |  | ||||||
|     IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") |  | ||||||
|         IF (CMAKE_CXX_FLAGS MATCHES "/W[0-4]") |  | ||||||
|             STRING(REGEX REPLACE "/W[0-4]" "/W3 /WX" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") |  | ||||||
|         ELSE () |  | ||||||
|             SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3 /WX") |  | ||||||
|         ENDIF () |  | ||||||
|     ENDIF () |  | ||||||
| ENDFOREACH () |  | ||||||
| @@ -1,104 +0,0 @@ | |||||||
| // MessagePack for C++ example |  | ||||||
| // |  | ||||||
| // Copyright (C) 2008-2015 FURUHASHI Sadayuki and KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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) |  | ||||||
| // |  | ||||||
|  |  | ||||||
| #include <string> |  | ||||||
| #include <iostream> |  | ||||||
| #include <iomanip> |  | ||||||
| #include <sstream> |  | ||||||
| #include <cassert> |  | ||||||
|  |  | ||||||
| // When you want to adapt map instead of array, you can enable these macro definition. |  | ||||||
| // |  | ||||||
| // #define MSGPACK_USE_DEFINE_MAP |  | ||||||
|  |  | ||||||
|  |  | ||||||
| #include <msgpack.hpp> |  | ||||||
|  |  | ||||||
| struct my_base1 { |  | ||||||
|     int a; |  | ||||||
|     MSGPACK_DEFINE(a); |  | ||||||
| }; |  | ||||||
| inline bool operator==(my_base1 const& lhs, my_base1 const& rhs) { |  | ||||||
|     return lhs.a == rhs.a; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| struct my_base2 { |  | ||||||
|     std::string b; |  | ||||||
|     std::string c; |  | ||||||
|     MSGPACK_DEFINE(b, c); |  | ||||||
| }; |  | ||||||
| inline bool operator==(my_base2 const& lhs, my_base2 const& rhs) { |  | ||||||
|     return lhs.b == rhs.b && lhs.c == rhs.c; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| class my_class : public my_base1, private my_base2 { |  | ||||||
| public: |  | ||||||
|     my_class() {} // When you want to convert from msgpack::object to my_class, |  | ||||||
|                   // my_class should be default constractible. |  | ||||||
|     my_class(std::string const& name, int age):name_(name), age_(age) {} |  | ||||||
|     void set_b(std::string const& str) { b = str; } |  | ||||||
|     void set_c(std::string const& str) { c = str; } |  | ||||||
|     friend bool operator==(my_class const& lhs, my_class const& rhs) { |  | ||||||
|         return |  | ||||||
|             static_cast<my_base1 const&>(lhs) == static_cast<my_base1 const&>(rhs) && |  | ||||||
|             static_cast<my_base2 const&>(lhs) == static_cast<my_base2 const&>(rhs) && |  | ||||||
|             lhs.name_ == rhs.name_ && lhs.age_ == rhs.age_; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
| private: |  | ||||||
|     std::string name_; |  | ||||||
|     int age_; |  | ||||||
|  |  | ||||||
| public: |  | ||||||
|     MSGPACK_DEFINE(name_, age_, MSGPACK_BASE(my_base1), MSGPACK_BASE(my_base2)); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| void print(std::string const& buf) { |  | ||||||
|     for (std::string::const_iterator it = buf.begin(), end = buf.end(); |  | ||||||
|          it != end; |  | ||||||
|          ++it) { |  | ||||||
|         std::cout |  | ||||||
|             << std::setw(2) |  | ||||||
|             << std::hex |  | ||||||
|             << std::setfill('0') |  | ||||||
|             << (static_cast<int>(*it) & 0xff) |  | ||||||
|             << ' '; |  | ||||||
|     } |  | ||||||
|     std::cout << std::dec << std::endl; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| int main() { |  | ||||||
|     {   // pack, unpack |  | ||||||
|         my_class my("John Smith", 42); |  | ||||||
|         my.a = 123; |  | ||||||
|         my.set_b("ABC"); |  | ||||||
|         my.set_c("DEF"); |  | ||||||
|         std::stringstream ss; |  | ||||||
|         msgpack::pack(ss, my); |  | ||||||
|  |  | ||||||
|         std::string const& str = ss.str(); |  | ||||||
|         print(str); |  | ||||||
|  |  | ||||||
|         msgpack::object_handle oh = |  | ||||||
|             msgpack::unpack(str.data(), str.size()); |  | ||||||
|         msgpack::object obj = oh.get(); |  | ||||||
|         std::cout << obj << std::endl; |  | ||||||
|         assert(obj.as<my_class>() == my); |  | ||||||
|     } |  | ||||||
|     {   // create object with zone |  | ||||||
|         my_class my("John Smith", 42); |  | ||||||
|         my.a = 123; |  | ||||||
|         my.set_b("ABC"); |  | ||||||
|         my.set_c("DEF"); |  | ||||||
|         msgpack::zone z; |  | ||||||
|         msgpack::object obj(my, z); |  | ||||||
|         std::cout << obj << std::endl; |  | ||||||
|         assert(obj.as<my_class>() == my); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @@ -1,76 +0,0 @@ | |||||||
| // MessagePack for C++ example |  | ||||||
| // |  | ||||||
| // Copyright (C) 2015 KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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) |  | ||||||
| // |  | ||||||
|  |  | ||||||
| #include <string> |  | ||||||
| #include <iostream> |  | ||||||
| #include <iomanip> |  | ||||||
| #include <sstream> |  | ||||||
| #include <cassert> |  | ||||||
|  |  | ||||||
| #include <msgpack.hpp> |  | ||||||
|  |  | ||||||
|  |  | ||||||
| class my_class { |  | ||||||
| public: |  | ||||||
|     my_class() {} // When you want to convert from msgpack::object to my_class, |  | ||||||
|                   // my_class should be default constractible. |  | ||||||
|                   // If you use C++11, you can adapt non-default constructible |  | ||||||
|                   // classes to msgpack::object. |  | ||||||
|                   // See https://github.com/msgpack/msgpack-c/wiki/v1_1_cpp_adaptor#non-default-constructible-class-support-c11-only |  | ||||||
|     my_class(std::string const& name, int age):name_(name), age_(age) {} |  | ||||||
|  |  | ||||||
|     friend bool operator==(my_class const& lhs, my_class const& rhs) { |  | ||||||
|         return lhs.name_ == rhs.name_ && lhs.age_ == rhs.age_; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
| private: |  | ||||||
|     std::string name_; |  | ||||||
|     int age_; |  | ||||||
|  |  | ||||||
| public: |  | ||||||
|     MSGPACK_DEFINE_MAP(name_, age_); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| void print(std::string const& buf) { |  | ||||||
|     for (std::string::const_iterator it = buf.begin(), end = buf.end(); |  | ||||||
|          it != end; |  | ||||||
|          ++it) { |  | ||||||
|         std::cout |  | ||||||
|             << std::setw(2) |  | ||||||
|             << std::hex |  | ||||||
|             << std::setfill('0') |  | ||||||
|             << (static_cast<int>(*it) & 0xff) |  | ||||||
|             << ' '; |  | ||||||
|     } |  | ||||||
|     std::cout << std::dec << std::endl; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| int main() { |  | ||||||
|     {   // pack, unpack |  | ||||||
|         my_class my("John Smith", 42); |  | ||||||
|         std::stringstream ss; |  | ||||||
|         msgpack::pack(ss, my); |  | ||||||
|  |  | ||||||
|         print(ss.str()); |  | ||||||
|  |  | ||||||
|         std::string const& str = ss.str(); |  | ||||||
|         msgpack::object_handle oh = |  | ||||||
|             msgpack::unpack(str.data(), str.size()); |  | ||||||
|         msgpack::object obj = oh.get(); |  | ||||||
|         std::cout << obj << std::endl; |  | ||||||
|         assert(obj.as<my_class>() == my); |  | ||||||
|     } |  | ||||||
|     {   // create object with zone |  | ||||||
|         my_class my("John Smith", 42); |  | ||||||
|         msgpack::zone z; |  | ||||||
|         msgpack::object obj(my, z); |  | ||||||
|         std::cout << obj << std::endl; |  | ||||||
|         assert(obj.as<my_class>() == my); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @@ -1,119 +0,0 @@ | |||||||
| // MessagePack for C++ example |  | ||||||
| // |  | ||||||
| // Copyright (C) 2008-2015 FURUHASHI Sadayuki and KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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) |  | ||||||
| // |  | ||||||
|  |  | ||||||
| #include <string> |  | ||||||
| #include <iostream> |  | ||||||
| #include <iomanip> |  | ||||||
| #include <sstream> |  | ||||||
| #include <cassert> |  | ||||||
|  |  | ||||||
| #include <msgpack.hpp> |  | ||||||
|  |  | ||||||
| class my_class { |  | ||||||
| public: |  | ||||||
|     my_class() {} // When you want to convert from msgpack::object to my_class, |  | ||||||
|                   // my_class should be default constractible. |  | ||||||
|     my_class(std::string const& name, int age):name_(name), age_(age) {} |  | ||||||
|  |  | ||||||
|     // my_class should provide getters for the data members you want to pack. |  | ||||||
|     std::string const& get_name() const { return name_; } |  | ||||||
|     int get_age() const { return age_; } |  | ||||||
|  |  | ||||||
|     friend bool operator==(my_class const& lhs, my_class const& rhs) { |  | ||||||
|         return lhs.name_ == rhs.name_ && lhs.age_ == rhs.age_; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
| private: |  | ||||||
|     std::string name_; |  | ||||||
|     int age_; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| // User defined class template specialization |  | ||||||
| namespace msgpack { |  | ||||||
| MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS) { |  | ||||||
| namespace adaptor { |  | ||||||
|  |  | ||||||
| template<> |  | ||||||
| struct convert<my_class> { |  | ||||||
|     msgpack::object const& operator()(msgpack::object const& o, my_class& v) const { |  | ||||||
|         if (o.type != msgpack::type::ARRAY) throw msgpack::type_error(); |  | ||||||
|         if (o.via.array.size != 2) throw msgpack::type_error(); |  | ||||||
|         v = my_class( |  | ||||||
|             o.via.array.ptr[0].as<std::string>(), |  | ||||||
|             o.via.array.ptr[1].as<int>()); |  | ||||||
|         return o; |  | ||||||
|     } |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| template<> |  | ||||||
| struct pack<my_class> { |  | ||||||
|     template <typename Stream> |  | ||||||
|     packer<Stream>& operator()(msgpack::packer<Stream>& o, my_class const& v) const { |  | ||||||
|         // packing member variables as an array. |  | ||||||
|         o.pack_array(2); |  | ||||||
|         o.pack(v.get_name()); |  | ||||||
|         o.pack(v.get_age()); |  | ||||||
|         return o; |  | ||||||
|     } |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| template <> |  | ||||||
| struct object_with_zone<my_class> { |  | ||||||
|     void operator()(msgpack::object::with_zone& o, my_class const& v) const { |  | ||||||
|         o.type = type::ARRAY; |  | ||||||
|         o.via.array.size = 2; |  | ||||||
|         o.via.array.ptr = static_cast<msgpack::object*>( |  | ||||||
|             o.zone.allocate_align(sizeof(msgpack::object) * o.via.array.size, MSGPACK_ZONE_ALIGNOF(msgpack::object))); |  | ||||||
|         o.via.array.ptr[0] = msgpack::object(v.get_name(), o.zone); |  | ||||||
|         o.via.array.ptr[1] = msgpack::object(v.get_age(), o.zone); |  | ||||||
|     } |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| } // namespace adaptor |  | ||||||
| } // MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS) |  | ||||||
| } // namespace msgpack |  | ||||||
|  |  | ||||||
|  |  | ||||||
| void print(std::string const& buf) { |  | ||||||
|     for (std::string::const_iterator it = buf.begin(), end = buf.end(); |  | ||||||
|          it != end; |  | ||||||
|          ++it) { |  | ||||||
|         std::cout |  | ||||||
|             << std::setw(2) |  | ||||||
|             << std::hex |  | ||||||
|             << std::setfill('0') |  | ||||||
|             << (static_cast<int>(*it) & 0xff) |  | ||||||
|             << ' '; |  | ||||||
|     } |  | ||||||
|     std::cout << std::dec << std::endl; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| int main() { |  | ||||||
|     {   // pack, unpack |  | ||||||
|         my_class my("John Smith", 42); |  | ||||||
|         std::stringstream ss; |  | ||||||
|         msgpack::pack(ss, my); |  | ||||||
|  |  | ||||||
|         std::string const& str = ss.str(); |  | ||||||
|         print(str); |  | ||||||
|  |  | ||||||
|         msgpack::object_handle oh = |  | ||||||
|             msgpack::unpack(str.data(), str.size()); |  | ||||||
|         msgpack::object obj = oh.get(); |  | ||||||
|         std::cout << obj << std::endl; |  | ||||||
|         assert(obj.as<my_class>() == my); |  | ||||||
|     } |  | ||||||
|     {   // create object with zone |  | ||||||
|         my_class my("John Smith", 42); |  | ||||||
|         msgpack::zone z; |  | ||||||
|         msgpack::object obj(my, z); |  | ||||||
|         std::cout << obj << std::endl; |  | ||||||
|         assert(obj.as<my_class>() == my); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @@ -1,67 +0,0 @@ | |||||||
| // MessagePack for C++ example |  | ||||||
| // |  | ||||||
| // Copyright (C) 2008-2015 FURUHASHI Sadayuki and KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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) |  | ||||||
| // |  | ||||||
|  |  | ||||||
| #include <msgpack.hpp> |  | ||||||
| #include <sstream> |  | ||||||
| #include <string> |  | ||||||
| #include <iostream> |  | ||||||
|  |  | ||||||
| class old_class { |  | ||||||
| public: |  | ||||||
|     old_class() : value("default") { } |  | ||||||
|  |  | ||||||
|     std::string value; |  | ||||||
|  |  | ||||||
|     MSGPACK_DEFINE(value); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| class new_class { |  | ||||||
| public: |  | ||||||
|     new_class() : value("default"), flag(-1) { } |  | ||||||
|  |  | ||||||
|     std::string value; |  | ||||||
|     int flag; |  | ||||||
|  |  | ||||||
|     MSGPACK_DEFINE(value, flag); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| int main(void) |  | ||||||
| { |  | ||||||
|     { |  | ||||||
|         old_class oc; |  | ||||||
|         new_class nc; |  | ||||||
|  |  | ||||||
|         std::stringstream sbuf; |  | ||||||
|         msgpack::pack(sbuf, oc); |  | ||||||
|  |  | ||||||
|         msgpack::object_handle oh = |  | ||||||
|             msgpack::unpack(sbuf.str().data(), sbuf.str().size()); |  | ||||||
|         msgpack::object obj = oh.get(); |  | ||||||
|  |  | ||||||
|         obj.convert(nc); |  | ||||||
|  |  | ||||||
|         std::cout << obj << " value=" << nc.value << " flag=" << nc.flag << std::endl; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     { |  | ||||||
|         new_class nc; |  | ||||||
|         old_class oc; |  | ||||||
|  |  | ||||||
|         std::stringstream sbuf; |  | ||||||
|         msgpack::pack(sbuf, nc); |  | ||||||
|  |  | ||||||
|         msgpack::object_handle oh = |  | ||||||
|             msgpack::unpack(sbuf.str().data(), sbuf.str().size()); |  | ||||||
|         msgpack::object obj = oh.get(); |  | ||||||
|  |  | ||||||
|         obj.convert(oc); |  | ||||||
|  |  | ||||||
|         std::cout << obj << " value=" << oc.value << std::endl; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @@ -1,59 +0,0 @@ | |||||||
| // MessagePack for C++ example |  | ||||||
| // |  | ||||||
| // Copyright (C) 2015 KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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) |  | ||||||
| // |  | ||||||
|  |  | ||||||
| #include <sstream> |  | ||||||
| #include <iostream> |  | ||||||
| #include <cassert> |  | ||||||
|  |  | ||||||
| #include <msgpack.hpp> |  | ||||||
|  |  | ||||||
| enum my_enum { |  | ||||||
|     elem1, |  | ||||||
|     elem2, |  | ||||||
|     elem3 |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| MSGPACK_ADD_ENUM(my_enum); |  | ||||||
|  |  | ||||||
| int main(void) |  | ||||||
| { |  | ||||||
|     {   // pack, unpack |  | ||||||
|         std::stringstream sbuf; |  | ||||||
|         msgpack::pack(sbuf, elem1); |  | ||||||
|         msgpack::pack(sbuf, elem2); |  | ||||||
|         my_enum e3 = elem3; |  | ||||||
|         msgpack::pack(sbuf, e3); |  | ||||||
|  |  | ||||||
|         msgpack::object_handle oh; |  | ||||||
|         std::size_t off = 0; |  | ||||||
|  |  | ||||||
|         msgpack::unpack(oh, sbuf.str().data(), sbuf.str().size(), off); |  | ||||||
|         std::cout << oh.get().as<my_enum>() << std::endl; |  | ||||||
|         assert(oh.get().as<my_enum>() == elem1); |  | ||||||
|  |  | ||||||
|         msgpack::unpack(oh, sbuf.str().data(), sbuf.str().size(), off); |  | ||||||
|         std::cout << oh.get().as<my_enum>() << std::endl; |  | ||||||
|         assert(oh.get().as<my_enum>() == elem2); |  | ||||||
|  |  | ||||||
|         msgpack::unpack(oh, sbuf.str().data(), sbuf.str().size(), off); |  | ||||||
|         std::cout << oh.get().as<my_enum>() << std::endl; |  | ||||||
|         assert(oh.get().as<my_enum>() == elem3); |  | ||||||
|     } |  | ||||||
|     {   // create object without zone |  | ||||||
|         msgpack::object obj(elem2); |  | ||||||
|         std::cout << obj.as<my_enum>() << std::endl; |  | ||||||
|         assert(obj.as<my_enum>() == elem2); |  | ||||||
|     } |  | ||||||
|     {   // create object with zone |  | ||||||
|         msgpack::zone z; |  | ||||||
|         msgpack::object objz(elem3, z); |  | ||||||
|         std::cout << objz.as<my_enum>() << std::endl; |  | ||||||
|         assert(objz.as<my_enum>() == elem3); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @@ -1,112 +0,0 @@ | |||||||
| // MessagePack for C++ example |  | ||||||
| // |  | ||||||
| // Copyright (C) 2015 KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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) |  | ||||||
| // |  | ||||||
|  |  | ||||||
| #include <string> |  | ||||||
| #include <iostream> |  | ||||||
| #include <iomanip> |  | ||||||
| #include <sstream> |  | ||||||
| #include <cassert> |  | ||||||
|  |  | ||||||
| #include <msgpack.hpp> |  | ||||||
|  |  | ||||||
| struct base1 { |  | ||||||
|     base1():a("default") {} |  | ||||||
|     std::string a; |  | ||||||
|     MSGPACK_DEFINE_MAP(a); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| struct v1 : base1 { |  | ||||||
|     v1():name("default"), age(0) {} |  | ||||||
|     std::string name; |  | ||||||
|     int age; |  | ||||||
|     MSGPACK_DEFINE_MAP(MSGPACK_BASE_MAP(base1), name, age); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| struct base2 { |  | ||||||
|     base2():a("default") {} |  | ||||||
|     std::string a; |  | ||||||
|     MSGPACK_DEFINE_MAP(a); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| // Removed: base1, name |  | ||||||
| // Added  : base2, address |  | ||||||
| struct v2 : base2 { |  | ||||||
|     v2(): age(0), address("default") {} |  | ||||||
|     int age; |  | ||||||
|     std::string address; |  | ||||||
|     MSGPACK_DEFINE_MAP(MSGPACK_BASE_MAP(base2), age, address); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| // The member variable "age" is in common between v1 and v2. |  | ||||||
|  |  | ||||||
| void print(std::string const& buf) { |  | ||||||
|     for (std::string::const_iterator it = buf.begin(), end = buf.end(); |  | ||||||
|          it != end; |  | ||||||
|          ++it) { |  | ||||||
|         std::cout |  | ||||||
|             << std::setw(2) |  | ||||||
|             << std::hex |  | ||||||
|             << std::setfill('0') |  | ||||||
|             << (static_cast<int>(*it) & 0xff) |  | ||||||
|             << ' '; |  | ||||||
|     } |  | ||||||
|     std::cout << std::dec << std::endl; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| int main() { |  | ||||||
|     { // pack v1, unpack, convert to v2 |  | ||||||
|         v1 v; |  | ||||||
|         v.a = "ABC"; |  | ||||||
|         v.name = "John Smith"; |  | ||||||
|         v.age = 35; |  | ||||||
|  |  | ||||||
|         std::stringstream ss; |  | ||||||
|         msgpack::pack(ss, v); |  | ||||||
|  |  | ||||||
|         print(ss.str()); |  | ||||||
|  |  | ||||||
|         std::string const& str = ss.str(); |  | ||||||
|         msgpack::object_handle oh = msgpack::unpack(str.data(), str.size()); |  | ||||||
|  |  | ||||||
|         msgpack::object obj = oh.get(); |  | ||||||
|         std::cout << obj << std::endl; |  | ||||||
|  |  | ||||||
|         v2 newv = obj.as<v2>(); |  | ||||||
|  |  | ||||||
|         std::cout << "v2::a       " << newv.a << std::endl; |  | ||||||
|         std::cout << "v2::age     " << newv.age << std::endl; |  | ||||||
|         std::cout << "v2::address " << newv.address << std::endl; |  | ||||||
|  |  | ||||||
|         // "age" is set from v1 |  | ||||||
|         assert(newv.a == "default"); |  | ||||||
|         assert(newv.age == 35); |  | ||||||
|         assert(newv.address == "default"); |  | ||||||
|     } |  | ||||||
|     { // create v2 object with zone, convert to v1 |  | ||||||
|         v2 v; |  | ||||||
|         v.a = "DEF"; |  | ||||||
|         v.age = 42; |  | ||||||
|         v.address = "Tokyo"; |  | ||||||
|  |  | ||||||
|         msgpack::zone z; |  | ||||||
|         msgpack::object obj(v, z); |  | ||||||
|         std::cout << obj << std::endl; |  | ||||||
|  |  | ||||||
|         v1 newv = obj.as<v1>(); |  | ||||||
|  |  | ||||||
|         std::cout << "v1::a       " << newv.a << std::endl; |  | ||||||
|         std::cout << "v1::name    " << newv.name << std::endl; |  | ||||||
|         std::cout << "v1::age     " << newv.age << std::endl; |  | ||||||
|  |  | ||||||
|         // "age" is set from v2 |  | ||||||
|         assert(newv.a == "default"); |  | ||||||
|         assert(newv.name == "default"); |  | ||||||
|         assert(newv.age == 42); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @@ -1,97 +0,0 @@ | |||||||
| // MessagePack for C++ example |  | ||||||
| // |  | ||||||
| // Copyright (C) 2008-2015 FURUHASHI Sadayuki and KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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) |  | ||||||
| // |  | ||||||
|  |  | ||||||
| #include <msgpack.hpp> |  | ||||||
| #include <string> |  | ||||||
| #include <iostream> |  | ||||||
| #include <sstream> |  | ||||||
|  |  | ||||||
| // This example uses obsolete APIs |  | ||||||
| // See protocol_new.cpp |  | ||||||
| namespace myprotocol { |  | ||||||
|     using namespace msgpack::type; |  | ||||||
|     using msgpack::define; |  | ||||||
|  |  | ||||||
|     struct Get : define< tuple<uint32_t, std::string> > { |  | ||||||
|         Get() { } |  | ||||||
|         Get(uint32_t f, const std::string& k) : |  | ||||||
|             define_type(msgpack_type(f, k)) { } |  | ||||||
|         uint32_t&    flags() { return msgpack::type::get<0>(*this); } |  | ||||||
|         std::string& key()   { return msgpack::type::get<1>(*this); } |  | ||||||
|     }; |  | ||||||
|  |  | ||||||
|     struct Put : define< tuple<uint32_t, std::string, raw_ref> > { |  | ||||||
|         Put() { } |  | ||||||
|         Put(uint32_t f, const std::string& k, const char* valref, uint32_t vallen) : |  | ||||||
|             define_type(msgpack_type( f, k, raw_ref(valref,vallen) )) { } |  | ||||||
|         uint32_t&    flags() { return msgpack::type::get<0>(*this); } |  | ||||||
|         std::string& key()   { return msgpack::type::get<1>(*this); } |  | ||||||
|         raw_ref&     value() { return msgpack::type::get<2>(*this); } |  | ||||||
|     }; |  | ||||||
|  |  | ||||||
|     struct MultiGet : define< std::vector<Get> > { |  | ||||||
|     }; |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  |  | ||||||
| int main(void) |  | ||||||
| { |  | ||||||
|     // send Get request |  | ||||||
|     std::stringstream stream; |  | ||||||
|     { |  | ||||||
|         myprotocol::Get req; |  | ||||||
|         req.flags() = 0; |  | ||||||
|         req.key()   = "key0"; |  | ||||||
|         msgpack::pack(stream, req); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     stream.seekg(0); |  | ||||||
|  |  | ||||||
|     // receive Get request |  | ||||||
|     { |  | ||||||
|         std::string buffer(stream.str()); |  | ||||||
|  |  | ||||||
|         msgpack::object_handle oh = |  | ||||||
|             msgpack::unpack(buffer.data(), buffer.size()); |  | ||||||
|         msgpack::object o = oh.get(); |  | ||||||
|  |  | ||||||
|         myprotocol::Get req; |  | ||||||
|         o.convert(req); |  | ||||||
|         std::cout << "received: " << o << std::endl; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|  |  | ||||||
|     stream.str(""); |  | ||||||
|  |  | ||||||
|  |  | ||||||
|     // send MultiGet request |  | ||||||
|     { |  | ||||||
|         myprotocol::MultiGet req; |  | ||||||
|         req.push_back( myprotocol::Get(1, "key1") ); |  | ||||||
|         req.push_back( myprotocol::Get(2, "key2") ); |  | ||||||
|         req.push_back( myprotocol::Get(3, "key3") ); |  | ||||||
|         msgpack::pack(stream, req); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     stream.seekg(0); |  | ||||||
|  |  | ||||||
|     // receive MultiGet request |  | ||||||
|     { |  | ||||||
|         std::string buffer(stream.str()); |  | ||||||
|  |  | ||||||
|         msgpack::object_handle oh = |  | ||||||
|             msgpack::unpack(buffer.data(), buffer.size()); |  | ||||||
|         msgpack::object o = oh.get(); |  | ||||||
|  |  | ||||||
|  |  | ||||||
|         myprotocol::MultiGet req; |  | ||||||
|         o.convert(req); |  | ||||||
|         std::cout << "received: " << o << std::endl; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @@ -1,84 +0,0 @@ | |||||||
| // MessagePack for C++ example |  | ||||||
| // |  | ||||||
| // Copyright (C) 2015 KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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) |  | ||||||
| // |  | ||||||
|  |  | ||||||
| #include <msgpack.hpp> |  | ||||||
| #include <string> |  | ||||||
| #include <iostream> |  | ||||||
| #include <sstream> |  | ||||||
|  |  | ||||||
| // This example uses obsolete APIs |  | ||||||
| // See protocol_new.cpp |  | ||||||
| namespace myprotocol { |  | ||||||
|     struct Get { |  | ||||||
|         Get() {} |  | ||||||
|         Get(uint32_t f, const std::string& k) : flags(f), key(k) {} |  | ||||||
|         uint32_t flags; |  | ||||||
|         std::string key; |  | ||||||
|         MSGPACK_DEFINE(flags, key); |  | ||||||
|     }; |  | ||||||
|  |  | ||||||
|     typedef std::vector<Get> MultiGet; |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  |  | ||||||
| int main(void) |  | ||||||
| { |  | ||||||
|     // send Get request |  | ||||||
|     std::stringstream stream; |  | ||||||
|     { |  | ||||||
|         myprotocol::Get req; |  | ||||||
|         req.flags = 0; |  | ||||||
|         req.key   = "key0"; |  | ||||||
|         msgpack::pack(stream, req); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     stream.seekg(0); |  | ||||||
|  |  | ||||||
|     // receive Get request |  | ||||||
|     { |  | ||||||
|         std::string buffer(stream.str()); |  | ||||||
|  |  | ||||||
|         msgpack::object_handle oh = |  | ||||||
|             msgpack::unpack(buffer.data(), buffer.size()); |  | ||||||
|         msgpack::object o = oh.get(); |  | ||||||
|  |  | ||||||
|         myprotocol::Get req; |  | ||||||
|         o.convert(req); |  | ||||||
|         std::cout << "received: " << o << std::endl; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|  |  | ||||||
|     stream.str(""); |  | ||||||
|  |  | ||||||
|  |  | ||||||
|     // send MultiGet request |  | ||||||
|     { |  | ||||||
|         myprotocol::MultiGet req; |  | ||||||
|         req.push_back( myprotocol::Get(1, "key1") ); |  | ||||||
|         req.push_back( myprotocol::Get(2, "key2") ); |  | ||||||
|         req.push_back( myprotocol::Get(3, "key3") ); |  | ||||||
|         msgpack::pack(stream, req); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     stream.seekg(0); |  | ||||||
|  |  | ||||||
|     // receive MultiGet request |  | ||||||
|     { |  | ||||||
|         std::string buffer(stream.str()); |  | ||||||
|  |  | ||||||
|         msgpack::object_handle oh = |  | ||||||
|             msgpack::unpack(buffer.data(), buffer.size()); |  | ||||||
|         msgpack::object o = oh.get(); |  | ||||||
|  |  | ||||||
|  |  | ||||||
|         myprotocol::MultiGet req; |  | ||||||
|         o.convert(req); |  | ||||||
|         std::cout << "received: " << o << std::endl; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @@ -1,43 +0,0 @@ | |||||||
| // MessagePack for C++ example |  | ||||||
| // |  | ||||||
| // Copyright (C) 2015 KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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) |  | ||||||
| // |  | ||||||
|  |  | ||||||
| #include <iostream> |  | ||||||
| #include <sstream> |  | ||||||
| #include <cassert> |  | ||||||
|  |  | ||||||
| #include <string> |  | ||||||
| #include <vector> |  | ||||||
|  |  | ||||||
| #include <msgpack.hpp> |  | ||||||
|  |  | ||||||
|  |  | ||||||
| int main() { |  | ||||||
|     std::vector<int> v; |  | ||||||
|     v.push_back(1); |  | ||||||
|     v.push_back(42); |  | ||||||
|     std::string s("ABC"); |  | ||||||
|  |  | ||||||
|     std::stringstream ss; |  | ||||||
|     msgpack::pack(ss, v); |  | ||||||
|     msgpack::pack(ss, s); |  | ||||||
|  |  | ||||||
|     msgpack::zone z; |  | ||||||
|     std::size_t offset = 0; |  | ||||||
|  |  | ||||||
|     // msgpack array is constructed on z. |  | ||||||
|     std::string const& ps = ss.str(); |  | ||||||
|     msgpack::object obj = msgpack::unpack(z, ps.data(), ps.size(), offset); |  | ||||||
|     std::cout << obj << std::endl; |  | ||||||
|     assert(obj.as<std::vector<int> >() == v); |  | ||||||
|  |  | ||||||
|     // msgpack str is constructed on z. |  | ||||||
|     std::string const& str = msgpack::unpack(z, ps.data(), ps.size(), offset).as<std::string>(); |  | ||||||
|     std::cout << str << std::endl; |  | ||||||
|     assert(str == s); |  | ||||||
| } |  | ||||||
| @@ -1,44 +0,0 @@ | |||||||
| // MessagePack for C++ example |  | ||||||
| // |  | ||||||
| // Copyright (C) 2008-2015 FURUHASHI Sadayuki and KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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) |  | ||||||
| // |  | ||||||
|  |  | ||||||
| #include <msgpack.hpp> |  | ||||||
| #include <string> |  | ||||||
| #include <iostream> |  | ||||||
| #include <sstream> |  | ||||||
|  |  | ||||||
| int main(void) |  | ||||||
| { |  | ||||||
|     msgpack::type::tuple<int, bool, std::string> src(1, true, "example"); |  | ||||||
|  |  | ||||||
|     // serialize the object into the buffer. |  | ||||||
|     // any classes that implements write(const char*,size_t) can be a buffer. |  | ||||||
|     std::stringstream buffer; |  | ||||||
|     msgpack::pack(buffer, src); |  | ||||||
|  |  | ||||||
|     // send the buffer ... |  | ||||||
|     buffer.seekg(0); |  | ||||||
|  |  | ||||||
|     // deserialize the buffer into msgpack::object instance. |  | ||||||
|     std::string str(buffer.str()); |  | ||||||
|  |  | ||||||
|     msgpack::object_handle oh = msgpack::unpack(str.data(), str.size()); |  | ||||||
|  |  | ||||||
|     // deserialized object is valid during the msgpack::object_handle instance alive. |  | ||||||
|     msgpack::object deserialized = oh.get(); |  | ||||||
|  |  | ||||||
|     // msgpack::object supports ostream. |  | ||||||
|     std::cout << deserialized << std::endl; |  | ||||||
|  |  | ||||||
|     // convert msgpack::object instance into the original type. |  | ||||||
|     // if the type is mismatched, it throws msgpack::type_error exception. |  | ||||||
|     msgpack::type::tuple<int, bool, std::string> dst; |  | ||||||
|     deserialized.convert(dst); |  | ||||||
|  |  | ||||||
|     return 0; |  | ||||||
| } |  | ||||||
| @@ -1,63 +0,0 @@ | |||||||
| // MessagePack for C++ example |  | ||||||
| // |  | ||||||
| // Copyright (C) 2013-2015 KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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) |  | ||||||
| // |  | ||||||
|  |  | ||||||
| // g++ -std=c++11 -O3 -g -Ipath_to_msgpack_src -Ipath_to_boost speed_test.cc -Lpath_to_boost_lib -lboost_timer -lboost_system |  | ||||||
| // export LD_LIBRARY_PATH=path_to_boost_lib |  | ||||||
|  |  | ||||||
| #include <msgpack.hpp> |  | ||||||
| #include <string> |  | ||||||
| #include <iostream> |  | ||||||
| #include <sstream> |  | ||||||
| #include <map> |  | ||||||
| #include <boost/timer/timer.hpp> |  | ||||||
|  |  | ||||||
| void test_map_pack_unpack() { |  | ||||||
|     std::cout << "[TEST][map_pack_unpack]" << std::endl; |  | ||||||
|     // setup |  | ||||||
|     std::cout << "Setting up map data..." << std::endl; |  | ||||||
|     std::map<int, int> m1; |  | ||||||
|     int const num = 30000000L; |  | ||||||
|     for (int i = 0; i < num; ++i) m1[i] = i; |  | ||||||
|     std::cout << "Start packing..." << std::endl; |  | ||||||
|     std::stringstream buffer; |  | ||||||
|     { |  | ||||||
|         boost::timer::cpu_timer timer; |  | ||||||
|         msgpack::pack(buffer, m1); |  | ||||||
|         std::string result = timer.format(); |  | ||||||
|         std::cout << result << std::endl; |  | ||||||
|     } |  | ||||||
|     std::cout << "Pack finished..." << std::endl; |  | ||||||
|  |  | ||||||
|     buffer.seekg(0); |  | ||||||
|     std::string str(buffer.str()); |  | ||||||
|  |  | ||||||
|     msgpack::object_handle oh; |  | ||||||
|     std::cout << "Start unpacking...by void unpack(object_handle& oh, const char* data, size_t len)" << std::endl; |  | ||||||
|     { |  | ||||||
|         boost::timer::cpu_timer timer; |  | ||||||
|         msgpack::unpack(oh, str.data(), str.size()); |  | ||||||
|         std::string result = timer.format(); |  | ||||||
|         std::cout << result << std::endl; |  | ||||||
|     } |  | ||||||
|     std::cout << "Unpack finished..." << std::endl; |  | ||||||
|     std::map<int, int> m2; |  | ||||||
|     std::cout << "Start converting..." << std::endl; |  | ||||||
|     { |  | ||||||
|         boost::timer::cpu_timer timer; |  | ||||||
|         oh.get().convert(m2); |  | ||||||
|         std::string result = timer.format(); |  | ||||||
|         std::cout << result << std::endl; |  | ||||||
|     } |  | ||||||
|     std::cout << "Convert finished..." << std::endl; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| int main(void) |  | ||||||
| { |  | ||||||
|     test_map_pack_unpack(); |  | ||||||
| } |  | ||||||
| @@ -1,86 +0,0 @@ | |||||||
| // MessagePack for C++ example |  | ||||||
| // |  | ||||||
| // Copyright (C) 2013-2015 KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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) |  | ||||||
| // |  | ||||||
|  |  | ||||||
| // g++ -std=c++11 -O3 -g -Ipath_to_msgpack_src -Ipath_to_boost speed_test.cc -Lpath_to_boost_lib -lboost_timer -lboost_system |  | ||||||
| // export LD_LIBRARY_PATH=path_to_boost_lib |  | ||||||
|  |  | ||||||
| #include <msgpack.hpp> |  | ||||||
| #include <string> |  | ||||||
| #include <iostream> |  | ||||||
| #include <sstream> |  | ||||||
| #include <vector> |  | ||||||
| #include <boost/timer/timer.hpp> |  | ||||||
|  |  | ||||||
| template <typename T, std::size_t level> |  | ||||||
| struct vecvec { |  | ||||||
|     typedef std::vector<typename vecvec<T, level - 1>::type> type; |  | ||||||
|     static void fill(type& v, std::size_t num_of_elems, T const& val) { |  | ||||||
|         for (std::size_t elem = 0; elem < num_of_elems; ++elem) { |  | ||||||
|             typename vecvec<T, level - 1>::type child; |  | ||||||
|             vecvec<T, level - 1>::fill(child, num_of_elems, val); |  | ||||||
|             v.push_back(child); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| template <typename T> |  | ||||||
| struct vecvec<T, 0> { |  | ||||||
|     typedef std::vector<T> type; |  | ||||||
|     static void fill(type& v, std::size_t num_of_elems, T const& val) { |  | ||||||
|         for (std::size_t elem = 0; elem < num_of_elems; ++elem) { |  | ||||||
|             v.push_back(val); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| void test_array_of_array() { |  | ||||||
|     std::cout << "[TEST][array_of_array]" << std::endl; |  | ||||||
|     // setup |  | ||||||
|     int const depth = 4; |  | ||||||
|     std::cout << "Setting up array data..." << std::endl; |  | ||||||
|     vecvec<int, depth>::type v1; |  | ||||||
|     vecvec<int, depth>::fill(v1, 3, 42); |  | ||||||
|  |  | ||||||
|     std::cout << "Start packing..." << std::endl; |  | ||||||
|     std::stringstream buffer; |  | ||||||
|     { |  | ||||||
|         boost::timer::cpu_timer timer; |  | ||||||
|         msgpack::pack(buffer, v1); |  | ||||||
|         std::string result = timer.format(); |  | ||||||
|         std::cout << result << std::endl; |  | ||||||
|     } |  | ||||||
|     std::cout << "Pack finished..." << std::endl; |  | ||||||
|  |  | ||||||
|     buffer.seekg(0); |  | ||||||
|     std::string str(buffer.str()); |  | ||||||
|  |  | ||||||
|     msgpack::object_handle oh; |  | ||||||
|     std::cout << "Start unpacking...by void unpack(object_handle& oh, const char* data, size_t len)" << std::endl; |  | ||||||
|     { |  | ||||||
|         boost::timer::cpu_timer timer; |  | ||||||
|         msgpack::unpack(oh, str.data(), str.size()); |  | ||||||
|         std::string result = timer.format(); |  | ||||||
|         std::cout << result << std::endl; |  | ||||||
|     } |  | ||||||
|     std::cout << "Unpack finished..." << std::endl; |  | ||||||
|     vecvec<int, depth>::type v2; |  | ||||||
|     std::cout << "Start converting..." << std::endl; |  | ||||||
|     { |  | ||||||
|         boost::timer::cpu_timer timer; |  | ||||||
|         oh.get().convert(v2); |  | ||||||
|         std::string result = timer.format(); |  | ||||||
|         std::cout << result << std::endl; |  | ||||||
|     } |  | ||||||
|     std::cout << "Convert finished..." << std::endl; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| int main(void) |  | ||||||
| { |  | ||||||
|     test_array_of_array(); |  | ||||||
| } |  | ||||||
| @@ -1,148 +0,0 @@ | |||||||
| // MessagePack for C++ example |  | ||||||
| // |  | ||||||
| // Copyright (C) 2008-2015 FURUHASHI Sadayuki and KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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) |  | ||||||
| // |  | ||||||
|  |  | ||||||
| #include <msgpack.hpp> |  | ||||||
| #include <iostream> |  | ||||||
| #include <stdexcept> |  | ||||||
| #include <stdio.h> |  | ||||||
| #include <string.h> |  | ||||||
| #include <unistd.h> |  | ||||||
| #include <errno.h> |  | ||||||
| #include <pthread.h> |  | ||||||
|  |  | ||||||
| #if defined(_MSC_VER) || defined(__MINGW32__) |  | ||||||
| #include <io.h> |  | ||||||
| #include <fcntl.h> |  | ||||||
| #define pipe(fds) _pipe(fds, 4096, _O_BINARY) |  | ||||||
| #endif // _MSC_VER || __MINGW32__ |  | ||||||
|  |  | ||||||
| class Server { |  | ||||||
| public: |  | ||||||
|     Server(int sock) : m_sock(sock) { } |  | ||||||
|  |  | ||||||
|     ~Server() { } |  | ||||||
|  |  | ||||||
|     typedef msgpack::unique_ptr<msgpack::zone> unique_zone; |  | ||||||
|  |  | ||||||
|     void socket_readable() |  | ||||||
|     { |  | ||||||
|         m_pac.reserve_buffer(1024); |  | ||||||
|  |  | ||||||
|         ssize_t count = |  | ||||||
|             read(m_sock, m_pac.buffer(), m_pac.buffer_capacity()); |  | ||||||
|  |  | ||||||
|         if(count <= 0) { |  | ||||||
|             if(count == 0) { |  | ||||||
|                 throw std::runtime_error("connection closed"); |  | ||||||
|             } |  | ||||||
|             if(errno == EAGAIN || errno == EINTR) { |  | ||||||
|                 return; |  | ||||||
|             } |  | ||||||
|             throw std::runtime_error(strerror(errno)); |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         m_pac.buffer_consumed(count); |  | ||||||
|  |  | ||||||
|         msgpack::object_handle oh; |  | ||||||
|         while (m_pac.next(oh)) { |  | ||||||
|             msgpack::object msg = oh.get(); |  | ||||||
|             unique_zone& life = oh.zone(); |  | ||||||
|             process_message(msg, life); |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         if(m_pac.message_size() > 10*1024*1024) { |  | ||||||
|             throw std::runtime_error("message is too large"); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
| private: |  | ||||||
|     void process_message(msgpack::object msg, unique_zone&) |  | ||||||
|     { |  | ||||||
|         std::cout << "message reached: " << msg << std::endl; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
| private: |  | ||||||
|     int m_sock; |  | ||||||
|     msgpack::unpacker m_pac; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
|  |  | ||||||
| static void* run_server(void* arg) |  | ||||||
| { |  | ||||||
|     try { |  | ||||||
|         Server* srv = reinterpret_cast<Server*>(arg); |  | ||||||
|  |  | ||||||
|         while(true) { |  | ||||||
|             srv->socket_readable(); |  | ||||||
|         } |  | ||||||
|         return NULL; |  | ||||||
|  |  | ||||||
|     } catch (std::exception& e) { |  | ||||||
|         std::cerr << "error while processing client packet: " |  | ||||||
|                   << e.what() << std::endl; |  | ||||||
|         return NULL; |  | ||||||
|  |  | ||||||
|     } catch (...) { |  | ||||||
|         std::cerr << "error while processing client packet: " |  | ||||||
|                   << "unknown error" << std::endl; |  | ||||||
|         return NULL; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| struct fwriter { |  | ||||||
|     fwriter(int fd) : m_fp( fdopen(fd, "w") ) { } |  | ||||||
|  |  | ||||||
|     void write(const char* buf, size_t buflen) |  | ||||||
|     { |  | ||||||
|         size_t count = fwrite(buf, buflen, 1, m_fp); |  | ||||||
|         if(count < 1) { |  | ||||||
|             std::cout << buflen << std::endl; |  | ||||||
|             std::cout << count << std::endl; |  | ||||||
|             throw std::runtime_error(strerror(errno)); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     void flush() { fflush(m_fp); } |  | ||||||
|  |  | ||||||
|     void close() { fclose(m_fp); } |  | ||||||
|  |  | ||||||
| private: |  | ||||||
|     FILE* m_fp; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
|  |  | ||||||
| int main(void) |  | ||||||
| { |  | ||||||
|     int pair[2]; |  | ||||||
|     if (pipe(pair) != 0) return -1; |  | ||||||
|  |  | ||||||
|     // run server thread |  | ||||||
|     Server srv(pair[0]); |  | ||||||
|     pthread_t thread; |  | ||||||
|     pthread_create(&thread, NULL, |  | ||||||
|             run_server, reinterpret_cast<void*>(&srv)); |  | ||||||
|  |  | ||||||
|     // client thread: |  | ||||||
|     fwriter writer(pair[1]); |  | ||||||
|     msgpack::packer<fwriter> pk(writer); |  | ||||||
|  |  | ||||||
|     typedef msgpack::type::tuple<std::string, std::string, std::string> put_t; |  | ||||||
|     typedef msgpack::type::tuple<std::string, std::string> get_t; |  | ||||||
|  |  | ||||||
|     put_t req1("put", "apple", "red"); |  | ||||||
|     put_t req2("put", "lemon", "yellow"); |  | ||||||
|     get_t req3("get", "apple"); |  | ||||||
|     pk.pack(req1); |  | ||||||
|     pk.pack(req2); |  | ||||||
|     pk.pack(req3); |  | ||||||
|     writer.flush(); |  | ||||||
|     writer.close(); |  | ||||||
|  |  | ||||||
|     pthread_join(thread, NULL); |  | ||||||
| } |  | ||||||
| @@ -1,38 +0,0 @@ | |||||||
| IF (MSGPACK_CXX11 OR MSGPACK_CXX14 OR MSGPACK_CXX17) |  | ||||||
|     LIST (APPEND exec_PROGRAMS |  | ||||||
|         container.cpp |  | ||||||
|         non_def_con_class.cpp |  | ||||||
|     ) |  | ||||||
|  |  | ||||||
|     IF ("${MSGPACK_DEFAULT_API_VERSION}" GREATER "1") |  | ||||||
|         LIST (APPEND exec_PROGRAMS |  | ||||||
|             socket_stream_example.cpp |  | ||||||
|         ) |  | ||||||
|     ENDIF () |  | ||||||
|  |  | ||||||
|     FOREACH (source_file ${exec_PROGRAMS}) |  | ||||||
|         GET_FILENAME_COMPONENT (source_file_we ${source_file} NAME_WE) |  | ||||||
|         ADD_EXECUTABLE ( |  | ||||||
|             ${source_file_we} |  | ||||||
|             ${source_file} |  | ||||||
|         ) |  | ||||||
|         TARGET_LINK_LIBRARIES (${source_file_we} PRIVATE |  | ||||||
|             msgpackc-cxx |  | ||||||
|         ) |  | ||||||
|         IF ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") |  | ||||||
|             SET_PROPERTY (TARGET ${source_file_we} APPEND_STRING PROPERTY COMPILE_FLAGS " -Wall -Wextra") |  | ||||||
|         ENDIF () |  | ||||||
|  |  | ||||||
|         IF ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") |  | ||||||
|             SET_PROPERTY (TARGET ${source_file_we} APPEND_STRING PROPERTY COMPILE_FLAGS " -Wno-mismatched-tags") |  | ||||||
|         ENDIF () |  | ||||||
|  |  | ||||||
|         IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") |  | ||||||
|             IF (CMAKE_CXX_FLAGS MATCHES "/W[0-4]") |  | ||||||
|                 STRING(REGEX REPLACE "/W[0-4]" "/W3 /WX" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") |  | ||||||
|             ELSE () |  | ||||||
|                 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3 /WX") |  | ||||||
|             ENDIF () |  | ||||||
|         ENDIF () |  | ||||||
|     ENDFOREACH () |  | ||||||
| ENDIF () |  | ||||||
| @@ -1,159 +0,0 @@ | |||||||
| // MessagePack for C++ example |  | ||||||
| // |  | ||||||
| // Copyright (C) 2015 KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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) |  | ||||||
| // |  | ||||||
|  |  | ||||||
| #include <iostream> |  | ||||||
| #include <sstream> |  | ||||||
| #include <cassert> |  | ||||||
|  |  | ||||||
| #include <array> |  | ||||||
| #include <tuple> |  | ||||||
| #include <unordered_map> |  | ||||||
| #include <unordered_set> |  | ||||||
| #include <forward_list> |  | ||||||
| #include <string> |  | ||||||
|  |  | ||||||
| #include <msgpack.hpp> |  | ||||||
|  |  | ||||||
| void array() { |  | ||||||
|     std::array<int, 5> a { { 1, 2, 3, 4, 5 } }; |  | ||||||
|     std::stringstream ss; |  | ||||||
|     msgpack::pack(ss, a); |  | ||||||
|  |  | ||||||
|     auto const& str = ss.str(); |  | ||||||
|     auto oh = msgpack::unpack(str.data(), str.size()); |  | ||||||
|     auto obj = oh.get(); |  | ||||||
|  |  | ||||||
|     std::cout << obj << std::endl; |  | ||||||
|     assert((obj.as<std::array<int, 5>>()) == a); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void tuple() { |  | ||||||
|     std::tuple<bool, std::string, int> t(true, "ABC", 42); |  | ||||||
|     std::stringstream ss; |  | ||||||
|     msgpack::pack(ss, t); |  | ||||||
|  |  | ||||||
|     auto const& str = ss.str(); |  | ||||||
|     auto oh = msgpack::unpack(str.data(), str.size()); |  | ||||||
|     auto obj = oh.get(); |  | ||||||
|  |  | ||||||
|     std::cout << obj << std::endl; |  | ||||||
|     assert(obj.as<decltype(t)>() == t); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void unordered_map() { |  | ||||||
|     std::unordered_map<std::string, int> m { {"ABC", 1}, {"DEF", 3} }; |  | ||||||
|     std::stringstream ss; |  | ||||||
|     msgpack::pack(ss, m); |  | ||||||
|  |  | ||||||
|     auto const& str = ss.str(); |  | ||||||
|     auto oh = msgpack::unpack(str.data(), str.size()); |  | ||||||
|     msgpack::object obj = oh.get(); |  | ||||||
|  |  | ||||||
|     std::cout << obj << std::endl; |  | ||||||
|     assert(obj.as<decltype(m)>() == m); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void unordered_set() { |  | ||||||
|     std::unordered_set<std::string> s { "ABC", "DEF" }; |  | ||||||
|     std::stringstream ss; |  | ||||||
|     msgpack::pack(ss, s); |  | ||||||
|  |  | ||||||
|     auto const& str = ss.str(); |  | ||||||
|     auto oh = msgpack::unpack(str.data(), str.size()); |  | ||||||
|     auto obj = oh.get(); |  | ||||||
|  |  | ||||||
|     std::cout << obj << std::endl; |  | ||||||
|     assert(obj.as<decltype(s)>() == s); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void forward_list() { |  | ||||||
|     using type = std::forward_list<std::string>; |  | ||||||
|     type f { "ABC", "DEF" }; |  | ||||||
|     std::stringstream ss; |  | ||||||
|     msgpack::pack(ss, f); |  | ||||||
|  |  | ||||||
|     auto const& str = ss.str(); |  | ||||||
|     auto oh = msgpack::unpack(str.data(), str.size()); |  | ||||||
|     auto obj = oh.get(); |  | ||||||
|  |  | ||||||
|     std::cout << obj << std::endl; |  | ||||||
|     assert(obj.as<type>() == f); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void combi() { |  | ||||||
|     std::array<int, 5>                   a { { 1, 2, 3, 4, 5 } }; |  | ||||||
|     std::tuple<bool, std::string, int>   t {true, "ABC", 42}; |  | ||||||
|     std::unordered_map<std::string, int> m { {"ABC", 1}, {"DEF", 3} }; |  | ||||||
|     std::unordered_set<std::string>      s { "ABC", "DEF" }; |  | ||||||
|     std::forward_list<std::string>       f { "ABC", "DEF" }; |  | ||||||
|  |  | ||||||
|     std::stringstream ss; |  | ||||||
|     msgpack::pack(ss, a); |  | ||||||
|     msgpack::pack(ss, t); |  | ||||||
|     msgpack::pack(ss, m); |  | ||||||
|     msgpack::pack(ss, s); |  | ||||||
|     msgpack::pack(ss, f); |  | ||||||
|  |  | ||||||
|     std::size_t offset = 0; |  | ||||||
|     std::cout << "offset: " << offset << std::endl; |  | ||||||
|     { |  | ||||||
|         auto const& str = ss.str(); |  | ||||||
|         auto oh = msgpack::unpack(str.data(), str.size(), offset); |  | ||||||
|         auto obj = oh.get(); |  | ||||||
|  |  | ||||||
|         std::cout << obj << std::endl; |  | ||||||
|         assert(obj.as<decltype(a)>() == a); |  | ||||||
|     } |  | ||||||
|     std::cout << "offset: " << offset << std::endl; |  | ||||||
|     { |  | ||||||
|         auto const& str = ss.str(); |  | ||||||
|         auto oh = msgpack::unpack(str.data(), str.size(), offset); |  | ||||||
|         auto obj = oh.get(); |  | ||||||
|  |  | ||||||
|         std::cout << obj << std::endl; |  | ||||||
|         assert(obj.as<decltype(t)>() == t); |  | ||||||
|     } |  | ||||||
|     std::cout << "offset: " << offset << std::endl; |  | ||||||
|     { |  | ||||||
|         auto const& str = ss.str(); |  | ||||||
|         auto oh = msgpack::unpack(str.data(), str.size(), offset); |  | ||||||
|         auto obj = oh.get(); |  | ||||||
|  |  | ||||||
|         std::cout << obj << std::endl; |  | ||||||
|         assert(obj.as<decltype(m)>() == m); |  | ||||||
|     } |  | ||||||
|     std::cout << "offset: " << offset << std::endl; |  | ||||||
|     { |  | ||||||
|         auto const& str = ss.str(); |  | ||||||
|         auto oh = msgpack::unpack(str.data(), str.size(), offset); |  | ||||||
|         auto obj = oh.get(); |  | ||||||
|  |  | ||||||
|         std::cout << obj << std::endl; |  | ||||||
|         assert(obj.as<decltype(s)>() == s); |  | ||||||
|     } |  | ||||||
|     std::cout << "offset: " << offset << std::endl; |  | ||||||
|     { |  | ||||||
|         auto const& str = ss.str(); |  | ||||||
|         auto oh = msgpack::unpack(str.data(), str.size(), offset); |  | ||||||
|         auto obj = oh.get(); |  | ||||||
|  |  | ||||||
|         std::cout << obj << std::endl; |  | ||||||
|         assert(obj.as<decltype(f)>() == f); |  | ||||||
|     } |  | ||||||
|     std::cout << "offset: " << offset << std::endl; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| int main() { |  | ||||||
|     array(); |  | ||||||
|     tuple(); |  | ||||||
|     unordered_map(); |  | ||||||
|     unordered_set(); |  | ||||||
|     forward_list(); |  | ||||||
|     combi(); |  | ||||||
| } |  | ||||||
| @@ -1,51 +0,0 @@ | |||||||
| // MessagePack for C++ example |  | ||||||
| // |  | ||||||
| // Copyright (C) 2015 KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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) |  | ||||||
| // |  | ||||||
|  |  | ||||||
| #include <cassert> |  | ||||||
| #include <memory> |  | ||||||
| #include <iostream> |  | ||||||
|  |  | ||||||
| #include <msgpack.hpp> |  | ||||||
|  |  | ||||||
| struct my { |  | ||||||
|     my() = delete; |  | ||||||
|  |  | ||||||
|     // target class should be either copyable or movable (or both). |  | ||||||
|     my(my const&) = delete; |  | ||||||
|     my(my&&) = default; |  | ||||||
|  |  | ||||||
|     my(int a):a(a) {} |  | ||||||
|     int a; |  | ||||||
|     MSGPACK_DEFINE(a); |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| namespace msgpack { |  | ||||||
| MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS) { |  | ||||||
| namespace adaptor { |  | ||||||
|  |  | ||||||
| template<> |  | ||||||
| struct as<my> { |  | ||||||
|     my 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 my(o.via.array.ptr[0].as<int>()); |  | ||||||
|     } |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| } // namespace adaptor |  | ||||||
| } // MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS) |  | ||||||
| } // namespace msgpack |  | ||||||
|  |  | ||||||
| int main() { |  | ||||||
|     my m1(42); |  | ||||||
|     msgpack::zone z; |  | ||||||
|     msgpack::object obj(m1, z); |  | ||||||
|     std::cout << obj << std::endl; |  | ||||||
|     assert(m1.a == obj.as<my>().a); |  | ||||||
| } |  | ||||||
| @@ -1,157 +0,0 @@ | |||||||
| #include <iostream> |  | ||||||
| #include <sstream> |  | ||||||
| #include <msgpack.hpp> |  | ||||||
|  |  | ||||||
| struct json_like_visitor : msgpack::v2::null_visitor { |  | ||||||
|     json_like_visitor(std::string& s):m_s(s), m_ref(false) {} // m_ref is false by default |  | ||||||
|  |  | ||||||
|     bool visit_nil() { |  | ||||||
|         m_s += "null"; |  | ||||||
|         return true; |  | ||||||
|     } |  | ||||||
|     bool visit_boolean(bool v) { |  | ||||||
|         if (v) m_s += "true"; |  | ||||||
|         else m_s += "false"; |  | ||||||
|         return true; |  | ||||||
|     } |  | ||||||
|     bool visit_positive_integer(uint64_t v) { |  | ||||||
|         std::stringstream ss; |  | ||||||
|         ss << v; |  | ||||||
|         m_s += ss.str(); |  | ||||||
|         return true; |  | ||||||
|     } |  | ||||||
|     bool visit_negative_integer(int64_t v) { |  | ||||||
|         std::stringstream ss; |  | ||||||
|         ss << v; |  | ||||||
|         m_s += ss.str(); |  | ||||||
|         return true; |  | ||||||
|     } |  | ||||||
|     bool visit_str(const char* v, uint32_t size) { |  | ||||||
|         // I omit escape process. |  | ||||||
|         m_s += '"' + std::string(v, size) + '"'; |  | ||||||
|         return true; |  | ||||||
|     } |  | ||||||
|     bool start_array(uint32_t /*num_elements*/) { |  | ||||||
|         m_s += "["; |  | ||||||
|         return true; |  | ||||||
|     } |  | ||||||
|     bool end_array_item() { |  | ||||||
|         m_s += ","; |  | ||||||
|         return true; |  | ||||||
|     } |  | ||||||
|     bool end_array() { |  | ||||||
|         m_s.erase(m_s.size() - 1, 1); // remove the last ',' |  | ||||||
|         m_s += "]"; |  | ||||||
|         return true; |  | ||||||
|     } |  | ||||||
|     bool start_map(uint32_t /*num_kv_pairs*/) { |  | ||||||
|         m_s += "{"; |  | ||||||
|         return true; |  | ||||||
|     } |  | ||||||
|     bool end_map_key() { |  | ||||||
|         m_s += ":"; |  | ||||||
|         return true; |  | ||||||
|     } |  | ||||||
|     bool end_map_value() { |  | ||||||
|         m_s += ","; |  | ||||||
|         return true; |  | ||||||
|     } |  | ||||||
|     bool end_map() { |  | ||||||
|         m_s.erase(m_s.size() - 1, 1); // remove the last ',' |  | ||||||
|         m_s += "}"; |  | ||||||
|         return true; |  | ||||||
|     } |  | ||||||
|     void parse_error(size_t /*parsed_offset*/, size_t /*error_offset*/) { |  | ||||||
|         std::cerr << "parse error"<<std::endl; |  | ||||||
|     } |  | ||||||
|     void insufficient_bytes(size_t /*parsed_offset*/, size_t /*error_offset*/) { |  | ||||||
|         std::cout << "insufficient bytes"<<std::endl; |  | ||||||
|     } |  | ||||||
|     std::string& m_s; |  | ||||||
|  |  | ||||||
|     // These two functions are required by parser. |  | ||||||
|     void set_referenced(bool ref) { m_ref = ref; } |  | ||||||
|     bool referenced() const { return m_ref; } |  | ||||||
|     bool m_ref; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| struct do_nothing { |  | ||||||
|     void operator()(char* /*buffer*/) { |  | ||||||
|     } |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| class json_like_printer : public msgpack::parser<json_like_printer, do_nothing>, |  | ||||||
|                           public json_like_visitor { |  | ||||||
|     typedef parser<json_like_printer, do_nothing> parser_t; |  | ||||||
| public: |  | ||||||
|     json_like_printer(std::size_t initial_buffer_size = MSGPACK_UNPACKER_INIT_BUFFER_SIZE) |  | ||||||
|         :parser_t(do_nothing_, initial_buffer_size), |  | ||||||
|          json_like_visitor(json_str_) { |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     json_like_visitor& visitor() { return *this; } |  | ||||||
|     void print() { std::cout << json_str_ << std::endl; json_str_.clear();} |  | ||||||
| private: |  | ||||||
|     do_nothing do_nothing_; |  | ||||||
|     std::string json_str_; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| template <typename T> |  | ||||||
| struct ref_buffer { |  | ||||||
|     ref_buffer(T& t):t(t) {} |  | ||||||
|     void write(char const* ptr, std::size_t len) { |  | ||||||
|         if (len > t.buffer_capacity()) { |  | ||||||
|             t.reserve_buffer(len - t.buffer_capacity()); |  | ||||||
|         } |  | ||||||
|         std::memcpy(t.buffer(), ptr, len); |  | ||||||
|         t.buffer_consumed(len); |  | ||||||
|     } |  | ||||||
|     T& t; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| #define BUFFERING_SIZE_MAX 100 |  | ||||||
|  |  | ||||||
| //simulates streamed content (a socket for example) |  | ||||||
| bool produce( std::stringstream & ss, char* buff, std::size_t& size) |  | ||||||
| { |  | ||||||
|     ss.read(buff, BUFFERING_SIZE_MAX); |  | ||||||
|     size = static_cast<std::size_t>(ss.gcount()); |  | ||||||
|     return (size > 0); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| //shows how you can treat data  |  | ||||||
| void consume( const char* buff, const std::size_t size,  |  | ||||||
|     ref_buffer<json_like_printer> & rb, |  | ||||||
|     json_like_printer & jp |  | ||||||
|     ) |  | ||||||
| { |  | ||||||
|     rb.write(buff,size); |  | ||||||
|     while( jp.next() ) |  | ||||||
|     { |  | ||||||
|         //here we print the data, you could do any wanted processing |  | ||||||
|         jp.print(); |  | ||||||
|     }   |  | ||||||
| } |  | ||||||
|  |  | ||||||
| int main() { |  | ||||||
|  |  | ||||||
|     std::vector<std::vector<int>> vvi1 { { 1,2,3,4,5}, { 6,7,8,9,10} };  |  | ||||||
|     std::vector<std::vector<int>> vvi2 { { 11,12,13,14,15}, { 16,17,18,19,20} }; |  | ||||||
|  |  | ||||||
|     std::stringstream ss; |  | ||||||
|      |  | ||||||
|     msgpack::pack(ss, vvi1); |  | ||||||
|     msgpack::pack(ss, vvi2); |  | ||||||
|  |  | ||||||
|     char buffer[BUFFERING_SIZE_MAX]; |  | ||||||
|     std::size_t size = 0; |  | ||||||
|  |  | ||||||
|     json_like_printer jp(1); // set initial buffer size explicitly |  | ||||||
|     ref_buffer<json_like_printer> rb(jp); |  | ||||||
|  |  | ||||||
|     while( produce(ss,buffer,size) ) |  | ||||||
|     { |  | ||||||
|         consume(buffer, size, rb, jp); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
| } |  | ||||||
							
								
								
									
										419
									
								
								example/jsonconv.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										419
									
								
								example/jsonconv.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,419 @@ | |||||||
|  | #include <stdio.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  | #include <string.h> | ||||||
|  | #include <math.h> | ||||||
|  | #include <msgpack.h> | ||||||
|  | #include <cjson/cJSON.h> | ||||||
|  |  | ||||||
|  | #if defined(_MSC_VER) | ||||||
|  | #if _MSC_VER >= 1800 | ||||||
|  | #include <inttypes.h> | ||||||
|  | #else | ||||||
|  | #define PRIu64 "I64u" | ||||||
|  | #define PRIi64 "I64i" | ||||||
|  | #define PRIi8 "i" | ||||||
|  | #endif | ||||||
|  | #else | ||||||
|  | #include <inttypes.h> | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if defined(_KERNEL_MODE) | ||||||
|  | #  undef  snprintf | ||||||
|  | #  define snprintf _snprintf | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #define DEBUG(...) printf(__VA_ARGS__) | ||||||
|  |  | ||||||
|  | static char *format_string(const char *input) | ||||||
|  | { | ||||||
|  |     const char *inptr; | ||||||
|  |     char *output; | ||||||
|  |     char *outptr; | ||||||
|  |     size_t output_length = 0; | ||||||
|  |     /* numbers of additional characters*/ | ||||||
|  |     size_t escape_characters = 0; | ||||||
|  |  | ||||||
|  |     if (input == NULL) { | ||||||
|  |         return NULL; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     for (inptr = input; *inptr; inptr++) { | ||||||
|  |         switch (*inptr) { | ||||||
|  |         case '\"': | ||||||
|  |         case '\\': | ||||||
|  |         case '\b': | ||||||
|  |         case '\f': | ||||||
|  |         case '\n': | ||||||
|  |         case '\r': | ||||||
|  |         case '\t': | ||||||
|  |             /* one character escape sequence */ | ||||||
|  |             escape_characters++; | ||||||
|  |             break; | ||||||
|  |         default: | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     output_length = (size_t)(inptr - input) + escape_characters; | ||||||
|  |  | ||||||
|  |     output = (char *)malloc(output_length + 1); | ||||||
|  |     if (output == NULL) { | ||||||
|  |         return NULL; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /* no add characters*/ | ||||||
|  |     if (escape_characters == 0) { | ||||||
|  |         memcpy(output, input, output_length); | ||||||
|  |         output[output_length] = '\0'; | ||||||
|  |         return output; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     outptr = output; | ||||||
|  |     /* copy string */ | ||||||
|  |     for (inptr = input; *inptr != '\0'; (void)inptr++, outptr++) { | ||||||
|  |         if ((*inptr > 31) && (*inptr != '\"') && (*inptr != '\\')) { | ||||||
|  |             /* normal character, copy */ | ||||||
|  |             *outptr = *inptr; | ||||||
|  |         } else { | ||||||
|  |             /* character needs to be escaped */ | ||||||
|  |             *outptr++ = '\\'; | ||||||
|  |             switch (*inptr) | ||||||
|  |             { | ||||||
|  |             case '\\': | ||||||
|  |                 *outptr = '\\'; | ||||||
|  |                 break; | ||||||
|  |             case '\"': | ||||||
|  |                 *outptr = '\"'; | ||||||
|  |                 break; | ||||||
|  |             case '\b': | ||||||
|  |                 *outptr = 'b'; | ||||||
|  |                 break; | ||||||
|  |             case '\f': | ||||||
|  |                 *outptr = 'f'; | ||||||
|  |                 break; | ||||||
|  |             case '\n': | ||||||
|  |                 *outptr = 'n'; | ||||||
|  |                 break; | ||||||
|  |             case '\r': | ||||||
|  |                 *outptr = 'r'; | ||||||
|  |                 break; | ||||||
|  |             case '\t': | ||||||
|  |                 *outptr = 't'; | ||||||
|  |                 break; | ||||||
|  |             default: | ||||||
|  |                 break; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     output[output_length] = '\0'; | ||||||
|  |     return output; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * Pack cJSON object. | ||||||
|  |  * return 0 success, others failed | ||||||
|  |  */ | ||||||
|  | static int parse_cjson_object(msgpack_packer *pk, cJSON *node) | ||||||
|  | { | ||||||
|  |     int ret, sz, i; | ||||||
|  |     cJSON *child; | ||||||
|  |     char *strvalue; | ||||||
|  |  | ||||||
|  |     if (node == NULL) { | ||||||
|  |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     switch (node->type & 0xFF) { | ||||||
|  |     case cJSON_Invalid: | ||||||
|  |         return -1; | ||||||
|  |  | ||||||
|  |     case cJSON_False: | ||||||
|  |         return msgpack_pack_false(pk); | ||||||
|  |  | ||||||
|  |     case cJSON_True: | ||||||
|  |         return msgpack_pack_true(pk); | ||||||
|  |  | ||||||
|  |     case cJSON_NULL: | ||||||
|  |         return msgpack_pack_nil(pk); | ||||||
|  |  | ||||||
|  |     case cJSON_String: | ||||||
|  |         strvalue = format_string(node->valuestring); | ||||||
|  |         if (strvalue != NULL) { | ||||||
|  |             ret = msgpack_pack_str_with_body(pk, strvalue, strlen(strvalue)); | ||||||
|  |             free(strvalue); | ||||||
|  |             return ret; | ||||||
|  |         } else { | ||||||
|  |             return -1; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |     case cJSON_Number: | ||||||
|  |         if (isnan(node->valuedouble) || isinf(node->valuedouble)) { | ||||||
|  |             ret = msgpack_pack_nil(pk); | ||||||
|  |         } else if (node->valuedouble == node->valueint) { | ||||||
|  |             ret = msgpack_pack_int(pk, node->valueint); | ||||||
|  |         } else { | ||||||
|  |             ret = msgpack_pack_double(pk, node->valuedouble); | ||||||
|  |         } | ||||||
|  |         return ret; | ||||||
|  |  | ||||||
|  |     case cJSON_Array: | ||||||
|  |         sz = cJSON_GetArraySize(node); | ||||||
|  |         if (msgpack_pack_array(pk, sz) != 0) { | ||||||
|  |             return -1; | ||||||
|  |         } | ||||||
|  |         for (i = 0; i < sz; i++) { | ||||||
|  |             if (parse_cjson_object(pk, cJSON_GetArrayItem(node, i)) != 0) { | ||||||
|  |                 return -1; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         return 0; | ||||||
|  |  | ||||||
|  |     case cJSON_Object: | ||||||
|  |         sz = cJSON_GetArraySize(node); | ||||||
|  |         if (msgpack_pack_map(pk, sz) != 0) { | ||||||
|  |             return -1; | ||||||
|  |         } | ||||||
|  |         for (i = 0; i < sz; i++) { | ||||||
|  |             child = cJSON_GetArrayItem(node, i); | ||||||
|  |             strvalue = format_string(child->string); | ||||||
|  |             if (strvalue == NULL) { | ||||||
|  |                 return -1; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             if (msgpack_pack_str_with_body(pk, strvalue, strlen(strvalue)) != 0) { | ||||||
|  |                 free(strvalue); | ||||||
|  |                 return -1; | ||||||
|  |             } | ||||||
|  |             free(strvalue); | ||||||
|  |             if (parse_cjson_object(pk, child) != 0) { | ||||||
|  |                 return -1; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         return 0; | ||||||
|  |  | ||||||
|  |     default: | ||||||
|  |         DEBUG("unknown type.\n"); | ||||||
|  |         return -1; | ||||||
|  |     } | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * Pack json string to msgpack format data. | ||||||
|  |  * return 0 success, -1 failed | ||||||
|  |  */ | ||||||
|  | int msgpack_pack_jsonstr(msgpack_packer *pk, const char *jsonstr) | ||||||
|  | { | ||||||
|  |     int status; | ||||||
|  |     cJSON *node; | ||||||
|  |     const char *end = NULL; | ||||||
|  |  | ||||||
|  |     if (pk == NULL || jsonstr == NULL) { | ||||||
|  |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     node = cJSON_ParseWithOpts(jsonstr, &end, 1); | ||||||
|  |     if (node == NULL) { | ||||||
|  |         DEBUG("parse error: unexpected string `%s`\n", end); | ||||||
|  |         return -1; | ||||||
|  |     } | ||||||
|  |     status = parse_cjson_object(pk, node); | ||||||
|  |     cJSON_Delete(node); | ||||||
|  |  | ||||||
|  |     return status; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static int bytes_contain_zero(const msgpack_object_bin *bin) | ||||||
|  | { | ||||||
|  |     size_t i; | ||||||
|  |     for (i = 0; i < bin->size; i++) { | ||||||
|  |         if (bin->ptr[i] == 0) { | ||||||
|  |             return 1; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #define PRINT_JSONSTR_CALL(ret, func, aux_buffer, aux_buffer_size, ...) \ | ||||||
|  |     ret = func(aux_buffer, aux_buffer_size, __VA_ARGS__);               \ | ||||||
|  |     if (ret <= 0)                                                       \ | ||||||
|  |         return ret;                                                     \ | ||||||
|  |     if (ret > aux_buffer_size)                                          \ | ||||||
|  |         return 0;                                                       \ | ||||||
|  |     aux_buffer = aux_buffer + ret;                                      \ | ||||||
|  |     aux_buffer_size = aux_buffer_size - ret | ||||||
|  |  | ||||||
|  | /* | ||||||
|  |  * Convert msgpack format data to json string. | ||||||
|  |  * return >0: success, 0: length of buffer not enough, -1: failed | ||||||
|  |  */ | ||||||
|  | size_t msgpack_object_print_jsonstr(char *buffer, size_t length, const msgpack_object o) | ||||||
|  | { | ||||||
|  |     char *aux_buffer = buffer; | ||||||
|  |     size_t aux_buffer_size = length; | ||||||
|  |     size_t ret; | ||||||
|  |  | ||||||
|  |     switch (o.type) { | ||||||
|  |     case MSGPACK_OBJECT_NIL: | ||||||
|  |         PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, "null"); | ||||||
|  |         break; | ||||||
|  |  | ||||||
|  |     case MSGPACK_OBJECT_BOOLEAN: | ||||||
|  |         PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, (o.via.boolean ? "true" : "false")); | ||||||
|  |         break; | ||||||
|  |  | ||||||
|  |     case MSGPACK_OBJECT_POSITIVE_INTEGER: | ||||||
|  | #if defined(PRIu64) | ||||||
|  |         PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, "%" PRIu64, o.via.u64); | ||||||
|  | #else | ||||||
|  |         if (o.via.u64 > ULONG_MAX) { | ||||||
|  |             PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, "%lu", ULONG_MAX); | ||||||
|  |         } else { | ||||||
|  |             PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, "%lu", (unsigned long)o.via.u64); | ||||||
|  |         } | ||||||
|  | #endif | ||||||
|  |         break; | ||||||
|  |  | ||||||
|  |     case MSGPACK_OBJECT_NEGATIVE_INTEGER: | ||||||
|  | #if defined(PRIi64) | ||||||
|  |         PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, "%" PRIi64, o.via.i64); | ||||||
|  | #else | ||||||
|  |         if (o.via.i64 > LONG_MAX) { | ||||||
|  |             PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, "%ld", LONG_MAX); | ||||||
|  |         } else if (o.via.i64 < LONG_MIN) { | ||||||
|  |             PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, "%ld", LONG_MIN); | ||||||
|  |         } else { | ||||||
|  |             PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, "%ld", (signed long)o.via.i64); | ||||||
|  |         } | ||||||
|  | #endif | ||||||
|  |         break; | ||||||
|  |  | ||||||
|  |     case MSGPACK_OBJECT_FLOAT32: | ||||||
|  |     case MSGPACK_OBJECT_FLOAT64: | ||||||
|  |         PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, "%f", o.via.f64); | ||||||
|  |         break; | ||||||
|  |  | ||||||
|  |     case MSGPACK_OBJECT_STR: | ||||||
|  |         PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, "\"%.*s\"", (int)o.via.str.size, o.via.str.ptr); | ||||||
|  |         break; | ||||||
|  |  | ||||||
|  |     case MSGPACK_OBJECT_BIN: | ||||||
|  |         if (bytes_contain_zero(&o.via.bin)) { | ||||||
|  |             DEBUG("the value contains zero\n"); | ||||||
|  |             return -1; | ||||||
|  |         } | ||||||
|  |         PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, "\"%.*s\"", (int)o.via.bin.size, o.via.bin.ptr); | ||||||
|  |         break; | ||||||
|  |  | ||||||
|  |     case MSGPACK_OBJECT_EXT: | ||||||
|  |         DEBUG("not support type: MSGPACK_OBJECT_EXT.\n"); | ||||||
|  |         return -1; | ||||||
|  |  | ||||||
|  |     case MSGPACK_OBJECT_ARRAY: | ||||||
|  |         PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, "["); | ||||||
|  |         if (o.via.array.size != 0) { | ||||||
|  |             msgpack_object *p = o.via.array.ptr; | ||||||
|  |             msgpack_object *const pend = o.via.array.ptr + o.via.array.size; | ||||||
|  |             PRINT_JSONSTR_CALL(ret, msgpack_object_print_jsonstr, aux_buffer, aux_buffer_size, *p); | ||||||
|  |             ++p; | ||||||
|  |             for (; p < pend; ++p) { | ||||||
|  |                 PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, ","); | ||||||
|  |                 PRINT_JSONSTR_CALL(ret, msgpack_object_print_jsonstr, aux_buffer, aux_buffer_size, *p); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, "]"); | ||||||
|  |         break; | ||||||
|  |  | ||||||
|  |     case MSGPACK_OBJECT_MAP: | ||||||
|  |         PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, "{"); | ||||||
|  |         if (o.via.map.size != 0) { | ||||||
|  |             msgpack_object_kv *p = o.via.map.ptr; | ||||||
|  |             msgpack_object_kv *const pend = o.via.map.ptr + o.via.map.size; | ||||||
|  |  | ||||||
|  |             for (; p < pend; ++p) { | ||||||
|  |                 if (p->key.type != MSGPACK_OBJECT_STR) { | ||||||
|  |                     DEBUG("the key of in a map must be string.\n"); | ||||||
|  |                     return -1; | ||||||
|  |                 } | ||||||
|  |                 if (p != o.via.map.ptr) { | ||||||
|  |                     PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, ","); | ||||||
|  |                 } | ||||||
|  |                 PRINT_JSONSTR_CALL(ret, msgpack_object_print_jsonstr, aux_buffer, aux_buffer_size, p->key); | ||||||
|  |                 PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, ":"); | ||||||
|  |                 PRINT_JSONSTR_CALL(ret, msgpack_object_print_jsonstr, aux_buffer, aux_buffer_size, p->val); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         PRINT_JSONSTR_CALL(ret, snprintf, aux_buffer, aux_buffer_size, "}"); | ||||||
|  |         break; | ||||||
|  |  | ||||||
|  |     default: | ||||||
|  |         DEBUG("unknown type.\n"); | ||||||
|  |         return -1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return length - aux_buffer_size; | ||||||
|  | } | ||||||
|  | #undef PRINT_JSONSTR_CALL | ||||||
|  |  | ||||||
|  | static void test(const char *name, const char *input, const char *expect) | ||||||
|  | { | ||||||
|  |     msgpack_sbuffer sbuf; | ||||||
|  |     { | ||||||
|  |         // pack | ||||||
|  |         msgpack_packer pk; | ||||||
|  |         msgpack_sbuffer_init(&sbuf); | ||||||
|  |         msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write); | ||||||
|  |         if (msgpack_pack_jsonstr(&pk, input) < 0) { | ||||||
|  |             msgpack_sbuffer_destroy(&sbuf); | ||||||
|  |             printf("%s: invalid json string.\n", name); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     { | ||||||
|  |         // unpack | ||||||
|  | #define MAX_JSONLEN 1024 | ||||||
|  |         msgpack_zone z; | ||||||
|  |         msgpack_object obj; | ||||||
|  |         size_t jsonstrlen = MAX_JSONLEN - 1; | ||||||
|  |         char jsonparsed[MAX_JSONLEN]; | ||||||
|  |  | ||||||
|  |         msgpack_zone_init(&z, jsonstrlen); | ||||||
|  |         msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj); | ||||||
|  |         jsonstrlen = msgpack_object_print_jsonstr(jsonparsed, jsonstrlen, obj); | ||||||
|  |         jsonparsed[jsonstrlen] = '\0'; | ||||||
|  |  | ||||||
|  |         //compare input and output | ||||||
|  |         if (expect == NULL) { | ||||||
|  |             expect = input; | ||||||
|  |         } | ||||||
|  |         if (strcmp(expect, jsonparsed) == 0) { | ||||||
|  |             printf("%s: ok\n", name); | ||||||
|  |         } else { | ||||||
|  |             printf("%s: failed\n", name); | ||||||
|  |         } | ||||||
|  |         msgpack_zone_destroy(&z); | ||||||
|  |     } | ||||||
|  |     msgpack_sbuffer_destroy(&sbuf); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int main() | ||||||
|  | { | ||||||
|  |     test("null", "null", NULL); | ||||||
|  |     test("boolean", "false", NULL); | ||||||
|  |     test("single string", "\"frsyuki\"", NULL); | ||||||
|  |     test("single number", "\"100\"", NULL); | ||||||
|  |     test("space", "[{\"valuespace\":\"\",\"\":\"keyspace\"},\"\",[\"\"]]", NULL); | ||||||
|  |     test("quote", "\"My name is Tom (\\\"Bee\\\") Kobe\"", NULL); | ||||||
|  |     test("escape", "\"\\\\b\\f\\n\\r\\t\"", NULL); | ||||||
|  |     test("escape2", "\"\b\f\n\r\t\"", "\"\\b\\f\\n\\r\\t\""); | ||||||
|  |     test("map", "{\"name\":\"Tom (\\\"Bee\\\") Kobe\",\"type\":\"image\",\"data\":{\"width\":360,\"height\":460,\"title\":\"View me\",\"ips\":[116,943,256,711]}}", NULL); | ||||||
|  |     test("array", "[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"]", NULL); | ||||||
|  |     test("number array", "[[101,121,-33],[119,911,171],[0,2,-3]]", NULL); | ||||||
|  |     test("mix array", "[{\"name\":\"Tom\",\"city\":\"London\",\"country\":\"UK\",\"longitude\":23},{\"name\":\"Jack\",\"city\":\"Birmingham\",\"country\":\"UK\",\"longitude\":-22}]", NULL); | ||||||
|  |     test("unicode", "\"\\u5C71\\u5DDD\\u7570\\u57DF\\u98A8\\u6708\\u540C\\u5929\"", "\"山川異域風月同天\""); | ||||||
|  |     test("utf8", "\"山川異域風月同天\"", NULL); | ||||||
|  |     test("double", "12.34", "12.340000"); | ||||||
|  |  | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
							
								
								
									
										127
									
								
								example/lib_buffer_unpack.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										127
									
								
								example/lib_buffer_unpack.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,127 @@ | |||||||
|  | #include <msgpack.h> | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <assert.h> | ||||||
|  |  | ||||||
|  |  | ||||||
|  | typedef struct receiver { | ||||||
|  |     msgpack_sbuffer sbuf; | ||||||
|  |     size_t rest; | ||||||
|  | } receiver; | ||||||
|  |  | ||||||
|  | void receiver_init(receiver *r) { | ||||||
|  |     msgpack_packer pk; | ||||||
|  |  | ||||||
|  |     msgpack_sbuffer_init(&r->sbuf); | ||||||
|  |     msgpack_packer_init(&pk, &r->sbuf, msgpack_sbuffer_write); | ||||||
|  |     /* 1st object */ | ||||||
|  |     msgpack_pack_array(&pk, 3); | ||||||
|  |     msgpack_pack_int(&pk, 1); | ||||||
|  |     msgpack_pack_true(&pk); | ||||||
|  |     msgpack_pack_str(&pk, 7); | ||||||
|  |     msgpack_pack_str_body(&pk, "example", 7); | ||||||
|  |     /* 2nd object */ | ||||||
|  |     msgpack_pack_str(&pk, 6); | ||||||
|  |     msgpack_pack_str_body(&pk, "second", 6); | ||||||
|  |     /* 3rd object */ | ||||||
|  |     msgpack_pack_array(&pk, 2); | ||||||
|  |     msgpack_pack_int(&pk, 42); | ||||||
|  |     msgpack_pack_false(&pk); | ||||||
|  |     r->rest = r->sbuf.size; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | size_t receiver_recv(receiver *r, char* buf, size_t try_size) { | ||||||
|  |     size_t off = r->sbuf.size - r->rest; | ||||||
|  |  | ||||||
|  |     size_t actual_size = try_size; | ||||||
|  |     if (actual_size > r->rest) actual_size = r->rest; | ||||||
|  |  | ||||||
|  |     memcpy(buf, r->sbuf.data + off, actual_size); | ||||||
|  |     r->rest -= actual_size; | ||||||
|  |  | ||||||
|  |     return actual_size; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | size_t receiver_to_unpacker(receiver* r, size_t request_size, | ||||||
|  |         msgpack_unpacker *unpacker) | ||||||
|  | { | ||||||
|  |     size_t recv_len; | ||||||
|  |     // make sure there's enough room, or expand the unpacker accordingly | ||||||
|  |     if (msgpack_unpacker_buffer_capacity(unpacker) < request_size) { | ||||||
|  |         msgpack_unpacker_reserve_buffer(unpacker, request_size); | ||||||
|  |         assert(msgpack_unpacker_buffer_capacity(unpacker) >= request_size); | ||||||
|  |     } | ||||||
|  |     recv_len = receiver_recv(r, msgpack_unpacker_buffer(unpacker), | ||||||
|  |                              request_size); | ||||||
|  |     msgpack_unpacker_buffer_consumed(unpacker, recv_len); | ||||||
|  |     return recv_len; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #define EACH_RECV_SIZE 4 | ||||||
|  |  | ||||||
|  | void unpack(receiver* r) { | ||||||
|  |     /* buf is allocated by unpacker. */ | ||||||
|  |     msgpack_unpacker* unp = msgpack_unpacker_new(100); | ||||||
|  |     msgpack_unpacked result; | ||||||
|  |     msgpack_unpack_return ret; | ||||||
|  |     size_t recv_len; | ||||||
|  |     int recv_count = 0; | ||||||
|  |     int i = 0; | ||||||
|  |  | ||||||
|  |     msgpack_unpacked_init(&result); | ||||||
|  |     while (true) { | ||||||
|  |         recv_len = receiver_to_unpacker(r, EACH_RECV_SIZE, unp); | ||||||
|  |         if (recv_len == 0) break; // (reached end of input) | ||||||
|  | #if defined(_MSC_VER) || defined(__MINGW32__) | ||||||
|  |         printf("receive count: %d %Id bytes received.\n", recv_count++, recv_len); | ||||||
|  | #else // defined(_MSC_VER) || defined(__MINGW32__) | ||||||
|  |         printf("receive count: %d %zd bytes received.\n", recv_count++, recv_len); | ||||||
|  | #endif // defined(_MSC_VER) || defined(__MINGW32__) | ||||||
|  |         ret = msgpack_unpacker_next(unp, &result); | ||||||
|  |         while (ret == MSGPACK_UNPACK_SUCCESS) { | ||||||
|  |             msgpack_object obj = result.data; | ||||||
|  |  | ||||||
|  |             /* Use obj. */ | ||||||
|  |             printf("Object no %d:\n", ++i); | ||||||
|  |             msgpack_object_print(stdout, obj); | ||||||
|  |             printf("\n"); | ||||||
|  |             /* If you want to allocate something on the zone, you can use zone. */ | ||||||
|  |             /* msgpack_zone* zone = result.zone; */ | ||||||
|  |             /* The lifetime of the obj and the zone,  */ | ||||||
|  |  | ||||||
|  |             ret = msgpack_unpacker_next(unp, &result); | ||||||
|  |         } | ||||||
|  |         if (ret == MSGPACK_UNPACK_PARSE_ERROR) { | ||||||
|  |             printf("The data in the buf is invalid format.\n"); | ||||||
|  |             msgpack_unpacked_destroy(&result); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     msgpack_unpacked_destroy(&result); | ||||||
|  |     msgpack_unpacker_free(unp); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int main(void) { | ||||||
|  |     receiver r; | ||||||
|  |     receiver_init(&r); | ||||||
|  |  | ||||||
|  |     unpack(&r); | ||||||
|  |  | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* Output */ | ||||||
|  |  | ||||||
|  | /* | ||||||
|  | receive count: 0 4 bytes received. | ||||||
|  | receive count: 1 4 bytes received. | ||||||
|  | receive count: 2 4 bytes received. | ||||||
|  | Object no 1: | ||||||
|  | [1, true, "example"] | ||||||
|  | receive count: 3 4 bytes received. | ||||||
|  | receive count: 4 4 bytes received. | ||||||
|  | Object no 2: | ||||||
|  | "second" | ||||||
|  | receive count: 5 1 bytes received. | ||||||
|  | Object no 3: | ||||||
|  | [42, false] | ||||||
|  | */ | ||||||
							
								
								
									
										47
									
								
								example/simple_c.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								example/simple_c.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,47 @@ | |||||||
|  | #include <msgpack.h> | ||||||
|  | #include <stdio.h> | ||||||
|  |  | ||||||
|  | void print(char const* buf,size_t len) | ||||||
|  | { | ||||||
|  |     size_t i = 0; | ||||||
|  |     for(; i < len ; ++i) | ||||||
|  |         printf("%02x ", 0xff & buf[i]); | ||||||
|  |     printf("\n"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int main(void) | ||||||
|  | { | ||||||
|  |     msgpack_sbuffer sbuf; | ||||||
|  |     msgpack_packer pk; | ||||||
|  |     msgpack_zone mempool; | ||||||
|  |     msgpack_object deserialized; | ||||||
|  |  | ||||||
|  |     /* msgpack::sbuffer is a simple buffer implementation. */ | ||||||
|  |     msgpack_sbuffer_init(&sbuf); | ||||||
|  |  | ||||||
|  |     /* serialize values into the buffer using msgpack_sbuffer_write callback function. */ | ||||||
|  |     msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write); | ||||||
|  |  | ||||||
|  |     msgpack_pack_array(&pk, 3); | ||||||
|  |     msgpack_pack_int(&pk, 1); | ||||||
|  |     msgpack_pack_true(&pk); | ||||||
|  |     msgpack_pack_str(&pk, 7); | ||||||
|  |     msgpack_pack_str_body(&pk, "example", 7); | ||||||
|  |  | ||||||
|  |     print(sbuf.data, sbuf.size); | ||||||
|  |  | ||||||
|  |     /* deserialize the buffer into msgpack_object instance. */ | ||||||
|  |     /* deserialized object is valid during the msgpack_zone instance alive. */ | ||||||
|  |     msgpack_zone_init(&mempool, 2048); | ||||||
|  |  | ||||||
|  |     msgpack_unpack(sbuf.data, sbuf.size, NULL, &mempool, &deserialized); | ||||||
|  |  | ||||||
|  |     /* print the deserialized object. */ | ||||||
|  |     msgpack_object_print(stdout, deserialized); | ||||||
|  |     puts(""); | ||||||
|  |  | ||||||
|  |     msgpack_zone_destroy(&mempool); | ||||||
|  |     msgpack_sbuffer_destroy(&sbuf); | ||||||
|  |  | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
							
								
								
									
										37
									
								
								example/speed_test_uint32_array.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								example/speed_test_uint32_array.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | |||||||
|  | #include <msgpack.h> | ||||||
|  |  | ||||||
|  | void test() | ||||||
|  | { | ||||||
|  |     size_t size = 10000000; | ||||||
|  |     msgpack_sbuffer buf; | ||||||
|  |     msgpack_packer * pk; | ||||||
|  |     size_t upk_pos = 0; | ||||||
|  |     msgpack_unpacked msg; | ||||||
|  |  | ||||||
|  |     msgpack_sbuffer_init(&buf); | ||||||
|  |  | ||||||
|  |     pk = msgpack_packer_new(&buf, msgpack_sbuffer_write); | ||||||
|  |  | ||||||
|  |     msgpack_pack_array(pk, size); | ||||||
|  |     { | ||||||
|  |         size_t idx = 0; | ||||||
|  |         for (; idx < size; ++idx) | ||||||
|  |             msgpack_pack_uint32(pk, 1); | ||||||
|  |     } | ||||||
|  |     msgpack_packer_free(pk); | ||||||
|  |  | ||||||
|  |     msgpack_unpacked_init(&msg); | ||||||
|  |  | ||||||
|  |     while (msgpack_unpack_next(&msg, buf.data, buf.size, &upk_pos) == MSGPACK_UNPACK_SUCCESS) { | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     msgpack_unpacked_destroy(&msg); | ||||||
|  |     msgpack_sbuffer_destroy(&buf); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int main(void) | ||||||
|  | { | ||||||
|  |     int i = 0; | ||||||
|  |     for (; i < 10; ++i) test(); | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
							
								
								
									
										37
									
								
								example/speed_test_uint64_array.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								example/speed_test_uint64_array.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | |||||||
|  | #include <msgpack.h> | ||||||
|  |  | ||||||
|  | void test() | ||||||
|  | { | ||||||
|  |     uint64_t test_u64 = 0xFFF0000000000001LL; | ||||||
|  |     size_t size = 10000000; | ||||||
|  |     msgpack_sbuffer buf; | ||||||
|  |     msgpack_packer * pk; | ||||||
|  |     size_t upk_pos = 0; | ||||||
|  |     msgpack_unpacked msg; | ||||||
|  |  | ||||||
|  |     msgpack_sbuffer_init(&buf); | ||||||
|  |  | ||||||
|  |     pk = msgpack_packer_new(&buf, msgpack_sbuffer_write); | ||||||
|  |  | ||||||
|  |     msgpack_pack_array(pk, size); | ||||||
|  |     { | ||||||
|  |         size_t idx = 0; | ||||||
|  |         for (; idx < size; ++idx) | ||||||
|  |             msgpack_pack_uint64(pk, test_u64); | ||||||
|  |     } | ||||||
|  |     msgpack_packer_free(pk); | ||||||
|  |  | ||||||
|  |     msgpack_unpacked_init(&msg); | ||||||
|  |  | ||||||
|  |     while (msgpack_unpack_next(&msg, buf.data, buf.size, &upk_pos) == MSGPACK_UNPACK_SUCCESS) { | ||||||
|  |     } | ||||||
|  |     msgpack_unpacked_destroy(&msg); | ||||||
|  |     msgpack_sbuffer_destroy(&buf); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int main(void) | ||||||
|  | { | ||||||
|  |     int i = 0; | ||||||
|  |     for (; i < 10; ++i) test(); | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
							
								
								
									
										81
									
								
								example/user_buffer_unpack.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								example/user_buffer_unpack.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,81 @@ | |||||||
|  | #include <msgpack.h> | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <assert.h> | ||||||
|  |  | ||||||
|  | #define UNPACKED_BUFFER_SIZE 2048 | ||||||
|  |  | ||||||
|  | void prepare(msgpack_sbuffer* sbuf) { | ||||||
|  |     msgpack_packer pk; | ||||||
|  |  | ||||||
|  |     msgpack_packer_init(&pk, sbuf, msgpack_sbuffer_write); | ||||||
|  |     /* 1st object */ | ||||||
|  |     msgpack_pack_array(&pk, 3); | ||||||
|  |     msgpack_pack_int(&pk, 1); | ||||||
|  |     msgpack_pack_true(&pk); | ||||||
|  |     msgpack_pack_str(&pk, 7); | ||||||
|  |     msgpack_pack_str_body(&pk, "example", 7); | ||||||
|  |     /* 2nd object */ | ||||||
|  |     msgpack_pack_str(&pk, 6); | ||||||
|  |     msgpack_pack_str_body(&pk, "second", 6); | ||||||
|  |     /* 3rd object */ | ||||||
|  |     msgpack_pack_array(&pk, 2); | ||||||
|  |     msgpack_pack_int(&pk, 42); | ||||||
|  |     msgpack_pack_false(&pk); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void unpack(char const* buf, size_t len) { | ||||||
|  |     /* buf is allocated by client. */ | ||||||
|  |     msgpack_unpacked result; | ||||||
|  |     size_t off = 0; | ||||||
|  |     msgpack_unpack_return ret; | ||||||
|  |     int i = 0; | ||||||
|  |     char unpacked_buffer[UNPACKED_BUFFER_SIZE]; | ||||||
|  |     msgpack_unpacked_init(&result); | ||||||
|  |     ret = msgpack_unpack_next(&result, buf, len, &off); | ||||||
|  |     while (ret == MSGPACK_UNPACK_SUCCESS) { | ||||||
|  |         msgpack_object obj = result.data; | ||||||
|  |  | ||||||
|  |         /* Use obj. */ | ||||||
|  |         printf("Object no %d:\n", ++i); | ||||||
|  |         msgpack_object_print(stdout, obj); | ||||||
|  |         printf("\n"); | ||||||
|  |         msgpack_object_print_buffer(unpacked_buffer, UNPACKED_BUFFER_SIZE, obj); | ||||||
|  |         printf("%s\n", unpacked_buffer); | ||||||
|  |         /* If you want to allocate something on the zone, you can use zone. */ | ||||||
|  |         /* msgpack_zone* zone = result.zone; */ | ||||||
|  |         /* The lifetime of the obj and the zone,  */ | ||||||
|  |  | ||||||
|  |         ret = msgpack_unpack_next(&result, buf, len, &off); | ||||||
|  |     } | ||||||
|  |     msgpack_unpacked_destroy(&result); | ||||||
|  |  | ||||||
|  |     if (ret == MSGPACK_UNPACK_CONTINUE) { | ||||||
|  |         printf("All msgpack_object in the buffer is consumed.\n"); | ||||||
|  |     } | ||||||
|  |     else if (ret == MSGPACK_UNPACK_PARSE_ERROR) { | ||||||
|  |         printf("The data in the buf is invalid format.\n"); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int main(void) { | ||||||
|  |     msgpack_sbuffer sbuf; | ||||||
|  |     msgpack_sbuffer_init(&sbuf); | ||||||
|  |  | ||||||
|  |     prepare(&sbuf); | ||||||
|  |     unpack(sbuf.data, sbuf.size); | ||||||
|  |  | ||||||
|  |     msgpack_sbuffer_destroy(&sbuf); | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* Output */ | ||||||
|  |  | ||||||
|  | /* | ||||||
|  | Object no 1: | ||||||
|  | [1, true, "example"] | ||||||
|  | Object no 2: | ||||||
|  | "second" | ||||||
|  | Object no 3: | ||||||
|  | [42, false] | ||||||
|  | All msgpack_object in the buffer is consumed. | ||||||
|  | */ | ||||||
| @@ -1,65 +0,0 @@ | |||||||
| IF (MSGPACK_USE_X3_PARSE AND MSGPACK_DEFAULT_API_VERSION VERSION_GREATER 1) |  | ||||||
|     FIND_PACKAGE (Boost REQUIRED COMPONENTS context system unit_test_framework) |  | ||||||
|     FIND_PACKAGE (Threads REQUIRED) |  | ||||||
|  |  | ||||||
|     LIST (APPEND exec_PROGRAMS |  | ||||||
|         unpack.cpp |  | ||||||
|         parse.cpp |  | ||||||
|     ) |  | ||||||
|     LIST (APPEND with_boost_PROGRAMS |  | ||||||
|         stream_unpack.cpp |  | ||||||
|     ) |  | ||||||
|     FOREACH (source_file ${exec_PROGRAMS}) |  | ||||||
|         GET_FILENAME_COMPONENT (source_file_we ${source_file} NAME_WE) |  | ||||||
|         ADD_EXECUTABLE ( |  | ||||||
|             ${source_file_we} |  | ||||||
|             ${source_file} |  | ||||||
|         ) |  | ||||||
|         TARGET_LINK_LIBRARIES (${source_file_we} PRIVATE msgpackc-cxx) |  | ||||||
|  |  | ||||||
|         IF ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") |  | ||||||
|             SET_PROPERTY (TARGET ${source_file_we} APPEND_STRING PROPERTY COMPILE_FLAGS " -Wall -Wextra") |  | ||||||
|         ENDIF () |  | ||||||
|  |  | ||||||
|         IF ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") |  | ||||||
|             SET_PROPERTY (TARGET ${source_file_we} APPEND_STRING PROPERTY COMPILE_FLAGS " -Wno-mismatched-tags") |  | ||||||
|         ENDIF () |  | ||||||
|  |  | ||||||
|         IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") |  | ||||||
|             IF (CMAKE_CXX_FLAGS MATCHES "/W[0-4]") |  | ||||||
|                 STRING(REGEX REPLACE "/W[0-4]" "/W3 /WX" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") |  | ||||||
|             ELSE () |  | ||||||
|                 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3 /WX") |  | ||||||
|             ENDIF () |  | ||||||
|         ENDIF () |  | ||||||
|     ENDFOREACH () |  | ||||||
|     FOREACH (source_file ${with_boost_PROGRAMS}) |  | ||||||
|         GET_FILENAME_COMPONENT (source_file_we ${source_file} NAME_WE) |  | ||||||
|         ADD_EXECUTABLE ( |  | ||||||
|             ${source_file_we} |  | ||||||
|             ${source_file} |  | ||||||
|         ) |  | ||||||
|         TARGET_LINK_LIBRARIES (${source_file_we} PRIVATE |  | ||||||
|             msgpackc-cxx |  | ||||||
|             Boost::context |  | ||||||
|             Boost::system |  | ||||||
|             Boost::unit_test_framework |  | ||||||
|             Threads::Threads |  | ||||||
|         ) |  | ||||||
|         IF ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") |  | ||||||
|             SET_PROPERTY (TARGET ${source_file_we} APPEND_STRING PROPERTY COMPILE_FLAGS " -Wall -Wextra") |  | ||||||
|         ENDIF () |  | ||||||
|  |  | ||||||
|         IF ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") |  | ||||||
|             SET_PROPERTY (TARGET ${source_file_we} APPEND_STRING PROPERTY COMPILE_FLAGS " -Wno-mismatched-tags") |  | ||||||
|         ENDIF () |  | ||||||
|  |  | ||||||
|         IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") |  | ||||||
|             IF (CMAKE_CXX_FLAGS MATCHES "/W[0-4]") |  | ||||||
|                 STRING(REGEX REPLACE "/W[0-4]" "/W3 /WX" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") |  | ||||||
|             ELSE () |  | ||||||
|                 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3 /WX") |  | ||||||
|             ENDIF () |  | ||||||
|         ENDIF () |  | ||||||
|     ENDFOREACH () |  | ||||||
| ENDIF () |  | ||||||
| @@ -1,125 +0,0 @@ | |||||||
| // MessagePack for C++ example |  | ||||||
| // |  | ||||||
| // Copyright (C) 2017 KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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) |  | ||||||
| // |  | ||||||
|  |  | ||||||
| #include <iostream> |  | ||||||
| #include <sstream> |  | ||||||
| #include <cassert> |  | ||||||
|  |  | ||||||
| // MSGPACK_USE_X3_PARSE should be defined before including msgpack.hpp |  | ||||||
| // It usually defined as a compiler option as -DMSGPACK_USE_X3_PARSE. |  | ||||||
|  |  | ||||||
| #include <msgpack.hpp> |  | ||||||
|  |  | ||||||
| struct json_like_visitor : msgpack::v2::null_visitor { |  | ||||||
|     json_like_visitor(std::string& s):m_s(s) {} |  | ||||||
|  |  | ||||||
|     bool visit_nil() { |  | ||||||
|         m_s += "null"; |  | ||||||
|         return true; |  | ||||||
|     } |  | ||||||
|     bool visit_boolean(bool v) { |  | ||||||
|         if (v) m_s += "true"; |  | ||||||
|         else m_s += "false"; |  | ||||||
|         return true; |  | ||||||
|     } |  | ||||||
|     bool visit_positive_integer(uint64_t v) { |  | ||||||
|         std::stringstream ss; |  | ||||||
|         ss << v; |  | ||||||
|         m_s += ss.str(); |  | ||||||
|         return true; |  | ||||||
|     } |  | ||||||
|     bool visit_negative_integer(int64_t v) { |  | ||||||
|         std::stringstream ss; |  | ||||||
|         ss << v; |  | ||||||
|         m_s += ss.str(); |  | ||||||
|         return true; |  | ||||||
|     } |  | ||||||
|     bool visit_float32(float v) { |  | ||||||
|         std::stringstream ss; |  | ||||||
|         ss << v; |  | ||||||
|         m_s += ss.str(); |  | ||||||
|         return true; |  | ||||||
|     } |  | ||||||
|     bool visit_float64(double v) { |  | ||||||
|         std::stringstream ss; |  | ||||||
|         ss << v; |  | ||||||
|         m_s += ss.str(); |  | ||||||
|         return true; |  | ||||||
|     } |  | ||||||
|     bool visit_str(const char* v, uint32_t size) { |  | ||||||
|         m_s += '"' + std::string(v, size) + '"'; |  | ||||||
|         return true; |  | ||||||
|     } |  | ||||||
|     bool start_array(uint32_t /*num_elements*/) { |  | ||||||
|         m_s += "["; |  | ||||||
|         return true; |  | ||||||
|     } |  | ||||||
|     bool end_array_item() { |  | ||||||
|         m_s += ","; |  | ||||||
|         return true; |  | ||||||
|     } |  | ||||||
|     bool end_array() { |  | ||||||
|         m_s.erase(m_s.size() - 1, 1); // remove the last ',' |  | ||||||
|         m_s += "]"; |  | ||||||
|         return true; |  | ||||||
|     } |  | ||||||
|     bool start_map(uint32_t /*num_kv_pairs*/) { |  | ||||||
|         m_s += "{"; |  | ||||||
|         return true; |  | ||||||
|     } |  | ||||||
|     bool end_map_key() { |  | ||||||
|         m_s += ":"; |  | ||||||
|         return true; |  | ||||||
|     } |  | ||||||
|     bool end_map_value() { |  | ||||||
|         m_s += ","; |  | ||||||
|         return true; |  | ||||||
|     } |  | ||||||
|     bool end_map() { |  | ||||||
|         m_s.erase(m_s.size() - 1, 1); // remove the last ',' |  | ||||||
|         m_s += "}"; |  | ||||||
|         return true; |  | ||||||
|     } |  | ||||||
|     void parse_error(size_t /*parsed_offset*/, size_t /*error_offset*/) { |  | ||||||
|     } |  | ||||||
|     void insufficient_bytes(size_t /*parsed_offset*/, size_t /*error_offset*/) { |  | ||||||
|     } |  | ||||||
|     std::string& m_s; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| int main() { |  | ||||||
|     std::stringstream ss; |  | ||||||
|     std::map<std::string, std::vector<int>> v1 { |  | ||||||
|         { "ABC", { 1, 2, 3 } }, |  | ||||||
|         { "DEFG", { 4, 5 } } |  | ||||||
|     }; |  | ||||||
|     std::vector<std::string> v2 { |  | ||||||
|         "HIJ", "KLM", "NOP" |  | ||||||
|     }; |  | ||||||
|     msgpack::pack(ss, v1); |  | ||||||
|     msgpack::pack(ss, v2); |  | ||||||
|  |  | ||||||
|     std::string const& buf = ss.str(); |  | ||||||
|     auto it = buf.begin(); |  | ||||||
|     auto end = buf.end(); |  | ||||||
|     { |  | ||||||
|         std::string str; |  | ||||||
|         bool ret = msgpack::parse(it, end, json_like_visitor(str)); |  | ||||||
|         // it is updated here. |  | ||||||
|         assert(ret); |  | ||||||
|         std::cout << str << std::endl; |  | ||||||
|     } |  | ||||||
|     { |  | ||||||
|         std::string str; |  | ||||||
|         bool ret = msgpack::parse(it, end, json_like_visitor(str)); |  | ||||||
|         // it is updated here. |  | ||||||
|         assert(ret); |  | ||||||
|         std::cout << str << std::endl; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @@ -1,248 +0,0 @@ | |||||||
| // MessagePack for C++ example |  | ||||||
| // |  | ||||||
| // Copyright (C) 2017 KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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) |  | ||||||
| // |  | ||||||
|  |  | ||||||
| #include <iostream> |  | ||||||
| #include <sstream> |  | ||||||
| #include <cassert> |  | ||||||
| #include <thread> |  | ||||||
|  |  | ||||||
| // MSGPACK_USE_X3_PARSE should be defined before including msgpack.hpp |  | ||||||
| // It usually defined as a compiler option as -DMSGPACK_USE_X3_PARSE. |  | ||||||
|  |  | ||||||
| //#define MSGPACK_USE_X3_PARSE |  | ||||||
|  |  | ||||||
| #include <msgpack.hpp> |  | ||||||
|  |  | ||||||
| #include <boost/asio.hpp> |  | ||||||
| #include <boost/coroutine2/all.hpp> |  | ||||||
|  |  | ||||||
| #if defined(__clang__) |  | ||||||
| #pragma GCC diagnostic push |  | ||||||
| #pragma GCC diagnostic ignored "-Wunused-parameter" |  | ||||||
| #endif // defined(__clang__) |  | ||||||
|  |  | ||||||
| #include <boost/spirit/home/support/multi_pass.hpp> |  | ||||||
|  |  | ||||||
| #if defined(__clang__) |  | ||||||
| #pragma GCC diagnostic pop |  | ||||||
| #endif // defined(__clang__) |  | ||||||
|  |  | ||||||
| namespace as = boost::asio; |  | ||||||
| namespace x3 = boost::spirit::x3; |  | ||||||
| namespace coro2 = boost::coroutines2; |  | ||||||
|  |  | ||||||
| using pull_type = coro2::asymmetric_coroutine<std::shared_ptr<std::vector<char>>>::pull_type; |  | ||||||
|  |  | ||||||
| // iterator fetching data from coroutine2. |  | ||||||
| class buffered_iterator : public std::iterator<std::input_iterator_tag, char> { |  | ||||||
| public: |  | ||||||
|     using pointer_t = typename iterator::pointer; |  | ||||||
|     using reference_t = typename iterator::reference; |  | ||||||
|  |  | ||||||
|     explicit buffered_iterator(pull_type& source) noexcept |  | ||||||
|         : source_{ &source } { |  | ||||||
|         fetch_(); |  | ||||||
|     } |  | ||||||
|     buffered_iterator() = default; |  | ||||||
|  |  | ||||||
|     bool operator==(buffered_iterator const& other) const noexcept { |  | ||||||
|         if (!other.source_ && !source_ && !other.buf_ && !buf_) return true; |  | ||||||
|         return other.it_ == it_; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     bool operator!=(buffered_iterator const& other) const noexcept { |  | ||||||
|         return !(other == *this); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     buffered_iterator & operator++() { |  | ||||||
|         increment_(); |  | ||||||
|         return * this; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     buffered_iterator operator++(int) = delete; |  | ||||||
|  |  | ||||||
|     reference_t operator*() noexcept { |  | ||||||
|         return *it_; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     pointer_t operator->() noexcept { |  | ||||||
|         return std::addressof(*it_); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
| private: |  | ||||||
|     void fetch_() noexcept { |  | ||||||
|         BOOST_ASSERT( nullptr != source_); |  | ||||||
|         if (*source_) { |  | ||||||
|             buf_ = source_->get(); |  | ||||||
|             it_ = buf_->begin(); |  | ||||||
|         } |  | ||||||
|         else { |  | ||||||
|             source_ = nullptr; |  | ||||||
|             buf_.reset(); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     void increment_() { |  | ||||||
|         BOOST_ASSERT( nullptr != source_); |  | ||||||
|         BOOST_ASSERT(*source_); |  | ||||||
|         if (++it_ == buf_->end()) { |  | ||||||
|             (*source_)(); |  | ||||||
|             fetch_(); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
| private: |  | ||||||
|     pull_type* source_{ nullptr }; |  | ||||||
|     std::shared_ptr<std::vector<char>> buf_; |  | ||||||
|     std::vector<char>::iterator it_; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| // session class that corresponding to each client |  | ||||||
| class session : public std::enable_shared_from_this<session> { |  | ||||||
| public: |  | ||||||
|     session(as::ip::tcp::socket socket) |  | ||||||
|         : socket_(std::move(socket)) { |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     void start() { |  | ||||||
|         sink_ = std::make_shared<coro2::asymmetric_coroutine<std::shared_ptr<std::vector<char>>>::push_type>( |  | ||||||
|             [&, this](pull_type& source) { |  | ||||||
|                 // *1 is started when the first sink is called. |  | ||||||
|  |  | ||||||
|                 std::cout << "session started" << std::endl; |  | ||||||
|                 do_read(); |  | ||||||
|                 source(); |  | ||||||
|  |  | ||||||
|                 // use buffered_iterator here |  | ||||||
|                 // b is incremented in msgpack::unpack() and fetch data from sink |  | ||||||
|                 // via coroutine2 mechanism |  | ||||||
|                 auto b = boost::spirit::make_default_multi_pass(buffered_iterator(source)); |  | ||||||
|                 auto e = boost::spirit::make_default_multi_pass(buffered_iterator()); |  | ||||||
|  |  | ||||||
|                 // This is usually an infinity look, but for test, loop is finished when |  | ||||||
|                 // two message pack data is processed. |  | ||||||
|                 for (int i = 0; i != 2; ++i) { |  | ||||||
|                     auto oh = msgpack::unpack(b, e); |  | ||||||
|                     std::cout << oh.get() << std::endl; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         ); |  | ||||||
|         // send dummy data to start *1 |  | ||||||
|         (*sink_)({}); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
| private: |  | ||||||
|     void do_read() { |  | ||||||
|         std::cout << "session do_read() is called" << std::endl; |  | ||||||
|         auto self(shared_from_this()); |  | ||||||
|         auto data = std::make_shared<std::vector<char>>(static_cast<std::size_t>(max_length)); |  | ||||||
|         socket_.async_read_some( |  | ||||||
|             boost::asio::buffer(*data), |  | ||||||
|             [this, self, data] |  | ||||||
|             (boost::system::error_code ec, std::size_t length) { |  | ||||||
|                 if (!ec) { |  | ||||||
|                     data->resize(length); |  | ||||||
|                     (*sink_)(data); |  | ||||||
|                     do_read(); |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         ); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     as::ip::tcp::socket socket_; |  | ||||||
|     static constexpr std::size_t const max_length = 1024; |  | ||||||
|     std::shared_ptr<coro2::asymmetric_coroutine<std::shared_ptr<std::vector<char>>>::push_type> sink_; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| class server { |  | ||||||
| public: |  | ||||||
|     server( |  | ||||||
|         as::io_service& ios, |  | ||||||
|         std::uint16_t port) |  | ||||||
|         : acceptor_(ios, as::ip::tcp::endpoint(as::ip::tcp::v4(), port)), |  | ||||||
|           socket_(ios) { |  | ||||||
|         do_accept(); |  | ||||||
|         std::cout << "server start accept" << std::endl; |  | ||||||
|         ios.run(); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
| private: |  | ||||||
|     void do_accept() { |  | ||||||
|         acceptor_.async_accept( |  | ||||||
|             socket_, |  | ||||||
|             [this](boost::system::error_code ec) { |  | ||||||
|                 if (!ec) { |  | ||||||
|                     std::make_shared<session>(std::move(socket_))->start(); |  | ||||||
|                 } |  | ||||||
|                 // for test, only one session is accepted. |  | ||||||
|                 // do_accept(); |  | ||||||
|             } |  | ||||||
|         ); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     as::ip::tcp::acceptor acceptor_; |  | ||||||
|     as::ip::tcp::socket socket_; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| int main() { |  | ||||||
|     std::thread srv( |  | ||||||
|         []{ |  | ||||||
|             boost::asio::io_service ios; |  | ||||||
|             server s(ios, 12345); |  | ||||||
|         } |  | ||||||
|     ); |  | ||||||
|  |  | ||||||
|     std::thread cli( |  | ||||||
|         []{ |  | ||||||
|             std::this_thread::sleep_for(std::chrono::seconds(1)); |  | ||||||
|             std::cout << "client start" << std::endl; |  | ||||||
|  |  | ||||||
|             std::stringstream ss; |  | ||||||
|             std::map<std::string, std::vector<int>> v1 { |  | ||||||
|                 { "ABC", { 1, 2, 3 } }, |  | ||||||
|                 { "DEFG", { 4, 5 } } |  | ||||||
|             }; |  | ||||||
|             std::vector<std::string> v2 { |  | ||||||
|                 "HIJ", "KLM", "NOP" |  | ||||||
|                     }; |  | ||||||
|             msgpack::pack(ss, v1); |  | ||||||
|             msgpack::pack(ss, v2); |  | ||||||
|  |  | ||||||
|             auto send_data = ss.str(); |  | ||||||
|  |  | ||||||
|             boost::asio::io_service ios; |  | ||||||
|             as::ip::tcp::resolver::query q("127.0.0.1", "12345"); |  | ||||||
|             as::ip::tcp::resolver r(ios); |  | ||||||
|             auto it = r.resolve(q); |  | ||||||
|  |  | ||||||
|             std::cout << "client connect" << std::endl; |  | ||||||
|             as::ip::tcp::socket s(ios); |  | ||||||
|             as::connect(s, it); |  | ||||||
|  |  | ||||||
|  |  | ||||||
|             std::size_t const size = 5; |  | ||||||
|             std::size_t rest = send_data.size(); |  | ||||||
|             std::size_t index = 0; |  | ||||||
|             while (rest != 0) { |  | ||||||
|                 std::cout << "client send data" << std::endl; |  | ||||||
|                 auto send_size = size < rest ? size : rest; |  | ||||||
|                 as::write(s, as::buffer(&send_data[index], send_size)); |  | ||||||
|                 rest -= send_size; |  | ||||||
|                 index += send_size; |  | ||||||
|                 std::cout << "client wait" << std::endl; |  | ||||||
|                 std::this_thread::sleep_for(std::chrono::seconds(1)); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     ); |  | ||||||
|  |  | ||||||
|     cli.join(); |  | ||||||
|     std::cout << "client joinded" << std::endl; |  | ||||||
|     srv.join(); |  | ||||||
|     std::cout << "server joinded" << std::endl; |  | ||||||
| } |  | ||||||
| @@ -1,43 +0,0 @@ | |||||||
| // MessagePack for C++ example |  | ||||||
| // |  | ||||||
| // Copyright (C) 2017 KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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) |  | ||||||
| // |  | ||||||
|  |  | ||||||
| #include <iostream> |  | ||||||
| #include <sstream> |  | ||||||
| #include <cassert> |  | ||||||
|  |  | ||||||
| // MSGPACK_USE_X3_PARSE should be defined before including msgpack.hpp |  | ||||||
| // It usually defined as a compiler option as -DMSGPACK_USE_X3_PARSE. |  | ||||||
|  |  | ||||||
| #include <msgpack.hpp> |  | ||||||
|  |  | ||||||
| int main() { |  | ||||||
|     std::stringstream ss; |  | ||||||
|     std::map<std::string, std::vector<int>> v1 { |  | ||||||
|         { "ABC", { 1, 2, 3 } }, |  | ||||||
|         { "DEFG", { 4, 5 } } |  | ||||||
|     }; |  | ||||||
|     std::vector<std::string> v2 { |  | ||||||
|         "HIJ", "KLM", "NOP" |  | ||||||
|     }; |  | ||||||
|     msgpack::pack(ss, v1); |  | ||||||
|     msgpack::pack(ss, v2); |  | ||||||
|  |  | ||||||
|     std::string const& buf = ss.str(); |  | ||||||
|     auto it = buf.begin(); |  | ||||||
|     auto end = buf.end(); |  | ||||||
|     { |  | ||||||
|         auto oh = msgpack::unpack(it, end); |  | ||||||
|         // it is updated here. |  | ||||||
|         assert(v1 == (oh.get().as<std::map<std::string, std::vector<int>>>())); |  | ||||||
|     } |  | ||||||
|     { |  | ||||||
|         auto oh = msgpack::unpack(it, end); |  | ||||||
|         assert(v2 == oh.get().as<std::vector<std::string>>()); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @@ -1,32 +0,0 @@ | |||||||
| FIND_PACKAGE (Threads REQUIRED) |  | ||||||
| FIND_PACKAGE (Boost REQUIRED COMPONENTS system filesystem unit_test_framework) |  | ||||||
|  |  | ||||||
| LIST (APPEND check_PROGRAMS |  | ||||||
|     regression_runner.cpp |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| FOREACH (source_file ${check_PROGRAMS}) |  | ||||||
|     GET_FILENAME_COMPONENT (source_file_we ${source_file} NAME_WE) |  | ||||||
|     ADD_EXECUTABLE ( |  | ||||||
|         ${source_file_we} |  | ||||||
|         ${source_file} |  | ||||||
|     ) |  | ||||||
|     TARGET_LINK_LIBRARIES (${source_file_we} |  | ||||||
|         msgpackc-cxx |  | ||||||
|         Threads::Threads |  | ||||||
|         Boost::filesystem |  | ||||||
|         Boost::system |  | ||||||
|         Boost::unit_test_framework |  | ||||||
|     ) |  | ||||||
|     ADD_TEST (${source_file_we} ${source_file_we}) |  | ||||||
|     IF ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") |  | ||||||
|       SET_PROPERTY (TARGET ${source_file_we} APPEND_STRING PROPERTY COMPILE_FLAGS "-Wall -Wextra -Wno-mismatched-tags -g") |  | ||||||
|         IF ("${MSGPACK_SAN}" STREQUAL "ASAN") |  | ||||||
|             SET (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer -fsanitize=address") |  | ||||||
|             SET (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-omit-frame-pointer -fsanitize=address") |  | ||||||
|         ELSEIF ("${MSGPACK_SAN}" STREQUAL "UBSAN") |  | ||||||
|             SET (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=undefined") |  | ||||||
|             SET (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=undefined") |  | ||||||
|         ENDIF() |  | ||||||
|     ENDIF() |  | ||||||
| ENDFOREACH () |  | ||||||
| @@ -1,49 +0,0 @@ | |||||||
| #include <boost/filesystem.hpp> |  | ||||||
|  |  | ||||||
| // Use parameterized tests instead of modern data-driven test cases |  | ||||||
| // because BOOST_DATA_TEST_CASE requires C++11 or newer. See: |  | ||||||
| // - https://www.boost.org/doc/libs/1_76_0/libs/test/doc/html/boost_test/tests_organization/test_cases/param_test.html |  | ||||||
| // - https://www.boost.org/doc/libs/1_76_0/libs/test/doc/html/boost_test/tests_organization/test_cases/test_case_generation.html |  | ||||||
| #include <boost/test/included/unit_test.hpp> |  | ||||||
| #include <boost/test/parameterized_test.hpp> |  | ||||||
|  |  | ||||||
| #include <fstream> |  | ||||||
| #include <string> |  | ||||||
| #include <vector> |  | ||||||
|  |  | ||||||
| #include "unpack_pack_fuzzer.cpp" |  | ||||||
|  |  | ||||||
| std::vector<std::string> ListDirectory(const std::string& path) { |  | ||||||
|   std::vector<std::string> v; |  | ||||||
|  |  | ||||||
|   boost::filesystem::path p(path); |  | ||||||
|   boost::filesystem::directory_iterator f(p); |  | ||||||
|  |  | ||||||
|   if (boost::filesystem::is_directory(p)) { |  | ||||||
|     while (f != boost::filesystem::directory_iterator()) { |  | ||||||
|       v.push_back((*f++).path().string()); |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
|   return v; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void UnpackPackFuzzerRegressionTest(const std::string& fpath) { |  | ||||||
|   std::ifstream in(fpath.c_str(), std::ios_base::binary); |  | ||||||
|   if (!in) { |  | ||||||
|     BOOST_FAIL(fpath + " not found"); |  | ||||||
|   } |  | ||||||
|   in.seekg(0, in.end); |  | ||||||
|   size_t length = in.tellg(); |  | ||||||
|   in.seekg(0, in.beg); |  | ||||||
|   std::vector<char> bytes(length); |  | ||||||
|   in.read(bytes.data(), bytes.size()); |  | ||||||
|   BOOST_REQUIRE(in); |  | ||||||
|   BOOST_REQUIRE_EQUAL(0, FuzzerTestOneInput(reinterpret_cast<const uint8_t *>(bytes.data()), bytes.size())); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| boost::unit_test::test_suite* init_unit_test_suite(int /*argc*/, char* /*argv*/[]) |  | ||||||
| { |  | ||||||
|   std::vector<std::string> files = ListDirectory("../../fuzz/unpack_pack_fuzzer_regressions"); |  | ||||||
|   boost::unit_test::framework::master_test_suite().add(BOOST_PARAM_TEST_CASE(&UnpackPackFuzzerRegressionTest, files.begin(), files.end())); |  | ||||||
|   return 0; |  | ||||||
| } |  | ||||||
| @@ -1,23 +0,0 @@ | |||||||
| #include <msgpack.hpp> |  | ||||||
|  |  | ||||||
| extern "C" int FuzzerTestOneInput(const uint8_t *data, size_t size) { |  | ||||||
|   try { |  | ||||||
|     // NOTE(derwolfe): by default the limits are set at 2^32-1 length. I'm |  | ||||||
|     // setting these at far smaller values to avoid OOMs |  | ||||||
|     const int test_limit = 1000; |  | ||||||
|     msgpack::object_handle unpacked = msgpack::unpack(reinterpret_cast<const char *>(data), |  | ||||||
|                                                       size, |  | ||||||
|                                                       MSGPACK_NULLPTR, |  | ||||||
|                                                       MSGPACK_NULLPTR, |  | ||||||
|                                                       msgpack::unpack_limit(test_limit, |  | ||||||
|                                                                             test_limit, |  | ||||||
|                                                                             test_limit, |  | ||||||
|                                                                             test_limit, |  | ||||||
|                                                                             test_limit, |  | ||||||
|                                                                             test_limit)); |  | ||||||
|     msgpack::sbuffer sbuf; |  | ||||||
|     msgpack::pack(sbuf, unpacked.get()); |  | ||||||
|   } catch (...) { |  | ||||||
|   } |  | ||||||
|   return 0; |  | ||||||
| } |  | ||||||
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							| @@ -1 +0,0 @@ | |||||||
| <EFBFBD> |  | ||||||
| @@ -1 +0,0 @@ | |||||||
| <EFBFBD> |  | ||||||
| @@ -1,2 +0,0 @@ | |||||||
| <EFBFBD><01><02><03><04><05><06><07><08>	<09> |  | ||||||
| <EFBFBD><0B><0C> |  | ||||||
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										24
									
								
								include/msgpack.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								include/msgpack.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,24 @@ | |||||||
|  | /* | ||||||
|  |  * MessagePack for C | ||||||
|  |  * | ||||||
|  |  * Copyright (C) 2008-2009 FURUHASHI Sadayuki | ||||||
|  |  * | ||||||
|  |  *    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) | ||||||
|  |  */ | ||||||
|  | /** | ||||||
|  |  * @defgroup msgpack MessagePack C | ||||||
|  |  * @{ | ||||||
|  |  * @} | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #include "msgpack/util.h" | ||||||
|  | #include "msgpack/object.h" | ||||||
|  | #include "msgpack/zone.h" | ||||||
|  | #include "msgpack/pack.h" | ||||||
|  | #include "msgpack/unpack.h" | ||||||
|  | #include "msgpack/sbuffer.h" | ||||||
|  | #include "msgpack/vrefbuffer.h" | ||||||
|  | #include "msgpack/version.h" | ||||||
|  |  | ||||||
| @@ -1,22 +0,0 @@ | |||||||
| // |  | ||||||
| // MessagePack for C++ |  | ||||||
| // |  | ||||||
| // Copyright (C) 2008-2009 FURUHASHI Sadayuki |  | ||||||
| // |  | ||||||
| //    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) |  | ||||||
| // |  | ||||||
| #include "msgpack/object.hpp" |  | ||||||
| #include "msgpack/iterator.hpp" |  | ||||||
| #include "msgpack/zone.hpp" |  | ||||||
| #include "msgpack/pack.hpp" |  | ||||||
| #include "msgpack/null_visitor.hpp" |  | ||||||
| #include "msgpack/parse.hpp" |  | ||||||
| #include "msgpack/unpack.hpp" |  | ||||||
| #include "msgpack/x3_parse.hpp" |  | ||||||
| #include "msgpack/x3_unpack.hpp" |  | ||||||
| #include "msgpack/sbuffer.hpp" |  | ||||||
| #include "msgpack/vrefbuffer.hpp" |  | ||||||
| #include "msgpack/version.hpp" |  | ||||||
| #include "msgpack/type.hpp" |  | ||||||
| @@ -1,19 +0,0 @@ | |||||||
| // |  | ||||||
| // MessagePack for C++ static resolution routine |  | ||||||
| // |  | ||||||
| // Copyright (C) 2015-2016 KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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_ADAPTOR_BASE_HPP |  | ||||||
| #define MSGPACK_ADAPTOR_BASE_HPP |  | ||||||
|  |  | ||||||
| #include "msgpack/adaptor/adaptor_base_decl.hpp" |  | ||||||
|  |  | ||||||
| #include "msgpack/v1/adaptor/adaptor_base.hpp" |  | ||||||
| #include "msgpack/v2/adaptor/adaptor_base.hpp" |  | ||||||
| #include "msgpack/v3/adaptor/adaptor_base.hpp" |  | ||||||
|  |  | ||||||
| #endif // MSGPACK_ADAPTOR_BASE_HPP |  | ||||||
| @@ -1,17 +0,0 @@ | |||||||
| // |  | ||||||
| // MessagePack for C++ static resolution routine |  | ||||||
| // |  | ||||||
| // Copyright (C) 2016 KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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_ADAPTOR_BASE_DECL_HPP |  | ||||||
| #define MSGPACK_ADAPTOR_BASE_DECL_HPP |  | ||||||
|  |  | ||||||
| #include "msgpack/v1/adaptor/adaptor_base_decl.hpp" |  | ||||||
| #include "msgpack/v2/adaptor/adaptor_base_decl.hpp" |  | ||||||
| #include "msgpack/v3/adaptor/adaptor_base_decl.hpp" |  | ||||||
|  |  | ||||||
| #endif // MSGPACK_ADAPTOR_BASE_DECL_HPP |  | ||||||
| @@ -1,17 +0,0 @@ | |||||||
| // |  | ||||||
| // MessagePack for C++ static resolution routine |  | ||||||
| // |  | ||||||
| // Copyright (C) 2008-2016 FURUHASHI Sadayuki and KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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_ARRAY_REF_HPP |  | ||||||
| #define MSGPACK_TYPE_ARRAY_REF_HPP |  | ||||||
|  |  | ||||||
| #include "msgpack/adaptor/array_ref_decl.hpp" |  | ||||||
|  |  | ||||||
| #include "msgpack/v1/adaptor/array_ref.hpp" |  | ||||||
|  |  | ||||||
| #endif // MSGPACK_TYPE_ARRAY_REFL_HPP |  | ||||||
| @@ -1,17 +0,0 @@ | |||||||
| // |  | ||||||
| // MessagePack for C++ static resolution routine |  | ||||||
| // |  | ||||||
| // Copyright (C) 2008-2016 FURUHASHI Sadayuki and KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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_ARRAY_REF_DECL_HPP |  | ||||||
| #define MSGPACK_TYPE_ARRAY_REF_DECL_HPP |  | ||||||
|  |  | ||||||
| #include "msgpack/v1/adaptor/array_ref_decl.hpp" |  | ||||||
| #include "msgpack/v2/adaptor/array_ref_decl.hpp" |  | ||||||
| #include "msgpack/v3/adaptor/array_ref_decl.hpp" |  | ||||||
|  |  | ||||||
| #endif // MSGPACK_TYPE_ARRAY_REF_DECL_HPP |  | ||||||
| @@ -1,15 +0,0 @@ | |||||||
| // |  | ||||||
| // MessagePack for C++ static resolution routine |  | ||||||
| // |  | ||||||
| // Copyright (C) 2008-2016 FURUHASHI Sadayuki and KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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_BOOL_HPP |  | ||||||
| #define MSGPACK_TYPE_BOOL_HPP |  | ||||||
|  |  | ||||||
| #include "msgpack/v1/adaptor/bool.hpp" |  | ||||||
|  |  | ||||||
| #endif // MSGPACK_TYPE_BOOL_HPP |  | ||||||
| @@ -1,15 +0,0 @@ | |||||||
| // |  | ||||||
| // MessagePack for C++ static resolution routine |  | ||||||
| // |  | ||||||
| // Copyright (C) 2015 KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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_BOOST_FUSION_HPP |  | ||||||
| #define MSGPACK_TYPE_BOOST_FUSION_HPP |  | ||||||
|  |  | ||||||
| #include "msgpack/v1/adaptor/boost/fusion.hpp" |  | ||||||
|  |  | ||||||
| #endif // MSGPACK_TYPE_BOOST_FUSION_HPP |  | ||||||
| @@ -1,18 +0,0 @@ | |||||||
| // |  | ||||||
| // MessagePack for C++ static resolution routine |  | ||||||
| // |  | ||||||
| // Copyright (C) 2015-2016 KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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_BOOST_MSGPACK_VARIANT_HPP |  | ||||||
| #define MSGPACK_TYPE_BOOST_MSGPACK_VARIANT_HPP |  | ||||||
|  |  | ||||||
| #include "msgpack/adaptor/boost/msgpack_variant_decl.hpp" |  | ||||||
|  |  | ||||||
| #include "msgpack/v1/adaptor/boost/msgpack_variant.hpp" |  | ||||||
| //#include "msgpack/v2/adaptor/boost/msgpack_variant.hpp" |  | ||||||
|  |  | ||||||
| #endif // MSGPACK_TYPE_BOOST_MSGPACK_VARIANT_HPP |  | ||||||
| @@ -1,17 +0,0 @@ | |||||||
| // |  | ||||||
| // MessagePack for C++ static resolution routine |  | ||||||
| // |  | ||||||
| // Copyright (C) 2016 KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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_BOOST_MSGPACK_VARIANT_DECL_HPP |  | ||||||
| #define MSGPACK_TYPE_BOOST_MSGPACK_VARIANT_DECL_HPP |  | ||||||
|  |  | ||||||
| #include "msgpack/v1/adaptor/boost/msgpack_variant_decl.hpp" |  | ||||||
| #include "msgpack/v2/adaptor/boost/msgpack_variant_decl.hpp" |  | ||||||
| #include "msgpack/v3/adaptor/boost/msgpack_variant_decl.hpp" |  | ||||||
|  |  | ||||||
| #endif // MSGPACK_TYPE_BOOST_MSGPACK_VARIANT_DECL_HPP |  | ||||||
| @@ -1,15 +0,0 @@ | |||||||
| // |  | ||||||
| // MessagePack for C++ static resolution routine |  | ||||||
| // |  | ||||||
| // Copyright (C) 2016 KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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_BOOST_OPTIONAL_HPP |  | ||||||
| #define MSGPACK_TYPE_BOOST_OPTIONAL_HPP |  | ||||||
|  |  | ||||||
| #include "msgpack/v1/adaptor/boost/optional.hpp" |  | ||||||
|  |  | ||||||
| #endif // MSGPACK_TYPE_BOOST_OPTIONAL_HPP |  | ||||||
| @@ -1,15 +0,0 @@ | |||||||
| // |  | ||||||
| // MessagePack for C++ static resolution routine |  | ||||||
| // |  | ||||||
| // Copyright (C) 2016 KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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_BOOST_STRING_REF_HPP |  | ||||||
| #define MSGPACK_TYPE_BOOST_STRING_REF_HPP |  | ||||||
|  |  | ||||||
| #include "msgpack/v1/adaptor/boost/string_ref.hpp" |  | ||||||
|  |  | ||||||
| #endif // MSGPACK_TYPE_BOOST_STRING_REF_HPP |  | ||||||
| @@ -1,15 +0,0 @@ | |||||||
| // |  | ||||||
| // MessagePack for C++ static resolution routine |  | ||||||
| // |  | ||||||
| // Copyright (C) 2017 KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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_BOOST_STRING_VIEW_HPP |  | ||||||
| #define MSGPACK_TYPE_BOOST_STRING_VIEW_HPP |  | ||||||
|  |  | ||||||
| #include "msgpack/v1/adaptor/boost/string_view.hpp" |  | ||||||
|  |  | ||||||
| #endif // MSGPACK_TYPE_BOOST_STRING_VIEW_HPP |  | ||||||
| @@ -1,15 +0,0 @@ | |||||||
| // |  | ||||||
| // MessagePack for C++ static resolution routine |  | ||||||
| // |  | ||||||
| // Copyright (C) 2016 KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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_CARRAY_HPP |  | ||||||
| #define MSGPACK_TYPE_CARRAY_HPP |  | ||||||
|  |  | ||||||
| #include "msgpack/v1/adaptor/carray.hpp" |  | ||||||
|  |  | ||||||
| #endif // MSGPACK_TYPE_CARRAY_HPP |  | ||||||
| @@ -1,15 +0,0 @@ | |||||||
| // |  | ||||||
| // MessagePack for C++ static resolution routine |  | ||||||
| // |  | ||||||
| // Copyright (C) 2016 KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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_CHAR_PTR_HPP |  | ||||||
| #define MSGPACK_TYPE_CHAR_PTR_HPP |  | ||||||
|  |  | ||||||
| #include "msgpack/v1/adaptor/char_ptr.hpp" |  | ||||||
|  |  | ||||||
| #endif // MSGPACK_TYPE_CHAR_PTR_HPP |  | ||||||
| @@ -1,17 +0,0 @@ | |||||||
| // |  | ||||||
| // MessagePack for C++ static resolution routine |  | ||||||
| // |  | ||||||
| // Copyright (C) 2015-2016 KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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_CHECK_CONTAINER_SIZE_HPP |  | ||||||
| #define MSGPACK_CHECK_CONTAINER_SIZE_HPP |  | ||||||
|  |  | ||||||
| #include "msgpack/adaptor/check_container_size_decl.hpp" |  | ||||||
|  |  | ||||||
| #include "msgpack/v1/adaptor/check_container_size.hpp" |  | ||||||
|  |  | ||||||
| #endif // MSGPACK_CHECK_CONTAINER_SIZE_HPP |  | ||||||
| @@ -1,17 +0,0 @@ | |||||||
| // |  | ||||||
| // MessagePack for C++ static resolution routine |  | ||||||
| // |  | ||||||
| // Copyright (C) 2016 KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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_CHECK_CONTAINER_SIZE_DECL_HPP |  | ||||||
| #define MSGPACK_CHECK_CONTAINER_SIZE_DECL_HPP |  | ||||||
|  |  | ||||||
| #include "msgpack/v1/adaptor/check_container_size_decl.hpp" |  | ||||||
| #include "msgpack/v2/adaptor/check_container_size_decl.hpp" |  | ||||||
| #include "msgpack/v3/adaptor/check_container_size_decl.hpp" |  | ||||||
|  |  | ||||||
| #endif // MSGPACK_CHECK_CONTAINER_SIZE_DECL_HPP |  | ||||||
| @@ -1,15 +0,0 @@ | |||||||
| // |  | ||||||
| // MessagePack for C++ static resolution routine |  | ||||||
| // |  | ||||||
| // Copyright (C) 2020 KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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_COMPLEX_HPP |  | ||||||
| #define MSGPACK_TYPE_COMPLEX_HPP |  | ||||||
|  |  | ||||||
| #include "msgpack/v1/adaptor/complex.hpp" |  | ||||||
|  |  | ||||||
| #endif // MSGPACK_TYPE_COMPLEX_HPP |  | ||||||
| @@ -1,16 +0,0 @@ | |||||||
| // |  | ||||||
| // MessagePack for C++ static resolution routine |  | ||||||
| // |  | ||||||
| // Copyright (C) 2016 KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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_CPP11_ARRAY_HPP |  | ||||||
| #define MSGPACK_TYPE_CPP11_ARRAY_HPP |  | ||||||
|  |  | ||||||
| #include "msgpack/v1/adaptor/cpp11/array.hpp" |  | ||||||
|  |  | ||||||
| #endif // MSGPACK_TYPE_CPP11_ARRAY_HPP |  | ||||||
| @@ -1,16 +0,0 @@ | |||||||
| // |  | ||||||
| // MessagePack for C++ static resolution routine |  | ||||||
| // |  | ||||||
| // Copyright (C) 2016 KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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_CPP11_ARRAY_CHAR_HPP |  | ||||||
| #define MSGPACK_TYPE_CPP11_ARRAY_CHAR_HPP |  | ||||||
|  |  | ||||||
| #include "msgpack/v1/adaptor/cpp11/array_char.hpp" |  | ||||||
|  |  | ||||||
| #endif // MSGPACK_TYPE_CPP11_ARRAY_CHAR_HPP |  | ||||||
| @@ -1,16 +0,0 @@ | |||||||
| // |  | ||||||
| // MessagePack for C++ static resolution routine |  | ||||||
| // |  | ||||||
| // Copyright (C) 2016 KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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_CPP11_ARRAY_UNSIGNED_CHAR_HPP |  | ||||||
| #define MSGPACK_TYPE_CPP11_ARRAY_UNSIGNED_CHAR_HPP |  | ||||||
|  |  | ||||||
| #include "msgpack/v1/adaptor/cpp11/array_unsigned_char.hpp" |  | ||||||
|  |  | ||||||
| #endif // MSGPACK_TYPE_CPP11_ARRAY_UNSIGNED_CHAR_HPP |  | ||||||
| @@ -1,16 +0,0 @@ | |||||||
| // |  | ||||||
| // MessagePack for C++ static resolution routine |  | ||||||
| // |  | ||||||
| // Copyright (C) 2017 KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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_CPP11_CHRONO_HPP |  | ||||||
| #define MSGPACK_TYPE_CPP11_CHRONO_HPP |  | ||||||
|  |  | ||||||
| #include "msgpack/v1/adaptor/cpp11/chrono.hpp" |  | ||||||
|  |  | ||||||
| #endif // MSGPACK_TYPE_CPP11_CHRONO_HPP |  | ||||||
| @@ -1,16 +0,0 @@ | |||||||
| // |  | ||||||
| // MessagePack for C++ static resolution routine |  | ||||||
| // |  | ||||||
| // Copyright (C) 2016 KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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_CPP11_FORWARD_LIST_HPP |  | ||||||
| #define MSGPACK_TYPE_CPP11_FORWARD_LIST_HPP |  | ||||||
|  |  | ||||||
| #include "msgpack/v1/adaptor/cpp11/forward_list.hpp" |  | ||||||
|  |  | ||||||
| #endif // MSGPACK_TYPE_CPP11_FORWARD_LIST_HPP |  | ||||||
| @@ -1,16 +0,0 @@ | |||||||
| // |  | ||||||
| // MessagePack for C++ static resolution routine |  | ||||||
| // |  | ||||||
| // Copyright (C) 2016 KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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_CPP11_REFERENCE_WRAPPER_HPP |  | ||||||
| #define MSGPACK_TYPE_CPP11_REFERENCE_WRAPPER_HPP |  | ||||||
|  |  | ||||||
| #include "msgpack/v1/adaptor/cpp11/reference_wrapper.hpp" |  | ||||||
|  |  | ||||||
| #endif // MSGPACK_TYPE_CPP11_REFERENCE_WRAPPER_HPP |  | ||||||
| @@ -1,16 +0,0 @@ | |||||||
| // |  | ||||||
| // MessagePack for C++ static resolution routine |  | ||||||
| // |  | ||||||
| // Copyright (C) 2016 KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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_CPP11_SHARED_PTR_HPP |  | ||||||
| #define MSGPACK_TYPE_CPP11_SHARED_PTR_HPP |  | ||||||
|  |  | ||||||
| #include "msgpack/v1/adaptor/cpp11/shared_ptr.hpp" |  | ||||||
|  |  | ||||||
| #endif // MSGPACK_TYPE_CPP11_SHARED_PTR_HPP |  | ||||||
| @@ -1,16 +0,0 @@ | |||||||
| // |  | ||||||
| // MessagePack for C++ static resolution routine |  | ||||||
| // |  | ||||||
| // Copyright (C) 2019 KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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_CPP11_TIMESPEC_HPP |  | ||||||
| #define MSGPACK_TYPE_CPP11_TIMESPEC_HPP |  | ||||||
|  |  | ||||||
| #include "msgpack/v1/adaptor/cpp11/timespec.hpp" |  | ||||||
|  |  | ||||||
| #endif // MSGPACK_TYPE_CPP11_TIMESPEC_HPP |  | ||||||
| @@ -1,16 +0,0 @@ | |||||||
| // |  | ||||||
| // MessagePack for C++ static resolution routine |  | ||||||
| // |  | ||||||
| // Copyright (C) 2016 KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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_CPP11_TUPLE_HPP |  | ||||||
| #define MSGPACK_TYPE_CPP11_TUPLE_HPP |  | ||||||
|  |  | ||||||
| #include "msgpack/v1/adaptor/cpp11/tuple.hpp" |  | ||||||
|  |  | ||||||
| #endif // MSGPACK_TYPE_CPP11_TUPLE_HPP |  | ||||||
| @@ -1,16 +0,0 @@ | |||||||
| // |  | ||||||
| // MessagePack for C++ static resolution routine |  | ||||||
| // |  | ||||||
| // Copyright (C) 2016 KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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_CPP11_UNIQUE_PTR_HPP |  | ||||||
| #define MSGPACK_TYPE_CPP11_UNIQUE_PTR_HPP |  | ||||||
|  |  | ||||||
| #include "msgpack/v1/adaptor/cpp11/unique_ptr.hpp" |  | ||||||
|  |  | ||||||
| #endif // MSGPACK_TYPE_CPP11_UNIQUE_PTR_HPP |  | ||||||
| @@ -1,16 +0,0 @@ | |||||||
| // |  | ||||||
| // MessagePack for C++ static resolution routine |  | ||||||
| // |  | ||||||
| // Copyright (C) 2016 KONDO Takatoshi |  | ||||||
| // |  | ||||||
| //    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_CPP11_UNORDERED_MAP_HPP |  | ||||||
| #define MSGPACK_TYPE_CPP11_UNORDERED_MAP_HPP |  | ||||||
|  |  | ||||||
| #include "msgpack/v1/adaptor/cpp11/unordered_map.hpp" |  | ||||||
|  |  | ||||||
| #endif // MSGPACK_TYPE_CPP11_UNORDERED_MAP_HPP |  | ||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user