Compare commits

..

10 Commits

Author SHA1 Message Date
Takatoshi Kondo
7df967142d Merge pull request #439 from redboltz/ver1.4.1
Updated the version to 1.4.1.
2016-03-06 20:30:15 +09:00
Takatoshi Kondo
437400c6fe Updated the version to 1.4.1. 2016-03-06 19:54:33 +09:00
Takatoshi Kondo
ae8de13ab6 Merge pull request #438 from redboltz/bp_436
Backported #436 to version 1.4.0.
2016-03-06 18:49:20 +09:00
Takatoshi Kondo
39433e8588 Merge pull request #437 from redboltz/bp_435
Backported #435 to version 1.4.0.
2016-03-06 18:48:52 +09:00
Takatoshi Kondo
94c9bc2ddc Backported #436 to version 1.4.0. 2016-03-06 14:19:10 +09:00
Takatoshi Kondo
1088aa55af Backported #435 to version 1.4.0. 2016-03-06 13:40:40 +09:00
Takatoshi Kondo
66a5fcf8f1 Merge pull request #428 from redboltz/bp_426_1.4
Backported #426 to version 1.4.0.
2016-02-21 00:04:51 +09:00
Takatoshi Kondo
bb0617bd47 Merge pull request #427 from redboltz/bp_423_to_1.4
Backported #423 to version 1.4.0.
2016-02-21 00:03:54 +09:00
Takatoshi Kondo
f642b70e6a Backported #426 to version 1.4.0. 2016-02-20 19:09:18 +09:00
Takatoshi Kondo
3f4ffb9386 Backported #423 to version 1.4.0. 2016-02-20 18:50:13 +09:00
625 changed files with 23575 additions and 41734 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -1,73 +0,0 @@
name: coverage
on:
pull_request:
types: [opened, synchronize]
push:
branches:
- cpp_master
tags:
- '*'
jobs:
codecov:
timeout-minutes: 30
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: Install build dependencies
run: |
sudo apt-get update
sudo apt-get install g++-10 cmake lcov -y
./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
run: |
mkdir build
cmake \
-D MSGPACK_CXX20=ON \
-D MSGPACK_32BIT=OFF \
-D MSGPACK_CHAR_SIGN=signed \
-D MSGPACK_USE_X3_PARSE=ON \
-D MSGPACK_BUILD_EXAMPLES=ON \
-D MSGPACK_BUILD_TESTS=ON \
-D CMAKE_BUILD_TYPE=Debug \
-D MSGPACK_GEN_COVERAGE=ON \
-D CMAKE_PREFIX_PATH="$HOME/zlib-prefix/64;$HOME/boost-prefix/64" \
-B build \
-S . || exit 1
cmake --build build --target all || exit 1
ctest --test-dir build || exit 1
- name: Upload coverage to Codecov
working-directory: build
run: |
# Create lcov report
lcov --capture --directory . --output-file coverage.info
lcov --remove coverage.info '/usr/*' --output-file coverage.info # filter system-files
lcov --list coverage.info # debug info
# Uploading report to CodeCov
bash <(curl -s https://codecov.io/bash) -f coverage.info || echo "Codecov did not collect coverage reports"

View File

@@ -1,237 +0,0 @@
name: CI
on:
pull_request:
types: [opened, synchronize]
push:
branches:
- cpp_master
tags:
- '*'
jobs:
macos:
name: ${{ format('macOS (pattern {0})', matrix.pattern) }}
runs-on: macos-latest
strategy:
fail-fast: false
matrix:
pattern: [0, 1, 2, 3, 4]
steps:
- uses: actions/checkout@v2
- 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 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
run: |
# default configuration - overwrite its params later depending on matrix.pattern
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
0)
export MSGPACK_CXX_VERSION="MSGPACK_CXX11=OFF"
;;
1)
export API_VERSION=1
;;
2)
export API_VERSION=2
;;
3)
export X3_PARSE="ON"
;;
4)
export CHAR_SIGN="unsigned"
;;
esac
# build and test
export CXX="clang++"
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:
name: ${{ format('Linux (pattern {0})', matrix.pattern) }}
runs-on: ubuntu-20.04
strategy:
fail-fast: false
matrix:
pattern: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
steps:
- uses: actions/checkout@v2
- name: Install build dependencies
shell: bash
run: |
sudo apt-get update
sudo apt-get install g++-10 cmake valgrind -y
sudo apt-get install g++-10-multilib -y # for 32-bit compile
./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
run: |
# default configuration - overwrite its params later depending on matrix.pattern
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
0)
export CXX="clang++-10"
export MSGPACK_CXX_VERSION="MSGPACK_CXX11=OFF"
;;
1)
export CXX="g++-10"
export MSGPACK_CXX_VERSION="MSGPACK_CXX11=ON"
;;
2)
export CXX="clang++-10"
export MSGPACK_CXX_VERSION="MSGPACK_CXX14=ON"
;;
3)
export CXX="g++-10"
export MSGPACK_CXX_VERSION="MSGPACK_CXX17=ON"
;;
4)
export CXX="clang++-10"
export MSGPACK_CXX_VERSION="MSGPACK_CXX20=ON"
export NO_BOOST="-DMSGPACK_NO_BOOST"
;;
5)
export CXX="g++-10"
export ARCH=32
;;
6)
export CXX="clang++-10"
export API_VERSION=2
;;
7)
export CXX="g++-10"
export API_VERSION=1
;;
8)
export CXX="clang++-10"
export CHAR_SIGN="unsigned"
;;
9)
export CXX="g++-10"
export X3_PARSE="ON"
;;
10)
export CXX="clang++-10"
export ACTION="ci/build_regression.sh"
;;
11)
export CXX="g++-10"
export ARCH=32
export CHAR_SIGN="unsigned"
export X3_PARSE="ON"
;;
esac
# build and test
CMAKE_CXX_COMPILER="$CXX" CXXFLAGS="-Werror -g ${SANITIZE} ${NO_BOOST}" 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
windows:
name: ${{ format('Windows cxx{0}', matrix.cxx) }}
runs-on: windows-2019
strategy:
fail-fast: false
matrix:
# MSVC2019 only supports /std:c++14, /std:c++17 and /std:c++latest
cxx: [14, 17, 20]
steps:
- uses: actions/checkout@v2
- name: Cache vcpkg dependencies
id: cache-vcpkg
uses: actions/cache@v2
with:
path: C:/vcpkg/installed/x64-windows
key: ${{ runner.os }}-vcpkg-2021-08-09
- name: Install vcpkg dependencies
if: steps.cache-vcpkg.outputs.cache-hit != 'true'
shell: powershell
run: |
vcpkg update
vcpkg install zlib:x64-windows
vcpkg install boost-assert:x64-windows boost-numeric-conversion:x64-windows boost-variant:x64-windows boost-utility:x64-windows boost-fusion:x64-windows boost-optional:x64-windows boost-predef:x64-windows boost-preprocessor:x64-windows boost-timer:x64-windows boost-test:x64-windows
- name: Build and test
shell: powershell
run: |
$CPPVER="MSGPACK_CXX${{ matrix.cxx }}=ON"
md build
cmake `
-A x64 `
-G "Visual Studio 16 2019" `
-D CMAKE_TOOLCHAIN_FILE="C:/vcpkg/scripts/buildsystems/vcpkg.cmake" `
-D MSGPACK_BUILD_TESTS=ON `
-D $CPPVER `
-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" `
-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 }

6
.gitmodules vendored Normal file
View File

@@ -0,0 +1,6 @@
[submodule "external/boost/predef"]
path = external/boost/predef
url = https://github.com/boostorg/predef.git
[submodule "external/boost/preprocessor"]
path = external/boost/preprocessor
url = https://github.com/boostorg/preprocessor.git

91
.travis.yml Normal file
View File

@@ -0,0 +1,91 @@
language: cpp
os:
- linux
- osx
cache:
- apt
compiler:
- clang
- gcc
os:
- osx
- linux
before_install:
- if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test; fi
- if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo add-apt-repository -y ppa:h-rayflood/llvm-upper; fi
- if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get update -qq; fi
- if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get update; fi
install:
- if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get install -qq gcc-4.8-multilib g++-4.8-multilib; fi
- if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get install --allow-unauthenticated -qq clang-3.6; fi
- if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 90; fi
- if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 90; fi
- if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get install -y lib32gcc1; fi
- if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get install -y libc6-i386; fi
- if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get install -y lib32z1-dev; fi
- if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get install -y lib32stdc++6; fi
- if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get install -y bzip2; fi
- if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get install -y libc6-dbg; fi
- wget https://googletest.googlecode.com/files/gtest-1.7.0.zip
- wget http://valgrind.org/downloads/valgrind-3.10.1.tar.bz2 && tar xjf valgrind-3.10.1.tar.bz2 && cd valgrind-3.10.1 && ./configure && make && sudo make install && cd ..
- if [ "$TRAVIS_OS_NAME" == "osx" ]; then brew unlink boost; fi
- if [ "$BOOST" == "boost" ]; then wget http://sourceforge.net/projects/boost/files/boost/1.58.0/boost_1_58_0.zip && unzip -q boost_1_58_0.zip && cd boost_1_58_0 && ./bootstrap.sh && ./b2 --with-timer --with-chrono address-model="$ARCH" > /dev/null && sudo ./b2 --with-timer --with-chrono address-model="$ARCH" install > /dev/null && cd ..; fi
- if [ "$TRAVIS_OS_NAME" == "linux" ]; then unzip -q gtest-1.7.0.zip && cd gtest-1.7.0 && sudo cp -r include/gtest /usr/local/include && g++ src/gtest-all.cc -I. -Iinclude -c && g++ src/gtest_main.cc -I. -Iinclude -c && ar -rv libgtest.a gtest-all.o && ar -rv libgtest_main.a gtest_main.o && sudo mv *.a /usr/local/lib && g++ -m32 src/gtest-all.cc -I. -Iinclude -c && g++ -m32 src/gtest_main.cc -I. -Iinclude -c && ar -rv libgtest.a gtest-all.o && ar -rv libgtest_main.a gtest_main.o && sudo mkdir /usr/local/lib32 && sudo mv *.a /usr/local/lib32 && cd ..; fi
- if [ "$TRAVIS_OS_NAME" == "osx" ]; then unzip -q gtest-1.7.0.zip && cd gtest-1.7.0 && sudo cp -r include/gtest /usr/local/include && clang++ src/gtest-all.cc -I. -Iinclude -c && g++ src/gtest_main.cc -I. -Iinclude -c && ar -rv libgtest.a gtest-all.o && ar -rv libgtest_main.a gtest_main.o && sudo mv *.a /usr/local/lib && cd ..; fi
env:
- ACTION="ci/build_autotools.sh" VERSION="cpp03" ARCH="64" LIBPATH="/usr/local/lib" BOOST="boost" BOOST_INC="/usr/local/boost" CHAR_SIGN="unsigned"
- ACTION="ci/build_autotools.sh" VERSION="cpp03" ARCH="32" LIBPATH="/usr/local/lib32" BOOST="" BOOST_INC="" CHAR_SIGN="signed"
- ACTION="ci/build_cmake.sh" VERSION="cpp11" ARCH="64" LIBPATH="/usr/local/lib" BOOST="boost" BOOST_INC="/usr/local/boost" CHAR_SIGN="signed"
- ACTION="ci/build_cmake.sh" VERSION="cpp11" ARCH="32" LIBPATH="/usr/local/lib32" BOOST="" BOOST_INC="" SHARED="OFF" CHAR_SIGN="unsigned"
- ACTION="ci/build_autotools.sh" VERSION="cpp11" ARCH="64" LIBPATH="/usr/local/lib" BOOST="" BOOST_INC="" CHAR_SIGN="signed"
- ACTION="ci/build_autotools.sh" VERSION="cpp11" ARCH="32" LIBPATH="/usr/local/lib32" BOOST="boost" BOOST_INC="/usr/local/boost" CHAR_SIGN="unsigned"
- ACTION="ci/build_cmake.sh" VERSION="cpp03" ARCH="64" LIBPATH="/usr/local/lib" BOOST="" BOOST_INC="" CHAR_SIGN="unsigned"
- ACTION="ci/build_cmake.sh" VERSION="cpp03" ARCH="32" LIBPATH="/usr/local/lib32" BOOST="boost" BOOST_INC="/usr/local/boost" SHARED="OFF" CHAR_SIGN="signed"
before_script:
- export PATH=/usr/local/bin:$PATH && rm -rf install
matrix:
exclude:
- os: osx
compiler: gcc
- os: osx
env: ACTION="ci/build_autotools.sh" VERSION="cpp03" ARCH="32" LIBPATH="/usr/local/lib32" BOOST="" BOOST_INC="" CHAR_SIGN="signed"
- os: osx
env: ACTION="ci/build_cmake.sh" VERSION="cpp11" ARCH="32" LIBPATH="/usr/local/lib32" BOOST="" BOOST_INC="" SHARED="OFF" CHAR_SIGN="unsigned"
- os: osx
env: ACTION="ci/build_autotools.sh" VERSION="cpp11" ARCH="32" LIBPATH="/usr/local/lib32" BOOST="boost" BOOST_INC="/usr/local/boost" CHAR_SIGN="unsigned"
- os: osx
env: ACTION="ci/build_cmake.sh" VERSION="cpp03" ARCH="32" LIBPATH="/usr/local/lib32" BOOST="boost" BOOST_INC="/usr/local/boost" SHARED="OFF" CHAR_SIGN="signed"
- os: linux
compiler: gcc
env: ACTION="ci/build_autotools.sh" VERSION="cpp03" ARCH="64" LIBPATH="/usr/local/lib" BOOST="boost" BOOST_INC="/usr/local/boost" CHAR_SIGN="unsigned"
- os: linux
compiler: gcc
env: ACTION="ci/build_autotools.sh" VERSION="cpp03" ARCH="32" LIBPATH="/usr/local/lib32" BOOST="" BOOST_INC="" CHAR_SIGN="signed"
- os: linux
compiler: gcc
env: ACTION="ci/build_cmake.sh" VERSION="cpp11" ARCH="64" LIBPATH="/usr/local/lib" BOOST="boost" BOOST_INC="/usr/local/boost" CHAR_SIGN="signed"
- os: linux
compiler: gcc
env: ACTION="ci/build_cmake.sh" VERSION="cpp11" ARCH="32" LIBPATH="/usr/local/lib32" BOOST="" BOOST_INC="" SHARED="OFF" CHAR_SIGN="unsigned"
- os: linux
compiler: clang
env: ACTION="ci/build_autotools.sh" VERSION="cpp11" ARCH="64" LIBPATH="/usr/local/lib" BOOST="" BOOST_INC="" CHAR_SIGN="signed"
- os: linux
compiler: clang
env: ACTION="ci/build_autotools.sh" VERSION="cpp11" ARCH="32" LIBPATH="/usr/local/lib32" BOOST="boost" BOOST_INC="/usr/local/boost" CHAR_SIGN="unsigned"
- os: linux
compiler: clang
env: ACTION="ci/build_cmake.sh" VERSION="cpp03" ARCH="64" LIBPATH="/usr/local/lib" BOOST="" BOOST_INC="" CHAR_SIGN="unsigned"
- os: linux
compiler: clang
env: ACTION="ci/build_cmake.sh" VERSION="cpp03" ARCH="32" LIBPATH="/usr/local/lib32" BOOST="boost" BOOST_INC="/usr/local/boost" SHARED="OFF" CHAR_SIGN="signed"
script:
- git clean -xdf && CMAKE_LIBRARY_PATH=${LIBPATH} ${ACTION} ${VERSION} ${ARCH} ${BOOST} ${BOOST_INC} ${CHAR_SIGN}

View File

@@ -1,228 +1,9 @@
# 2022-03-09 version 4.1.1 for C++
* Remove chrono support on `MSGPACK_NO_BOOST` to fix compile error.
* Improve build system (#1003)
# 2016-03-06 version 1.4.1
# 2022-02-12 version 4.1.0 for C++
* Add experimental support for no boost dependency (#1001)
* For cmake, add `-DMSGPACK_USE_BOOST=OFF`. For C++ compiler add `-DMSGPACK_NO_BOOST`.
* Improve BIN console output (#995)
* Fix include notation (#991)
# 2021-10-23 version 4.0.3 for C++
* Remove Enabler2 template parameter from object adaptor (#987)
* Add MSGPACK_BUILD_DOCS cmake option (#983, #984)
# 2021-08-31 version 4.0.2 for C++
* Fix fuzzer interface function name (#972)
* Fix boost test link error and support both dynamin(default) and static link boost (#971)
# 2021-08-30 version 4.0.1 for C++
* Fix release tarball and its generation script (#967)
# 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 >>
* Separate C++ part of the msgpack-c from C/C++ mixed msgpack-c (#876, #878)
* Require boost libraries. See README.md Dependency(#912)
# 2020-06-05 version 3.3.0
* Add json example for C (#870)
* Add both header and body packing functions for C (#870)
* Set default ref_size and chunk_size to vrefbuffer (#865)
* Add examples (#861)
* Improve build system (#839, #842)
* Improve tests (#829)
* Improve documents (#828)
* Remove some warnings (#827, #851, #871)
* Improve CI environment (#824, #831, #833, #834, #846, #860, 874)
# 2019-12-10 version 3.2.1
* Fix snprintf return value checking (#821)
* Remove some warnings (#819)
* Fix fbuffer result checking (#812)
* Fix temporary object handling (#807)
* Improve cmake support (#804)
* Fix invalid `int main` parameter (#800)
* Improve supporting platform (#797, #817)
* Fix ZLIB error handling (#795)
* Remove unused variable (#793)
* Improve integer overflow checking (#792)
# 2019-05-27 version 3.2.0
* Fix invalid include (#783)
* Add timespec support (#781)
* Fix unchecked fnprintf on C (#780)
* Improve integer overflow checking on C (#776)
* Fix warnings on `-Wconversion` (#770, #777, #784)
* Fix invalid passed by value on aligned_zone_size_visitor (#764)
* Improve windows support (#757, #779)
* Fix msgpack::object size caluclation error (#754)
* Fix memory error on example code (#753)
* Fix redundant memory allocation on C (#747)
* Fix msgpack::type::tuple base class conversion (#743)
# 2018-09-09 version 3.1.1
* Add force endian set functionality (#736)
* Fix vrefbuffer memory management problem (#733)
* Fix msvc specific problem (#731, #732)
* Update boost from 1.61.0 to 1.68.0 (#730)
* Fix msgpack_timestamp type mismatch bug (#726)
# 2018-08-10 version 3.1.0
* Improve documents (#687, #718)
* Add fuzzer support (#689)
* Fix msgpack::object union member access bug (#694)
* Improve cross platform configuration (#704)
* Fix out of range dereference bug of EXT (#705)
* Add timestamp support. std::chrono::system_clock::time_point is mapped to TIMESTAMP (#706)
* Add minimal timestamp support for C. The type `msgpack_timestamp` and the function `msgpack_object_to_timestamp()` are introduced (#707)
* Improve MSGPACK_DEFINE family name confliction probability (#710)
* Add no static-library build option (BUILD_SHARED_LIBS=ON) (#713, #717, #722)
* Add header only cmake target (#721)
* Add `std::byte` adaptor (#719)
* Remove some warnings (#720)
# 2018-05-12 version 3.0.1
* Add fuzz directory to release tar ball (#686)
* Add include file checking for X-Code (#683)
# 2018-05-09 version 3.0.0
## << breaking changes >>
* Change offset parameter updating rule. If parse error happens, offset is updated to the error position. (#639, #666)
## << other updates >>
* Improve cross platform configuration (#655, #677)
* Improve build system (#647)
* Improve user class adaptor (#645, #673)
* Improve msgpack::object visitation logic (#676)
* Remove some warnings (#641, 659)
* Add `->` and `*` operators to object_handle (#635)
* Improve CI environment (#631, #634, #643, #657, #662, #668)
* Improve documents (#630, #661)
* Refactoring (#670)
* Add OSS-Fuzz support (#672, #674, #675, #678)
# 2017-08-04 version 2.1.5
* Improve cross platform configuration (#624)
* Add boost asio examples (including zlib) (#610)
* Remove some warnings (#611)
* Fix unpack visitor to treat float32/64 correctly (#613)
* Improve documents (#616)
* Fix alignment problem on some platform (#617, #518)
* Fix conflict std::tuple, std::pair, and boost::fusion::sequence problem (#619)
# 2017-08-03 version 2.1.4 (Invalid)
* See https://github.com/msgpack/msgpack-c/issues/623
# 2017-06-15 version 2.1.3
* Improve build system (#603)
* Add C++17 adaptors `std::optional` and `std::string_view`. (#607, #608)
* Improve cross platform configuration (#601)
* Remove some warnings (#599, #602, #605)
# 2017-06-07 version 2.1.2
* Improve documents (#565)
* Fix empty map parse bug (#568)
* Improve build system (#569, #570, #572, #579, #591, #592)
* Remove some warnings (#574, #578, #586, #588)
* Improve cross platform configuration (#577, #582)
* Add cmake package config support (#580)
* Fix streaming unpack bug (#585)
# 2017-02-04 version 2.1.1
* Fix unpacker's buffer management bug (#561)
* Add boost string_view adaptor (#558)
* Remove some warnings (#557, #559)
* Improve coding style (#556)
# 2017-01-10 version 2.1.0
## << breaking changes >>
* Fix object internal data type is float if msgpack format is float32 (#531)
## << recommended changes >>
* Add `FLOAT64` type. Please use it instead of `DOUBLE` (#531)
* Add `FLOAT32` type. Please use it instead of `FLOAT` (#531)
## << other updates >>
* Add iterator based parse/unpack function(experimental) (#553)
* Add `[[deprecated]]` attribute for C++14 (#552)
* Fix `msgpack_unpack()` return code (#548)
* Fix integer overflow (#547, #549, #550)
* Add example codes (#542)
* Add MSGPACK_NVP. You can use not only variable name but also any strings (#535)
* Fix and Improve build system (#532, #545)
* Fix `gcc_atomic.hpp` include path (#529, #530)
* Improve CI environment (#526)
* Improve documents (#524)
* Add msgpack_unpacker_next_with_size() function (#515)
* Fix `as()` applying condition (#511)
* Fix fbuffer write (#504)
* Add gcc bug workaround (#499)
* Improve object print (#497, #500, #505, #533)
* Remove some warnings (#495, #506, #508, #513, #528, #538, #545)
# 2016-06-25 version 2.0.0
## << breaking changes >>
* Removed autotools support. Use cmake instead (#476, #479)
* Removed pointer version of msgpack::unpack APIs. Use reference version instead (#453)
* Removed MSGPACK_DISABLE_LEGACY_CONVERT. msgpack::object::convert(T*) is removed by default. Use msgpack::object::convert(T&) instead (#451)
* Removed msgpacl::type::nil. Use nil_t or define MSGPACK_USE_LECACY_NIL (#444)
* Removed std::string to msgpack::object conversion (#434)
## << recommended changes >>
* Replaced msgpack::unpacked with msgpack::object_handle. msgpack::unpacked is kept as a typedef of msgpack::object_handle. (#448)
## << other updates >>
* Add strict size checking adaptor. Relaxed tuple conversion (#489)
* Fix and Improve example codes (#487)
* Add C++/CLI support for nullptr (#481)
* Update the boost libraries that are contained by msgpack-c (#475)
* Fix gcc_atomic.hpp location (#474)
* Add C-Style array support (#466, #488)
* Fix include file dependency (#464)
* Add a visitor version of unpack API (#461)
* Fix JSON string conversion from "nil" to "null" (#458)
* Fix and Improve build system (#455, #471, #473, #486, #491)
* Fix comments (#452)
* Fix unintentional msgpack::zone moving problem (#447)
* Fix operator>> and << for msgpack::object (#443)
* Fix C++03 msgpack::zone::clear() memory access violation bug (#441)
* Fix TARGET_OS_IPHONE checking (#436)
* Fix invalid front() call for empty container (#435)
* Fix compile error on g++6 (C++11 only) (#426, #430)
* Fix zone size expansion logic (#423)
* Fix wrong hader file dependency (#421)
* Fix msvc specific problem (#420)
* Add v2 API support (#415)
* Fix TARGET_OS_IPHONE checking (#436, #438)
* Fix invalid front() call for empty container (#435. #437)
* Fix compile error on g++6 (C++11 only) (#426, #428)
* Fix zone size expansion logic (#423, #427)
# 2016-01-22 version 1.4.0

View File

@@ -1,10 +1,7 @@
CMAKE_MINIMUM_REQUIRED (VERSION 3.1 FATAL_ERROR)
CMAKE_MINIMUM_REQUIRED (VERSION 2.8.6)
PROJECT (msgpack)
CMAKE_POLICY (SET CMP0054 NEW)
PROJECT (msgpack LANGUAGES CXX)
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})
SET (VERSION_MAJOR ${CMAKE_MATCH_1})
STRING (REGEX MATCH "#define MSGPACK_VERSION_MINOR *([0-9a-zA-Z_]*)" NULL_OUT ${contents})
@@ -13,87 +10,118 @@ STRING (REGEX MATCH "#define MSGPACK_VERSION_REVISION *([0-9a-zA-Z_]*)" NULL_OUT
SET (VERSION_REVISION ${CMAKE_MATCH_1})
SET (VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION})
LIST (APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake/")
SET (prefix ${CMAKE_INSTALL_PREFIX})
SET (exec_prefix "\${prefix}")
SET (libdir "\${exec_prefix}/lib")
SET (includedir "\${prefix}/include")
SET (GNUCXX_STD_SUPPORT_VERSION "4.3")
SET (GNUCXX_NO_MISMATCHED_TAGS_SUPPORT_VERSION "4.4")
OPTION (MSGPACK_CXX11 "Using c++11 compiler" 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)
OPTION (MSGPACK_BOOST "Using boost libraries" OFF)
OPTION (MSGPACK_32BIT "32bit compile" OFF)
OPTION (MSGPACK_USE_BOOST "Use Boost libraried" ON)
OPTION (MSGPACK_USE_X3_PARSE "Use Boost X3 parse" OFF)
OPTION (MSGPACK_BUILD_TESTS "Build tests" OFF)
OPTION (MSGPACK_BUILD_DOCS "Build Doxygen documentation" ON)
OPTION (MSGPACK_FUZZ_REGRESSION "Enable regression testing" OFF)
OPTION (MSGPACK_BUILD_EXAMPLES "Build msgpack examples" OFF)
OPTION (MSGPACK_GEN_COVERAGE "Generate coverage report" OFF)
OPTION (MSGPACK_USE_STATIC_BOOST "Statically link with boost libraries" OFF)
OPTION (MSGPACK_CHAR_SIGN "Char sign to use (signed or unsigned)")
SET (CMAKE_CXX_FLAGS "-DMSGPACK_DISABLE_LEGACY_NIL ${CMAKE_CXX_FLAGS}")
SET (CMAKE_CXX_FLAGS "-DMSGPACK_DISABLE_LEGACY_CONVERT ${CMAKE_CXX_FLAGS}")
SET (CMAKE_CXX_STANDARD_REQUIRED ON)
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")
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 ()
SET (CMAKE_CXX_FLAGS "-DMSGPACK_USE_X3_PARSE ${CMAKE_CXX_FLAGS}")
ENDIF ()
IF (MSGPACK_CXX20)
SET (CMAKE_CXX_STANDARD 20)
ELSEIF (MSGPACK_CXX17)
SET (CMAKE_CXX_STANDARD 17)
ELSEIF (MSGPACK_CXX14)
SET (CMAKE_CXX_STANDARD 14)
ELSEIF (MSGPACK_CXX11)
SET (CMAKE_CXX_STANDARD 11)
IF (MSGPACK_CXX11)
IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
SET (CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}")
ELSEIF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
SET (CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}")
ELSEIF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
IF (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 19)
MESSAGE ( FATAL_ERROR "MSVC doesn't support C++11.")
ENDIF ()
ENDIF ()
ELSE ()
SET (CMAKE_CXX_STANDARD 98)
IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
IF ((CMAKE_CXX_COMPILER_VERSION VERSION_GREATER ${GNUCXX_STD_SUPPORT_VERSION}) OR
(CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL ${GNUCXX_STD_SUPPORT_VERSION}))
SET (CMAKE_CXX_FLAGS "-std=c++03 ${CMAKE_CXX_FLAGS}")
ENDIF ()
ELSEIF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
SET (CMAKE_CXX_FLAGS "-std=c++03 ${CMAKE_CXX_FLAGS}")
ELSEIF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
IF (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 18)
SET (CMAKE_CXX_FLAGS "-DMSGPACK_USE_CPP03 ${CMAKE_CXX_FLAGS}")
ENDIF ()
ENDIF ()
ENDIF ()
IF (MSGPACK_32BIT)
IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
SET (CMAKE_CXX_FLAGS "-m32 ${CMAKE_CXX_FLAGS}")
SET (CMAKE_EXE_LINKER_FLAGS "-m32 ${CMAKE_EXE_LINKER_FLAGS}")
ELSEIF ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
SET (CMAKE_CXX_FLAGS "-m32 ${CMAKE_CXX_FLAGS}")
SET (CMAKE_EXE_LINKER_FLAGS "-m32 ${CMAKE_EXE_LINKER_FLAGS}")
ENDIF ()
IF ("${CMAKE_CXX_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}")
ELSEIF ("${CMAKE_CXX_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}")
ENDIF ()
ENDIF ()
IF (MSGPACK_USE_BOOST)
SET (Boost_USE_MULTITHREADED ON)
IF (MSGPACK_USE_STATIC_BOOST)
MESSAGE (STATUS "Staticly linking with Boost")
SET (Boost_USE_STATIC_LIBS TRUE)
ELSE ()
MESSAGE (STATUS "Dynamically linking with Boost")
SET (Boost_USE_STATIC_LIBS FALSE)
ENDIF ()
FIND_PACKAGE (Boost REQUIRED)
ELSE ()
SET (CMAKE_CXX_FLAGS "-DMSGPACK_NO_BOOST ${CMAKE_CXX_FLAGS}")
IF (MSGPACK_BOOST)
SET (CMAKE_CXX_FLAGS "-DMSGPACK_USE_BOOST ${CMAKE_CXX_FLAGS}")
SET (Boost_USE_STATIC_LIBS ON) # only find static libs
SET (Boost_USE_MULTITHREADED ON)
SET (Boost_USE_STATIC_RUNTIME OFF)
FIND_PACKAGE (Boost COMPONENTS chrono timer system)
INCLUDE_DIRECTORIES (
${MSGPACK_BOOST_DIR}
)
ENDIF ()
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}")
SET (CMAKE_CXX_FLAGS "-f${MSGPACK_CHAR_SIGN}-char ${CMAKE_CXX_FLAGS}")
ENDIF ()
IF (MSGPACK_DEFAULT_API_VERSION)
SET (CMAKE_CXX_FLAGS "-DMSGPACK_DEFAULT_API_VERSION=${MSGPACK_DEFAULT_API_VERSION} ${CMAKE_CXX_FLAGS}")
ELSE ()
SET (MSGPACK_DEFAULT_API_VERSION 3)
SET (CMAKE_CXX_FLAGS "-DMSGPACK_DEFAULT_API_VERSION=3 ${CMAKE_CXX_FLAGS}")
ENDIF ()
FILE (GLOB_RECURSE PREDEF_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/external/boost/predef/include/boost ${CMAKE_CURRENT_SOURCE_DIR}/external/boost/predef/include/boost/*.h)
FOREACH (F ${PREDEF_FILES})
SET(M "Converting ${F}")
MESSAGE(STATUS ${M})
FILE (READ ${CMAKE_CURRENT_SOURCE_DIR}/external/boost/predef/include/boost/${F} CONTENT)
STRING(REPLACE "BOOST_" "MSGPACK_" CONTENT ${CONTENT})
STRING(REPLACE "boost/" "msgpack/" CONTENT ${CONTENT})
FILE (WRITE ${CMAKE_CURRENT_SOURCE_DIR}/include/msgpack/${F} ${CONTENT})
ENDFOREACH ()
IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
IF (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.1)
INCLUDE (CheckCXXSourceCompiles)
CHECK_CXX_SOURCE_COMPILES ("
FILE (GLOB_RECURSE PREPROCESSOR_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/external/boost/preprocessor/include/boost ${CMAKE_CURRENT_SOURCE_DIR}/external/boost/preprocessor/include/boost/*.hpp)
FOREACH (F ${PREPROCESSOR_FILES})
SET(M "Converting ${F}")
MESSAGE(STATUS ${M})
FILE (READ ${CMAKE_CURRENT_SOURCE_DIR}/external/boost/preprocessor/include/boost/${F} CONTENT)
STRING(REPLACE "BOOST_" "MSGPACK_" CONTENT ${CONTENT})
STRING(REPLACE "boost/" "msgpack/" CONTENT ${CONTENT})
FILE (WRITE ${CMAKE_CURRENT_SOURCE_DIR}/include/msgpack/${F} ${CONTENT})
ENDFOREACH ()
FIND_PACKAGE (GTest)
FIND_PACKAGE (ZLIB)
FIND_PACKAGE (Threads)
IF (GTEST_FOUND AND ZLIB_FOUND AND THREADS_FOUND)
OPTION (MSGPACK_BUILD_TESTS "Build msgpack tests." ON)
ENDIF ()
OPTION (MSGPACK_BUILD_EXAMPLES "Build msgpack examples." ON)
OPTION (MSGPACK_ENABLE_CXX "Enable C++ interface." ON)
OPTION (MSGPACK_ENABLE_SHARED "Build shared libaries in addition to static libraries." ON)
INCLUDE (CheckCXXSourceCompiles)
CHECK_CXX_SOURCE_COMPILES ("
#include <bits/atomicity.h>
int atomic_sub(int i) { return __gnu_cxx::__exchange_and_add(&i, -1) - 1; }
int atomic_add(int i) { return __gnu_cxx::__exchange_and_add(&i, 1) + 1; }
@@ -102,146 +130,252 @@ int main(int argc, char * argv[])
atomic_sub(1);
atomic_add(1);
}
"
MSGPACK_ENABLE_GCC_CXX_ATOMIC)
ENDIF ()
ENDIF ()
" MSGPACK_ENABLE_GCC_CXX_ATOMIC)
INCLUDE (Files.cmake)
ADD_LIBRARY (msgpackc-cxx INTERFACE)
TARGET_INCLUDE_DIRECTORIES (msgpackc-cxx
INTERFACE
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>
$<INSTALL_INTERFACE:include>
LIST (APPEND msgpackc_SOURCES
src/unpack.c
src/objectc.c
src/version.c
src/vrefbuffer.c
src/zone.c
)
IF (MSGPACK_USE_BOOST)
TARGET_LINK_LIBRARIES (msgpackc-cxx INTERFACE Boost::boost)
LIST (APPEND msgpackc_HEADERS
include/msgpack/pack_define.h
include/msgpack/pack_template.h
include/msgpack/unpack_define.h
include/msgpack/unpack_template.h
include/msgpack/util.h
include/msgpack/sysdep.h
include/msgpack/gcc_atomic.h
include/msgpack.h
include/msgpack/sbuffer.h
include/msgpack/version.h
include/msgpack/version_master.h
include/msgpack/vrefbuffer.h
include/msgpack/zbuffer.h
include/msgpack/fbuffer.h
include/msgpack/pack.h
include/msgpack/unpack.h
include/msgpack/object.h
include/msgpack/zone.h
)
FILE (GLOB_RECURSE PREDEF_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/include/msgpack/predef/*.h)
LIST (APPEND msgpackc_HEADERS ${PREDEF_FILES})
LIST (APPEND msgpackc_HEADERS include/msgpack/predef.h)
IF (MSGPACK_ENABLE_CXX)
LIST (APPEND msgpack_HEADERS
include/msgpack.hpp
include/msgpack/adaptor/adaptor_base.hpp
include/msgpack/adaptor/array_ref.hpp
include/msgpack/adaptor/bool.hpp
include/msgpack/adaptor/boost/fusion.hpp
include/msgpack/adaptor/boost/msgpack_variant.hpp
include/msgpack/adaptor/boost/optional.hpp
include/msgpack/adaptor/boost/string_ref.hpp
include/msgpack/adaptor/char_ptr.hpp
include/msgpack/adaptor/check_container_size.hpp
include/msgpack/adaptor/cpp11/array.hpp
include/msgpack/adaptor/cpp11/array_char.hpp
include/msgpack/adaptor/cpp11/array_unsigned_char.hpp
include/msgpack/adaptor/cpp11/forward_list.hpp
include/msgpack/adaptor/cpp11/reference_wrapper.hpp
include/msgpack/adaptor/cpp11/shared_ptr.hpp
include/msgpack/adaptor/cpp11/tuple.hpp
include/msgpack/adaptor/cpp11/unique_ptr.hpp
include/msgpack/adaptor/cpp11/unordered_map.hpp
include/msgpack/adaptor/cpp11/unordered_set.hpp
include/msgpack/adaptor/define.hpp
include/msgpack/adaptor/deque.hpp
include/msgpack/adaptor/detail/cpp03_define_array.hpp
include/msgpack/adaptor/detail/cpp03_define_map.hpp
include/msgpack/adaptor/detail/cpp03_msgpack_tuple.hpp
include/msgpack/adaptor/detail/cpp11_define_array.hpp
include/msgpack/adaptor/detail/cpp11_define_map.hpp
include/msgpack/adaptor/detail/cpp11_msgpack_tuple.hpp
include/msgpack/adaptor/ext.hpp
include/msgpack/adaptor/fixint.hpp
include/msgpack/adaptor/float.hpp
include/msgpack/adaptor/int.hpp
include/msgpack/adaptor/list.hpp
include/msgpack/adaptor/map.hpp
include/msgpack/adaptor/msgpack_tuple.hpp
include/msgpack/adaptor/nil.hpp
include/msgpack/adaptor/pair.hpp
include/msgpack/adaptor/raw.hpp
include/msgpack/adaptor/v4raw.hpp
include/msgpack/adaptor/set.hpp
include/msgpack/adaptor/string.hpp
include/msgpack/adaptor/tr1/unordered_map.hpp
include/msgpack/adaptor/tr1/unordered_set.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/cpp_config.hpp
include/msgpack/detail/cpp03_zone.hpp
include/msgpack/detail/cpp11_zone.hpp
include/msgpack/fbuffer.hpp
include/msgpack/iterator.hpp
include/msgpack/meta.hpp
include/msgpack/object.hpp
include/msgpack/object_fwd.hpp
include/msgpack/pack.hpp
include/msgpack/sbuffer.hpp
include/msgpack/type.hpp
include/msgpack/unpack.hpp
include/msgpack/version.hpp
include/msgpack/versioning.hpp
include/msgpack/vrefbuffer.hpp
include/msgpack/zbuffer.hpp
include/msgpack/zone.hpp
)
FILE (GLOB_RECURSE PREPROCESSOR_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/include/msgpack/preprocessor/*.hpp)
LIST (APPEND msgpackc_HEADERS ${PREPROCESSOR_FILES})
LIST (APPEND msgpackc_HEADERS include/msgpack/preprocessor.hpp)
ENDIF ()
IF (MSGPACK_GEN_COVERAGE)
IF (NOT MSGPACK_BUILD_TESTS)
MESSAGE(FATAL_ERROR "Coverage requires -DMSGPACK_BUILD_TESTS=ON")
ENDIF ()
STRING (TOUPPER "${CMAKE_BUILD_TYPE}" UPPER_CMAKE_BUILD_TYPE)
IF (NOT "${UPPER_CMAKE_BUILD_TYPE}" STREQUAL "DEBUG")
MESSAGE (FATAL_ERROR "Coverage requires -DCMAKE_BUILD_TYPE=Debug")
ENDIF ()
EXECUTE_PROCESS (
COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/src/msgpack
)
INCLUDE (CodeCoverage)
SET (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COVERAGE_FLAGS}")
CONFIGURE_FILE (
msgpack.pc.in
msgpack.pc
@ONLY
)
SETUP_TARGET_FOR_COVERAGE(coverage make coverage test)
INCLUDE_DIRECTORIES (
./
include/
${CMAKE_CURRENT_BINARY_DIR}/include/
)
IF (MSGPACK_ENABLE_SHARED)
ADD_LIBRARY (msgpackc SHARED
${msgpackc_SOURCES}
${msgpackc_HEADERS}
)
ENDIF ()
ADD_LIBRARY (msgpackc-static STATIC
${msgpackc_SOURCES}
${msgpackc_HEADERS}
)
SET_TARGET_PROPERTIES (msgpackc-static PROPERTIES OUTPUT_NAME "msgpackc")
IF (MSGPACK_ENABLE_SHARED)
SET_TARGET_PROPERTIES (msgpackc PROPERTIES IMPORT_SUFFIX "_import.lib")
SET_TARGET_PROPERTIES (msgpackc PROPERTIES SOVERSION 2 VERSION 2.0.0)
ENDIF ()
IF (MSGPACK_BUILD_TESTS)
IF (NOT MSGPACK_USE_BOOST)
MESSAGE(FATAL_ERROR "Test requires -DMSGPACK_USE_BOOST=ON")
ENDIF ()
ENABLE_TESTING ()
# 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")
FIND_PROGRAM (CTEST_MEMORYCHECK_COMMAND NAMES valgrind)
INCLUDE (Dart)
FIND_PROGRAM(CTEST_MEMORYCHECK_COMMAND NAMES valgrind)
INCLUDE(Dart)
ADD_SUBDIRECTORY (test)
ENDIF ()
# enable regression testing
IF (MSGPACK_FUZZ_REGRESSION)
ENABLE_TESTING ()
ADD_SUBDIRECTORY (fuzz)
IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
IF (MSGPACK_ENABLE_SHARED)
SET_PROPERTY (TARGET msgpackc APPEND_STRING PROPERTY COMPILE_FLAGS "-Wall -Wextra -Werror -g -O3 -DPIC")
ENDIF ()
SET_PROPERTY (TARGET msgpackc-static APPEND_STRING PROPERTY COMPILE_FLAGS "-Wall -Wextra -Werror -g -O3" )
ENDIF ()
IF ("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "sparc")
SET (CMAKE_CXX_FLAGS "-DMSGPACK_ZONE_ALIGN=8 ${CMAKE_CXX_FLAGS}")
IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
SET_PROPERTY (TARGET msgpackc APPEND_STRING PROPERTY COMPILE_FLAGS " -Wno-mismatched-tags")
ENDIF ()
IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
IF ((CMAKE_CXX_COMPILER_VERSION VERSION_GREATER ${GNUCXX_NO_MISMATCHED_TAGS_SUPPORT_VERSION}) OR
(CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL ${GNUCXX_NO_MISMATCHED_TAGS_SUPPORT_VERSION}))
SET_PROPERTY (TARGET msgpackc APPEND_STRING PROPERTY COMPILE_FLAGS " -Wno-mismatched-tags")
ENDIF ()
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 ()
IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC90" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC10")
SET_SOURCE_FILES_PROPERTIES(${msgpackc_SOURCES} PROPERTIES LANGUAGE CXX)
ENDIF()
IF (NOT DEFINED CMAKE_INSTALL_LIBDIR)
SET(CMAKE_INSTALL_LIBDIR lib)
ENDIF ()
IF (MSGPACK_BUILD_EXAMPLES)
ADD_SUBDIRECTORY (example)
ENDIF ()
IF (MSGPACK_ENABLE_SHARED)
SET (MSGPACK_INSTALLTARGETS msgpackc msgpackc-static)
ELSE()
SET (MSGPACK_INSTALLTARGETS msgpackc-static)
ENDIF ()
INSTALL (TARGETS ${MSGPACK_INSTALLTARGETS} DESTINATION ${CMAKE_INSTALL_LIBDIR})
INSTALL (DIRECTORY include DESTINATION ${CMAKE_INSTALL_PREFIX})
IF (NOT MSVC)
INSTALL (FILES ${CMAKE_CURRENT_BINARY_DIR}/msgpack.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
ENDIF ()
# Doxygen
IF (MSGPACK_BUILD_DOCS)
FIND_PACKAGE (Doxygen)
IF (DOXYGEN_FOUND)
LIST (APPEND Doxyfile_cpp_CONTENT
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_cpp
COMMAND ${CMAKE_COMMAND} -E echo "FILE_PATTERNS = *.hpp" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_cpp
COMMAND ${CMAKE_COMMAND} -E echo "OUTPUT_DIRECTORY = doc_cpp" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_cpp
COMMAND ${CMAKE_COMMAND} -E echo "INPUT = ${CMAKE_CURRENT_SOURCE_DIR}/include" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_cpp
COMMAND ${CMAKE_COMMAND} -E echo "EXTRACT_ALL = YES" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_cpp
COMMAND ${CMAKE_COMMAND} -E echo "STRIP_FROM_PATH = ${CMAKE_CURRENT_SOURCE_DIR}/include" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_cpp
)
IF (DOXYGEN_DOT_FOUND)
LIST (APPEND Doxyfile_cpp_CONTENT
COMMAND ${CMAKE_COMMAND} -E echo "HAVE_DOT = YES" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_cpp
)
ENDIF ()
ADD_CUSTOM_TARGET (
doxygen
${Doxyfile_cpp_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_cpp
VERBATIM
FIND_PACKAGE (Doxygen)
IF (DOXYGEN_FOUND)
LIST (APPEND Doxyfile_c_CONTENT
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_c
COMMAND ${CMAKE_COMMAND} -E echo "FILE_PATTERNS = *.h" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_c
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_c
COMMAND ${CMAKE_COMMAND} -E echo "EXTRACT_ALL = YES" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_c
COMMAND ${CMAKE_COMMAND} -E echo "PROJECT_NAME = \"MessagePack for C\"" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_c
)
IF (DOXYGEN_DOT_FOUND)
LIST (APPEND Doxyfile_c_CONTENT
COMMAND ${CMAKE_COMMAND} -E echo "HAVE_DOT = YES" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_c
)
ENDIF ()
ADD_CUSTOM_TARGET (
doxygen_c
${Doxyfile_c_CONTENT}
COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_c
VERBATIM
)
LIST (APPEND Doxyfile_cpp_CONTENT
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_cpp
COMMAND ${CMAKE_COMMAND} -E echo "FILE_PATTERNS = *.hpp" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_cpp
COMMAND ${CMAKE_COMMAND} -E echo "OUTPUT_DIRECTORY = doc_cpp" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_cpp
COMMAND ${CMAKE_COMMAND} -E echo "INPUT = ${CMAKE_CURRENT_SOURCE_DIR}/include" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_cpp
COMMAND ${CMAKE_COMMAND} -E echo "EXTRACT_ALL = YES" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_cpp
)
IF (DOXYGEN_DOT_FOUND)
LIST (APPEND Doxyfile_cpp_CONTENT
COMMAND ${CMAKE_COMMAND} -E echo "HAVE_DOT = YES" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_cpp
)
ENDIF ()
ADD_CUSTOM_TARGET (
doxygen_cpp
${Doxyfile_cpp_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_cpp
VERBATIM
)
ADD_CUSTOM_TARGET (
doxygen
DEPENDS doxygen_c doxygen_cpp
)
ENDIF ()
include (GNUInstallDirs)
# 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)
IF (NOT (CMAKE_VERSION VERSION_LESS 3.14))
SET (extra_version_file_args ARCH_INDEPENDENT)
ENDIF ()
SET (cmake_config_path "${CMAKE_INSTALL_LIBDIR}/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 (
msgpack-config-version.cmake
VERSION ${VERSION}
COMPATIBILITY SameMajorVersion
${extra_version_file_args}
)
# Install the generated package version file and the main package file.
INSTALL (FILES
"${CMAKE_CURRENT_BINARY_DIR}/msgpack-config.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/msgpack-config-version.cmake"
DESTINATION "${cmake_config_path}"
COMPONENT msgpackc-cxx
)
# This installs package in install tree for using installed targets.
INSTALL (
EXPORT msgpackc-cxx-targets
FILE msgpackc-cxx-targets.cmake
DESTINATION "${cmake_config_path}"
COMPONENT msgpackc-cxx
)

View File

@@ -281,7 +281,7 @@ TYPEDEF_HIDES_STRUCT = NO
# causing a significant performance penality.
# If the system has enough physical memory increasing the cache will improve the
# performance by keeping more symbols in memory. Note that the value works on
# a logarithmic scale so increasing the size by one will roughly double the
# a logarithmic scale so increasing the size by one will rougly double the
# memory usage. The cache size is given by this formula:
# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0,
# corresponding to a cache size of 2^16 = 65536 symbols

View File

@@ -1,732 +0,0 @@
SET (msgpackc_HEADERS
include/msgpack.hpp
include/msgpack/adaptor/adaptor_base.hpp
include/msgpack/adaptor/adaptor_base_decl.hpp
include/msgpack/adaptor/array_ref.hpp
include/msgpack/adaptor/array_ref_decl.hpp
include/msgpack/adaptor/bool.hpp
include/msgpack/adaptor/boost/fusion.hpp
include/msgpack/adaptor/boost/msgpack_variant.hpp
include/msgpack/adaptor/boost/msgpack_variant_decl.hpp
include/msgpack/adaptor/boost/optional.hpp
include/msgpack/adaptor/boost/string_ref.hpp
include/msgpack/adaptor/boost/string_view.hpp
include/msgpack/adaptor/carray.hpp
include/msgpack/adaptor/char_ptr.hpp
include/msgpack/adaptor/check_container_size.hpp
include/msgpack/adaptor/check_container_size_decl.hpp
include/msgpack/adaptor/complex.hpp
include/msgpack/adaptor/cpp11/array.hpp
include/msgpack/adaptor/cpp11/array_char.hpp
include/msgpack/adaptor/cpp11/array_unsigned_char.hpp
include/msgpack/adaptor/cpp11/chrono.hpp
include/msgpack/adaptor/cpp11/forward_list.hpp
include/msgpack/adaptor/cpp11/reference_wrapper.hpp
include/msgpack/adaptor/cpp11/shared_ptr.hpp
include/msgpack/adaptor/cpp11/timespec.hpp
include/msgpack/adaptor/cpp11/tuple.hpp
include/msgpack/adaptor/cpp11/unique_ptr.hpp
include/msgpack/adaptor/cpp11/unordered_map.hpp
include/msgpack/adaptor/cpp11/unordered_set.hpp
include/msgpack/adaptor/cpp17/array_byte.hpp
include/msgpack/adaptor/cpp17/byte.hpp
include/msgpack/adaptor/cpp17/carray_byte.hpp
include/msgpack/adaptor/cpp17/optional.hpp
include/msgpack/adaptor/cpp17/string_view.hpp
include/msgpack/adaptor/cpp17/vector_byte.hpp
include/msgpack/adaptor/cpp20/span.hpp
include/msgpack/adaptor/define.hpp
include/msgpack/adaptor/define_decl.hpp
include/msgpack/adaptor/deque.hpp
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/assert.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/predef.h
include/msgpack/predef/architecture.h
include/msgpack/predef/architecture/alpha.h
include/msgpack/predef/architecture/arm.h
include/msgpack/predef/architecture/blackfin.h
include/msgpack/predef/architecture/convex.h
include/msgpack/predef/architecture/ia64.h
include/msgpack/predef/architecture/m68k.h
include/msgpack/predef/architecture/mips.h
include/msgpack/predef/architecture/parisc.h
include/msgpack/predef/architecture/ppc.h
include/msgpack/predef/architecture/ptx.h
include/msgpack/predef/architecture/pyramid.h
include/msgpack/predef/architecture/rs6k.h
include/msgpack/predef/architecture/sparc.h
include/msgpack/predef/architecture/superh.h
include/msgpack/predef/architecture/sys370.h
include/msgpack/predef/architecture/sys390.h
include/msgpack/predef/architecture/x86.h
include/msgpack/predef/architecture/x86/32.h
include/msgpack/predef/architecture/x86/64.h
include/msgpack/predef/architecture/z.h
include/msgpack/predef/compiler.h
include/msgpack/predef/compiler/borland.h
include/msgpack/predef/compiler/clang.h
include/msgpack/predef/compiler/comeau.h
include/msgpack/predef/compiler/compaq.h
include/msgpack/predef/compiler/diab.h
include/msgpack/predef/compiler/digitalmars.h
include/msgpack/predef/compiler/dignus.h
include/msgpack/predef/compiler/edg.h
include/msgpack/predef/compiler/ekopath.h
include/msgpack/predef/compiler/gcc.h
include/msgpack/predef/compiler/gcc_xml.h
include/msgpack/predef/compiler/greenhills.h
include/msgpack/predef/compiler/hp_acc.h
include/msgpack/predef/compiler/iar.h
include/msgpack/predef/compiler/ibm.h
include/msgpack/predef/compiler/intel.h
include/msgpack/predef/compiler/kai.h
include/msgpack/predef/compiler/llvm.h
include/msgpack/predef/compiler/metaware.h
include/msgpack/predef/compiler/metrowerks.h
include/msgpack/predef/compiler/microtec.h
include/msgpack/predef/compiler/mpw.h
include/msgpack/predef/compiler/nvcc.h
include/msgpack/predef/compiler/palm.h
include/msgpack/predef/compiler/pgi.h
include/msgpack/predef/compiler/sgi_mipspro.h
include/msgpack/predef/compiler/sunpro.h
include/msgpack/predef/compiler/tendra.h
include/msgpack/predef/compiler/visualc.h
include/msgpack/predef/compiler/watcom.h
include/msgpack/predef/detail/_cassert.h
include/msgpack/predef/detail/_exception.h
include/msgpack/predef/detail/comp_detected.h
include/msgpack/predef/detail/endian_compat.h
include/msgpack/predef/detail/os_detected.h
include/msgpack/predef/detail/platform_detected.h
include/msgpack/predef/detail/test.h
include/msgpack/predef/detail/test_def.h
include/msgpack/predef/hardware.h
include/msgpack/predef/hardware/simd.h
include/msgpack/predef/hardware/simd/arm.h
include/msgpack/predef/hardware/simd/arm/versions.h
include/msgpack/predef/hardware/simd/ppc.h
include/msgpack/predef/hardware/simd/ppc/versions.h
include/msgpack/predef/hardware/simd/x86.h
include/msgpack/predef/hardware/simd/x86/versions.h
include/msgpack/predef/hardware/simd/x86_amd.h
include/msgpack/predef/hardware/simd/x86_amd/versions.h
include/msgpack/predef/language.h
include/msgpack/predef/language/cuda.h
include/msgpack/predef/language/objc.h
include/msgpack/predef/language/stdc.h
include/msgpack/predef/language/stdcpp.h
include/msgpack/predef/library.h
include/msgpack/predef/library/c.h
include/msgpack/predef/library/c/_prefix.h
include/msgpack/predef/library/c/cloudabi.h
include/msgpack/predef/library/c/gnu.h
include/msgpack/predef/library/c/uc.h
include/msgpack/predef/library/c/vms.h
include/msgpack/predef/library/c/zos.h
include/msgpack/predef/library/std.h
include/msgpack/predef/library/std/_prefix.h
include/msgpack/predef/library/std/cxx.h
include/msgpack/predef/library/std/dinkumware.h
include/msgpack/predef/library/std/libcomo.h
include/msgpack/predef/library/std/modena.h
include/msgpack/predef/library/std/msl.h
include/msgpack/predef/library/std/roguewave.h
include/msgpack/predef/library/std/sgi.h
include/msgpack/predef/library/std/stdcpp3.h
include/msgpack/predef/library/std/stlport.h
include/msgpack/predef/library/std/vacpp.h
include/msgpack/predef/make.h
include/msgpack/predef/os.h
include/msgpack/predef/os/aix.h
include/msgpack/predef/os/amigaos.h
include/msgpack/predef/os/android.h
include/msgpack/predef/os/beos.h
include/msgpack/predef/os/bsd.h
include/msgpack/predef/os/bsd/bsdi.h
include/msgpack/predef/os/bsd/dragonfly.h
include/msgpack/predef/os/bsd/free.h
include/msgpack/predef/os/bsd/net.h
include/msgpack/predef/os/bsd/open.h
include/msgpack/predef/os/cygwin.h
include/msgpack/predef/os/haiku.h
include/msgpack/predef/os/hpux.h
include/msgpack/predef/os/ios.h
include/msgpack/predef/os/irix.h
include/msgpack/predef/os/linux.h
include/msgpack/predef/os/macos.h
include/msgpack/predef/os/os400.h
include/msgpack/predef/os/qnxnto.h
include/msgpack/predef/os/solaris.h
include/msgpack/predef/os/unix.h
include/msgpack/predef/os/vms.h
include/msgpack/predef/os/windows.h
include/msgpack/predef/other.h
include/msgpack/predef/other/endian.h
include/msgpack/predef/other/workaround.h
include/msgpack/predef/platform.h
include/msgpack/predef/platform/cloudabi.h
include/msgpack/predef/platform/ios.h
include/msgpack/predef/platform/mingw.h
include/msgpack/predef/platform/mingw32.h
include/msgpack/predef/platform/mingw64.h
include/msgpack/predef/platform/windows_desktop.h
include/msgpack/predef/platform/windows_phone.h
include/msgpack/predef/platform/windows_runtime.h
include/msgpack/predef/platform/windows_server.h
include/msgpack/predef/platform/windows_store.h
include/msgpack/predef/platform/windows_system.h
include/msgpack/predef/platform/windows_uwp.h
include/msgpack/predef/version.h
include/msgpack/predef/version_number.h
include/msgpack/preprocessor.hpp
include/msgpack/preprocessor/arithmetic.hpp
include/msgpack/preprocessor/arithmetic/add.hpp
include/msgpack/preprocessor/arithmetic/dec.hpp
include/msgpack/preprocessor/arithmetic/detail/div_base.hpp
include/msgpack/preprocessor/arithmetic/div.hpp
include/msgpack/preprocessor/arithmetic/inc.hpp
include/msgpack/preprocessor/arithmetic/mod.hpp
include/msgpack/preprocessor/arithmetic/mul.hpp
include/msgpack/preprocessor/arithmetic/sub.hpp
include/msgpack/preprocessor/array.hpp
include/msgpack/preprocessor/array/data.hpp
include/msgpack/preprocessor/array/detail/get_data.hpp
include/msgpack/preprocessor/array/elem.hpp
include/msgpack/preprocessor/array/enum.hpp
include/msgpack/preprocessor/array/insert.hpp
include/msgpack/preprocessor/array/pop_back.hpp
include/msgpack/preprocessor/array/pop_front.hpp
include/msgpack/preprocessor/array/push_back.hpp
include/msgpack/preprocessor/array/push_front.hpp
include/msgpack/preprocessor/array/remove.hpp
include/msgpack/preprocessor/array/replace.hpp
include/msgpack/preprocessor/array/reverse.hpp
include/msgpack/preprocessor/array/size.hpp
include/msgpack/preprocessor/array/to_list.hpp
include/msgpack/preprocessor/array/to_seq.hpp
include/msgpack/preprocessor/array/to_tuple.hpp
include/msgpack/preprocessor/assert_msg.hpp
include/msgpack/preprocessor/cat.hpp
include/msgpack/preprocessor/comma.hpp
include/msgpack/preprocessor/comma_if.hpp
include/msgpack/preprocessor/comparison.hpp
include/msgpack/preprocessor/comparison/equal.hpp
include/msgpack/preprocessor/comparison/greater.hpp
include/msgpack/preprocessor/comparison/greater_equal.hpp
include/msgpack/preprocessor/comparison/less.hpp
include/msgpack/preprocessor/comparison/less_equal.hpp
include/msgpack/preprocessor/comparison/not_equal.hpp
include/msgpack/preprocessor/config/config.hpp
include/msgpack/preprocessor/config/limits.hpp
include/msgpack/preprocessor/control.hpp
include/msgpack/preprocessor/control/deduce_d.hpp
include/msgpack/preprocessor/control/detail/dmc/while.hpp
include/msgpack/preprocessor/control/detail/edg/while.hpp
include/msgpack/preprocessor/control/detail/msvc/while.hpp
include/msgpack/preprocessor/control/detail/while.hpp
include/msgpack/preprocessor/control/expr_if.hpp
include/msgpack/preprocessor/control/expr_iif.hpp
include/msgpack/preprocessor/control/if.hpp
include/msgpack/preprocessor/control/iif.hpp
include/msgpack/preprocessor/control/while.hpp
include/msgpack/preprocessor/debug.hpp
include/msgpack/preprocessor/debug/assert.hpp
include/msgpack/preprocessor/debug/error.hpp
include/msgpack/preprocessor/debug/line.hpp
include/msgpack/preprocessor/dec.hpp
include/msgpack/preprocessor/detail/auto_rec.hpp
include/msgpack/preprocessor/detail/check.hpp
include/msgpack/preprocessor/detail/dmc/auto_rec.hpp
include/msgpack/preprocessor/detail/is_binary.hpp
include/msgpack/preprocessor/detail/is_nullary.hpp
include/msgpack/preprocessor/detail/is_unary.hpp
include/msgpack/preprocessor/detail/null.hpp
include/msgpack/preprocessor/detail/split.hpp
include/msgpack/preprocessor/empty.hpp
include/msgpack/preprocessor/enum.hpp
include/msgpack/preprocessor/enum_params.hpp
include/msgpack/preprocessor/enum_params_with_a_default.hpp
include/msgpack/preprocessor/enum_params_with_defaults.hpp
include/msgpack/preprocessor/enum_shifted.hpp
include/msgpack/preprocessor/enum_shifted_params.hpp
include/msgpack/preprocessor/expand.hpp
include/msgpack/preprocessor/expr_if.hpp
include/msgpack/preprocessor/facilities.hpp
include/msgpack/preprocessor/facilities/apply.hpp
include/msgpack/preprocessor/facilities/detail/is_empty.hpp
include/msgpack/preprocessor/facilities/empty.hpp
include/msgpack/preprocessor/facilities/expand.hpp
include/msgpack/preprocessor/facilities/identity.hpp
include/msgpack/preprocessor/facilities/intercept.hpp
include/msgpack/preprocessor/facilities/is_1.hpp
include/msgpack/preprocessor/facilities/is_empty.hpp
include/msgpack/preprocessor/facilities/is_empty_or_1.hpp
include/msgpack/preprocessor/facilities/is_empty_variadic.hpp
include/msgpack/preprocessor/facilities/overload.hpp
include/msgpack/preprocessor/for.hpp
include/msgpack/preprocessor/identity.hpp
include/msgpack/preprocessor/if.hpp
include/msgpack/preprocessor/inc.hpp
include/msgpack/preprocessor/iterate.hpp
include/msgpack/preprocessor/iteration.hpp
include/msgpack/preprocessor/iteration/detail/bounds/lower1.hpp
include/msgpack/preprocessor/iteration/detail/bounds/lower2.hpp
include/msgpack/preprocessor/iteration/detail/bounds/lower3.hpp
include/msgpack/preprocessor/iteration/detail/bounds/lower4.hpp
include/msgpack/preprocessor/iteration/detail/bounds/lower5.hpp
include/msgpack/preprocessor/iteration/detail/bounds/upper1.hpp
include/msgpack/preprocessor/iteration/detail/bounds/upper2.hpp
include/msgpack/preprocessor/iteration/detail/bounds/upper3.hpp
include/msgpack/preprocessor/iteration/detail/bounds/upper4.hpp
include/msgpack/preprocessor/iteration/detail/bounds/upper5.hpp
include/msgpack/preprocessor/iteration/detail/finish.hpp
include/msgpack/preprocessor/iteration/detail/iter/forward1.hpp
include/msgpack/preprocessor/iteration/detail/iter/forward2.hpp
include/msgpack/preprocessor/iteration/detail/iter/forward3.hpp
include/msgpack/preprocessor/iteration/detail/iter/forward4.hpp
include/msgpack/preprocessor/iteration/detail/iter/forward5.hpp
include/msgpack/preprocessor/iteration/detail/iter/reverse1.hpp
include/msgpack/preprocessor/iteration/detail/iter/reverse2.hpp
include/msgpack/preprocessor/iteration/detail/iter/reverse3.hpp
include/msgpack/preprocessor/iteration/detail/iter/reverse4.hpp
include/msgpack/preprocessor/iteration/detail/iter/reverse5.hpp
include/msgpack/preprocessor/iteration/detail/local.hpp
include/msgpack/preprocessor/iteration/detail/rlocal.hpp
include/msgpack/preprocessor/iteration/detail/self.hpp
include/msgpack/preprocessor/iteration/detail/start.hpp
include/msgpack/preprocessor/iteration/iterate.hpp
include/msgpack/preprocessor/iteration/local.hpp
include/msgpack/preprocessor/iteration/self.hpp
include/msgpack/preprocessor/library.hpp
include/msgpack/preprocessor/limits.hpp
include/msgpack/preprocessor/list.hpp
include/msgpack/preprocessor/list/adt.hpp
include/msgpack/preprocessor/list/append.hpp
include/msgpack/preprocessor/list/at.hpp
include/msgpack/preprocessor/list/cat.hpp
include/msgpack/preprocessor/list/detail/dmc/fold_left.hpp
include/msgpack/preprocessor/list/detail/edg/fold_left.hpp
include/msgpack/preprocessor/list/detail/edg/fold_right.hpp
include/msgpack/preprocessor/list/detail/fold_left.hpp
include/msgpack/preprocessor/list/detail/fold_right.hpp
include/msgpack/preprocessor/list/enum.hpp
include/msgpack/preprocessor/list/filter.hpp
include/msgpack/preprocessor/list/first_n.hpp
include/msgpack/preprocessor/list/fold_left.hpp
include/msgpack/preprocessor/list/fold_right.hpp
include/msgpack/preprocessor/list/for_each.hpp
include/msgpack/preprocessor/list/for_each_i.hpp
include/msgpack/preprocessor/list/for_each_product.hpp
include/msgpack/preprocessor/list/rest_n.hpp
include/msgpack/preprocessor/list/reverse.hpp
include/msgpack/preprocessor/list/size.hpp
include/msgpack/preprocessor/list/to_array.hpp
include/msgpack/preprocessor/list/to_seq.hpp
include/msgpack/preprocessor/list/to_tuple.hpp
include/msgpack/preprocessor/list/transform.hpp
include/msgpack/preprocessor/logical.hpp
include/msgpack/preprocessor/logical/and.hpp
include/msgpack/preprocessor/logical/bitand.hpp
include/msgpack/preprocessor/logical/bitnor.hpp
include/msgpack/preprocessor/logical/bitor.hpp
include/msgpack/preprocessor/logical/bitxor.hpp
include/msgpack/preprocessor/logical/bool.hpp
include/msgpack/preprocessor/logical/compl.hpp
include/msgpack/preprocessor/logical/nor.hpp
include/msgpack/preprocessor/logical/not.hpp
include/msgpack/preprocessor/logical/or.hpp
include/msgpack/preprocessor/logical/xor.hpp
include/msgpack/preprocessor/max.hpp
include/msgpack/preprocessor/min.hpp
include/msgpack/preprocessor/punctuation.hpp
include/msgpack/preprocessor/punctuation/comma.hpp
include/msgpack/preprocessor/punctuation/comma_if.hpp
include/msgpack/preprocessor/punctuation/detail/is_begin_parens.hpp
include/msgpack/preprocessor/punctuation/is_begin_parens.hpp
include/msgpack/preprocessor/punctuation/paren.hpp
include/msgpack/preprocessor/punctuation/paren_if.hpp
include/msgpack/preprocessor/punctuation/remove_parens.hpp
include/msgpack/preprocessor/repeat.hpp
include/msgpack/preprocessor/repeat_2nd.hpp
include/msgpack/preprocessor/repeat_3rd.hpp
include/msgpack/preprocessor/repeat_from_to.hpp
include/msgpack/preprocessor/repeat_from_to_2nd.hpp
include/msgpack/preprocessor/repeat_from_to_3rd.hpp
include/msgpack/preprocessor/repetition.hpp
include/msgpack/preprocessor/repetition/deduce_r.hpp
include/msgpack/preprocessor/repetition/deduce_z.hpp
include/msgpack/preprocessor/repetition/detail/dmc/for.hpp
include/msgpack/preprocessor/repetition/detail/edg/for.hpp
include/msgpack/preprocessor/repetition/detail/for.hpp
include/msgpack/preprocessor/repetition/detail/msvc/for.hpp
include/msgpack/preprocessor/repetition/enum.hpp
include/msgpack/preprocessor/repetition/enum_binary_params.hpp
include/msgpack/preprocessor/repetition/enum_params.hpp
include/msgpack/preprocessor/repetition/enum_params_with_a_default.hpp
include/msgpack/preprocessor/repetition/enum_params_with_defaults.hpp
include/msgpack/preprocessor/repetition/enum_shifted.hpp
include/msgpack/preprocessor/repetition/enum_shifted_binary_params.hpp
include/msgpack/preprocessor/repetition/enum_shifted_params.hpp
include/msgpack/preprocessor/repetition/enum_trailing.hpp
include/msgpack/preprocessor/repetition/enum_trailing_binary_params.hpp
include/msgpack/preprocessor/repetition/enum_trailing_params.hpp
include/msgpack/preprocessor/repetition/for.hpp
include/msgpack/preprocessor/repetition/repeat.hpp
include/msgpack/preprocessor/repetition/repeat_from_to.hpp
include/msgpack/preprocessor/selection.hpp
include/msgpack/preprocessor/selection/max.hpp
include/msgpack/preprocessor/selection/min.hpp
include/msgpack/preprocessor/seq.hpp
include/msgpack/preprocessor/seq/cat.hpp
include/msgpack/preprocessor/seq/detail/binary_transform.hpp
include/msgpack/preprocessor/seq/detail/is_empty.hpp
include/msgpack/preprocessor/seq/detail/split.hpp
include/msgpack/preprocessor/seq/detail/to_list_msvc.hpp
include/msgpack/preprocessor/seq/elem.hpp
include/msgpack/preprocessor/seq/enum.hpp
include/msgpack/preprocessor/seq/filter.hpp
include/msgpack/preprocessor/seq/first_n.hpp
include/msgpack/preprocessor/seq/fold_left.hpp
include/msgpack/preprocessor/seq/fold_right.hpp
include/msgpack/preprocessor/seq/for_each.hpp
include/msgpack/preprocessor/seq/for_each_i.hpp
include/msgpack/preprocessor/seq/for_each_product.hpp
include/msgpack/preprocessor/seq/insert.hpp
include/msgpack/preprocessor/seq/pop_back.hpp
include/msgpack/preprocessor/seq/pop_front.hpp
include/msgpack/preprocessor/seq/push_back.hpp
include/msgpack/preprocessor/seq/push_front.hpp
include/msgpack/preprocessor/seq/remove.hpp
include/msgpack/preprocessor/seq/replace.hpp
include/msgpack/preprocessor/seq/rest_n.hpp
include/msgpack/preprocessor/seq/reverse.hpp
include/msgpack/preprocessor/seq/seq.hpp
include/msgpack/preprocessor/seq/size.hpp
include/msgpack/preprocessor/seq/subseq.hpp
include/msgpack/preprocessor/seq/to_array.hpp
include/msgpack/preprocessor/seq/to_list.hpp
include/msgpack/preprocessor/seq/to_tuple.hpp
include/msgpack/preprocessor/seq/transform.hpp
include/msgpack/preprocessor/seq/variadic_seq_to_seq.hpp
include/msgpack/preprocessor/slot.hpp
include/msgpack/preprocessor/slot/counter.hpp
include/msgpack/preprocessor/slot/detail/counter.hpp
include/msgpack/preprocessor/slot/detail/def.hpp
include/msgpack/preprocessor/slot/detail/shared.hpp
include/msgpack/preprocessor/slot/detail/slot1.hpp
include/msgpack/preprocessor/slot/detail/slot2.hpp
include/msgpack/preprocessor/slot/detail/slot3.hpp
include/msgpack/preprocessor/slot/detail/slot4.hpp
include/msgpack/preprocessor/slot/detail/slot5.hpp
include/msgpack/preprocessor/slot/slot.hpp
include/msgpack/preprocessor/stringize.hpp
include/msgpack/preprocessor/tuple.hpp
include/msgpack/preprocessor/tuple/detail/is_single_return.hpp
include/msgpack/preprocessor/tuple/eat.hpp
include/msgpack/preprocessor/tuple/elem.hpp
include/msgpack/preprocessor/tuple/enum.hpp
include/msgpack/preprocessor/tuple/insert.hpp
include/msgpack/preprocessor/tuple/pop_back.hpp
include/msgpack/preprocessor/tuple/pop_front.hpp
include/msgpack/preprocessor/tuple/push_back.hpp
include/msgpack/preprocessor/tuple/push_front.hpp
include/msgpack/preprocessor/tuple/rem.hpp
include/msgpack/preprocessor/tuple/remove.hpp
include/msgpack/preprocessor/tuple/replace.hpp
include/msgpack/preprocessor/tuple/reverse.hpp
include/msgpack/preprocessor/tuple/size.hpp
include/msgpack/preprocessor/tuple/to_array.hpp
include/msgpack/preprocessor/tuple/to_list.hpp
include/msgpack/preprocessor/tuple/to_seq.hpp
include/msgpack/preprocessor/variadic.hpp
include/msgpack/preprocessor/variadic/detail/is_single_return.hpp
include/msgpack/preprocessor/variadic/elem.hpp
include/msgpack/preprocessor/variadic/size.hpp
include/msgpack/preprocessor/variadic/to_array.hpp
include/msgpack/preprocessor/variadic/to_list.hpp
include/msgpack/preprocessor/variadic/to_seq.hpp
include/msgpack/preprocessor/variadic/to_tuple.hpp
include/msgpack/preprocessor/while.hpp
include/msgpack/preprocessor/wstringize.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
)

20
Makefile.am Normal file
View File

@@ -0,0 +1,20 @@
SUBDIRS = src test
DOC_FILES = \
Doxyfile \
README.md \
LICENSE_1_0.txt \
NOTICE \
msgpack_vc8.vcproj \
msgpack_vc8.sln
EXTRA_DIST = \
$(DOC_FILES) CMakeLists.txt test/CMakeLists.txt example
pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = msgpack.pc
doxygen:
./preprocess clean
cd src && $(MAKE) doxygen
./preprocess

194
QUICKSTART-C.md Normal file
View File

@@ -0,0 +1,194 @@
# Implementation Status
The serialization library is production-ready.
Currently, RPC implementation is not available.
# Install
## Mac OS X with MacPorts
On Mac OS X, 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.
```
$ sudo 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.
## Other UNIX-like platform with ./configure
On the other UNIX-like platforms, download source package from [Releases|http://msgpack.org/releases/cpp/] and run `./configure && make && make install`.
```
$ wget http://msgpack.org/releases/cpp/msgpack-1.3.0.tar.gz
$ tar zxvf msgpack-1.3.0.tar.gz
$ cd msgpack-1.3.0
$ ./configure
$ make
$ sudo make install
```
## Windows
On Windows, download source package from [here|https://sourceforge.net/projects/msgpack/files/] and extract it.
Then open `msgpack_vc8.vcproj` file and build it using batch build. It builds libraries on `lib/` folder and header files on `include/` folder.
You can build using command line as follows:
```
> vcbuild msgpack_vc2008.vcproj
> dir lib % DLL files are here
> dir include % header files are here
```
## Install from git repository
You need to install gcc (4.1.0 or higher), autotools.
```
$ git clone git@github.com:msgpack/msgpack.git
$ cd msgpack/cpp
$ ./bootstrap
$ ./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);
bool success = 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_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);
bool success = 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"] */
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
*/
}
```

View File

@@ -31,11 +31,11 @@ int main(void) {
msgpack::pack(sbuf, vec);
// deserialize it.
msgpack::object_handle oh =
msgpack::unpack(sbuf.data(), sbuf.size());
msgpack::unpacked msg;
msgpack::unpack(&msg, sbuf.data(), sbuf.size());
// print the deserialized object.
msgpack::object obj = oh.get();
msgpack::object obj = msg.get();
std::cout << obj << std::endl; //=> ["Hello", "MessagePack"]
// convert it into statically typed object.
@@ -47,11 +47,13 @@ int main(void) {
Compile it as follows:
```
$ g++ -Ipath_to_msgpack/include hello.cc -o hello
$ g++ -Ipath_to_msgpack/include -DMSGPACK_DISABLE_LEGACY_NIL -DMSGPACK_DISABLE_LEGACY_CONVERT hello.cc -o hello
$ ./hello
["Hello", "MessagePack"]
```
See [MSGPACK_DISABLE_LEGACY_NIL](https://github.com/msgpack/msgpack-c/wiki/v1_1_cpp_configure#msgpack_disable_legacy_nil-since-140) and [MSGPACK_DISABLE_LEGACY_CONVERT](https://github.com/msgpack/msgpack-c/wiki/v1_1_cpp_configure#msgpack_disable_legacy_convert-since-140).
## Streaming feature
```cpp
@@ -59,7 +61,7 @@ $ ./hello
#include <iostream>
#include <string>
int main() {
int main(void) {
// serializes multiple objects using msgpack::packer.
msgpack::sbuffer buffer;
@@ -77,13 +79,13 @@ int main() {
pac.buffer_consumed(buffer.size());
// now starts streaming deserialization.
msgpack::object_handle oh;
while(pac.next(oh)) {
std::cout << oh.get() << std::endl;
msgpack::unpacked result;
while(pac.next(&result)) {
std::cout << result.get() << std::endl;
}
// results:
// $ g++ -Ipath_to_msgpack/include stream.cc -o stream
// $ g++ -Ipath_to_msgpack/include -DMSGPACK_DISABLE_LEGACY_NIL -DMSGPACK_DISABLE_LEGACY_CONVERT stream.cc -o stream
// $ ./stream
// "Log message ... 1"
// "Log message ... 2"
@@ -91,6 +93,8 @@ int main() {
}
```
See [MSGPACK_DISABLE_LEGACY_NIL](https://github.com/msgpack/msgpack-c/wiki/v1_1_cpp_configure#msgpack_disable_legacy_nil-since-140) and [MSGPACK_DISABLE_LEGACY_CONVERT](https://github.com/msgpack/msgpack-c/wiki/v1_1_cpp_configure#msgpack_disable_legacy_convert-since-140).
### Streaming into an array or map
```cpp
@@ -98,7 +102,7 @@ int main() {
#include <iostream>
#include <string>
int main() {
int main(void) {
// serializes multiple objects into one message containing an array using msgpack::packer.
msgpack::sbuffer buffer;
@@ -139,7 +143,7 @@ public:
MSGPACK_DEFINE(m_str, m_vec);
};
int main() {
int main(void) {
std::vector<myclass> vec;
// add some elements into vec...
@@ -147,10 +151,10 @@ int main() {
msgpack::sbuffer sbuf;
msgpack::pack(sbuf, vec);
msgpack::object_handle oh =
msgpack::unpack(sbuf.data(), sbuf.size());
msgpack::unpacked msg;
msgpack::unpack(&msg, sbuf.data(), sbuf.size());
msgpack::object obj = oh.get();
msgpack::object obj = msg.get();
// you can convert object to myclass directly
std::vector<myclass> rvec;

225
README.md
View File

@@ -1,10 +1,9 @@
`msgpack` for C++
`msgpack` for C/C++
===================
Version 4.1.1 [![Build Status](https://github.com/msgpack/msgpack-c/workflows/CI/badge.svg?branch=cpp_master)](https://github.com/msgpack/msgpack-c/actions) [![Build status](https://ci.appveyor.com/api/projects/status/8kstcgt79qj123mw/branch/cpp_master?svg=true)](https://ci.appveyor.com/project/redboltz/msgpack-c/branch/cpp_master)
[![codecov](https://codecov.io/gh/msgpack/msgpack-c/branch/cpp_master/graph/badge.svg)](https://codecov.io/gh/msgpack/msgpack-c/branch/cpp_master)
Version 1.4.1 [![Build Status](https://travis-ci.org/msgpack/msgpack-c.svg?branch=master)](https://travis-ci.org/msgpack/msgpack-c) [![Build status](https://ci.appveyor.com/api/projects/status/8kstcgt79qj123mw/branch/master?svg=true)](https://ci.appveyor.com/project/redboltz/msgpack-c/branch/master)
It's like JSON but smaller and faster.
It's like JSON but small and fast.
Overview
--------
@@ -12,19 +11,64 @@ Overview
[MessagePack](http://msgpack.org/) is an efficient binary serialization
format, which lets you exchange data among multiple languages like JSON,
except that it's faster and smaller. Small integers are encoded into a
single byte and short strings require only one extra byte in
single byte while typical short strings require only one extra byte in
addition to the strings themselves.
Example
-------
In C:
```c
#include <msgpack.h>
#include <stdio.h>
int main(void)
{
/* msgpack::sbuffer is a simple buffer implementation. */
msgpack_sbuffer sbuf;
msgpack_sbuffer_init(&sbuf);
/* serialize values into the buffer using msgpack_sbuffer_write callback function. */
msgpack_packer pk;
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);
/* deserialize the buffer into msgpack_object instance. */
/* deserialized object is valid during the msgpack_zone instance alive. */
msgpack_zone mempool;
msgpack_zone_init(&mempool, 2048);
msgpack_object deserialized;
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;
}
```
See [`QUICKSTART-C.md`](./QUICKSTART-C.md) for more details.
In C++:
```c++
#include <msgpack.hpp>
#include <string>
#include <iostream>
#include <sstream>
int main()
int main(void)
{
msgpack::type::tuple<int, bool, std::string> src(1, true, "example");
@@ -39,11 +83,12 @@ int main()
// deserialize the buffer into msgpack::object instance.
std::string str(buffer.str());
msgpack::object_handle oh =
msgpack::unpack(str.data(), str.size());
msgpack::unpacked result;
// deserialized object is valid during the msgpack::object_handle instance is alive.
msgpack::object deserialized = oh.get();
msgpack::unpack(result, str.data(), str.size());
// deserialized object is valid during the msgpack::unpacked instance alive.
msgpack::object deserialized = result.get();
// msgpack::object supports ostream.
std::cout << deserialized << std::endl;
@@ -53,157 +98,111 @@ int main()
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;
}
```
See [`QUICKSTART-CPP.md`](./QUICKSTART-CPP.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.
Experimental support for removing boost dependency
For cmake:
```
cmake -DMSGPACK_USE_BOOST=OFF ..
```
NOTE: `-DMSGPACK_BUILD_TESTS=ON` doesn't work with `-DMSGPACK_USE_BOOST=OFF`.
For C++ compiler
```
clang++ -DMSGPACK_NO_BOOST your_code.cpp
```
Usage
-----
- If you build your project with cmake, you can find msgpack-c with a
canonical cmake-way:
### C++ Header Only Library
```cmake
# ...
find_package(msgpack REQUIRED)
# ...
target_link_libraries(your_target_name <PRIVATE/PUBLIC/INTERFACE> msgpackc-cxx)
# ...
```
When you use msgpack on C++03 and C++11, you can just add
msgpack-c/include to your include path:
This will search for `msgpack` cmake package in a system prefix and in
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.
g++ -I msgpack-c/include -DMSGPACK_DISABLE_LEGACY_NIL -DMSGPACK_DISABLE_LEGACY_CONVERT your_source_file.cpp
A usage example can be found at [test-install](test-install) directory.
See [MSGPACK_DISABLE_LEGACY_NIL](https://github.com/msgpack/msgpack-c/wiki/v1_1_cpp_configure#msgpack_disable_legacy_nil-since-140) and [MSGPACK_DISABLE_LEGACY_CONVERT](https://github.com/msgpack/msgpack-c/wiki/v1_1_cpp_configure#msgpack_disable_legacy_convert-since-140).
- If you do not use cmake, you can just add path yo msgpack-c and boost
headers to your include path:
If you want to use C version of msgpack, you need to build it. You can
also install the C and C++ versions of msgpack.
```bash
g++ -I msgpack-c/include -I path_to_boost your_source_file.cpp
```
### Building and Installing
Building and Installing
-----------------------
#### Install from git repository
### Install from git repository
#### Using the Terminal (CLI)
##### Using autotools
You will need:
- `gcc >= 4.1.0`
- `cmake >= 3.1.0`
- `gcc >= 4.1.0` or `clang >= 3.3.0`
- `autoconf >= 2.60`
- `automake >= 1.10`
- `libtool >= 2.2.4`
C++03:
The build steps below are for C and C++03. If compiling for C++11,
add `-std=c++11` to the environmental variable `CXXFLAGS` with
`export CXXFLAGS="$CXXFLAGS -std=c++11"` prior to following the
directions below.
```bash
git clone https://github.com/msgpack/msgpack-c.git
cd msgpack-c
git checkout cpp_master
cmake .
sudo cmake --build . --target install
$ git clone https://github.com/msgpack/msgpack-c
$ cd msgpack-c
$ ./bootstrap
$ ./configure
$ make
```
If you want to build tests with different C++ version, you can use
`MSGPACK_CXX11`, `MSGPACK_CXX14`, `MSGPACK_CXX17`, `MSGPACK_CXX20` options.
Just replace the line
You can install the resulting library like this:
```bash
cmake .
$ sudo make install
```
##### Using cmake
with a line like that:
###### Using the Terminal (CLI)
```bash
cmake -DMSGPACK_CXX20=ON .
```
You will need:
Note that these flags do not affect installation. They just switch test cases.
All files are installed in every settings.
- `gcc >= 4.1.0`
- `cmake >= 2.8.0`
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:
C and C++03:
```bash
cmake -DCMAKE_INSTALL_PREFIX=/your/custom/prefix .
```
$ git clone https://github.com/msgpack/msgpack-c.git
$ cd msgpack-c
$ cmake .
$ make
$ sudo make install
Other useful options:
If you want to setup C++11 version of msgpack instead,
execute the following commands:
- `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)
- `MSGPACK_CHAR_SIGN` (not set explicitly by default): char sign to use (signed or unsigned)
- `MSGPACK_USE_STATIC_BOOST` (default `OFF`): statically link with boost libraries
$ git clone https://github.com/msgpack/msgpack-c.git
$ cd msgpack-c
$ cmake -DMSGPACK_CXX11=ON .
$ sudo make install
#### 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/
2. Launch [cmake GUI client](http://www.cmake.org/cmake/resources/software.html).
1. Launch [cmake GUI client](http://www.cmake.org/cmake/resources/software.html).
3. Set 'Where is the source code:' text box and
'Where to build the binaries:' text box.
2. Set 'Where is the source code:' text box and 'Where to build
the binaries:' text box.
4. Click 'Configure' button.
3. Click 'Configure' button.
5. Choose your Visual Studio version.
4. Choose your Visual Studio version.
6. Click 'Generate' button.
5. Click 'Generate' button.
7. Open the created msgpack.sln on Visual Studio.
6. Open the created msgpack.sln on Visual Studio.
8. Build all.
7. Build all.
Documentation
-------------
### Documentation
You can get additional information including the tutorial on the
You can get addtional information on the
[wiki](https://github.com/msgpack/msgpack-c/wiki).
Contributing

View File

@@ -1,66 +1,42 @@
version: 4.1.1.{build}
branches:
only:
- cpp_master
version: 1.1.0.{build}
before_build:
- appveyor DownloadFile http://googletest.googlecode.com/files/gtest-1.7.0.zip -FileName gtest-1.7.0.zip
- 7z x gtest-1.7.0.zip > NUL
- cd gtest-1.7.0
- md build
- cd build
- cmake -DBUILD_SHARED_LIBS=ON ..
- cmake --build . --config Release
- cd ..
- cd ..
- appveyor DownloadFile http://zlib.net/zlib-1.2.8.tar.gz -FileName zlib-1.2.8.tar.gz
- 7z x zlib-1.2.8.tar.gz > NUL
- 7z x zlib-1.2.8.tar > NUL
- cd zlib-1.2.8
- md build
- cd build
- cmake ..
- cmake --build . --config Release
- copy zconf.h ..
- cd ..
- cd ..
environment:
matrix:
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
cpp11: -DMSGPACK_CXX11=OFF
msvc: '"Visual Studio 12 2013"'
boost_prefix: C:\Libraries\boost_1_58_0
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
- cpp11: -DMSGPACK_CXX11=ON
boost: -DMSGPACK_BOOST=ON
- cpp11: -DMSGPACK_CXX11=OFF
boost: -DMSGPACK_BOOST=ON
- cpp11: -DMSGPACK_CXX11=ON
boost: -DMSGPACK_BOOST=OFF
- cpp11: -DMSGPACK_CXX11=OFF
boost: -DMSGPACK_BOOST=OFF
build_script:
- ps: |
appveyor DownloadFile http://zlib.net/zlib-1.2.11.tar.gz -FileName zlib-1.2.11.tar.gz
7z x zlib-1.2.11.tar.gz 2> $null
7z x zlib-1.2.11.tar 2> $null
cd zlib-1.2.11
md build
md prefix
cd build
cmake `
-G $env:msvc `
-D CMAKE_INSTALL_PREFIX="$env:APPVEYOR_BUILD_FOLDER\zlib-1.2.11\prefix" `
..
if ($LastExitCode -ne 0) { exit $LastExitCode }
cmake --build . --target install --config Release
if ($LastExitCode -ne 0) { exit $LastExitCode }
cd ..\..
md build
md prefix
cd build
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 }
- md build
- cd build
- cmake %cpp11% %boost% -DMSGPACK_BOOST_DIR=C:\Libraries\\boost_1_58_0 -DGTEST_LIBRARY=%APPVEYOR_BUILD_FOLDER%\gtest-1.7.0\build\Release\gtest.lib -DGTEST_MAIN_LIBRARY=%APPVEYOR_BUILD_FOLDER%\gtest-1.7.0\build\Release\gtest_main.lib -DGTEST_INCLUDE_DIR=%APPVEYOR_BUILD_FOLDER%\gtest-1.7.0\include -DZLIB_LIBRARY=%APPVEYOR_BUILD_FOLDER%\zlib-1.2.8\build\Release\zlib.lib -DZLIB_INCLUDE_DIR=%APPVEYOR_BUILD_FOLDER%\zlib-1.2.8 ..
- cmake --build . --config Release
test_script:
- set PATH=%PATH%;%APPVEYOR_BUILD_FOLDER%\zlib-1.2.11\build\Release;%APPVEYOR_BUILD_FOLDER%\build\release;%boost_prefix%\%boost_subdir%
- ctest -VV -C Release
- set PATH=%PATH%;%APPVEYOR_BUILD_FOLDER%\gtest-1.7.0\build\Release;%APPVEYOR_BUILD_FOLDER%\zlib-1.2.8\build\Release;%APPVEYOR_BUILD_FOLDER%\build\release
- ctest -V

121
bootstrap Executable file
View File

@@ -0,0 +1,121 @@
#!/bin/sh
# vim:ts=4:sw=4
# Calls autotools to build configure script and Makefile.in.
# Generated automatically using bootstrapper 0.2.1
# http://bootstrapper.sourceforge.net/
#
# Copyright (C) 2002 Anthony Ventimiglia
#
# This bootstrap script is free software; you can redistribute
# it and/or modify it under the terms of the GNU General Public
# License as published by the Free Software Foundation; either
# version 2 of the License, or (at your option) any later version.
#
#
# Calls proper programs to create configure script and Makefile.in files.
# if run with the --clean option, bootstrap removes files it generates. To
# clean all autogenerated files (eg: for cvs imports) first run
# make distclean, then bootstrap --clean
# see bootstrapper(1) for more infor
if test x"$1" = x"--help"; then
echo "$0: automatic bootstrapping utility for GNU Autotools"
echo " cleans up old autogenerated files and runs autoconf,"
echo " automake and aclocal on local directory"
echo
echo " --clean clean up auto-generated files without"
echo " creating new scripts"
echo
exit 0
fi
mkdir -p ac
test -f AUTHORS || touch AUTHORS
test -f COPYING || touch COPYING
test -f ChangeLog || cp -f CHANGELOG.md ChangeLog
test -f NEWS || touch NEWS
test -f NOTICE || touch NOTICE
test -f README || cp -f README.md README
ACLOCAL="aclocal"
ACLOCAL_FILES="aclocal.m4"
ALWAYS_CLEAN="config.status config.log config.cache libtool"
AUTOCONF="autoconf"
AUTOCONF_FILES="configure"
AUTOHEADER="autoheader"
AUTOHEADER_FILES=""
AUTOMAKE="automake --add-missing --copy"
AUTOMAKE_FILES="config.sub stamp-h.in ltmain.sh missing mkinstalldirs install-sh config.guess"
CONFIG_AUX_DIR="."
CONFIG_FILES="stamp-h ltconfig"
CONFIG_HEADER=""
if [ x`uname` = x"Darwin" ]; then
LIBTOOLIZE="glibtoolize --force --copy"
else
LIBTOOLIZE="libtoolize --force --copy"
fi
LIBTOOLIZE_FILES="config.sub ltmain.sh config.guess"
RM="rm"
SUBDIRS="[]"
# These are files created by configure, so we'll always clean them
for i in $ALWAYS_CLEAN; do
test -f $i && \
$RM $i
done
if test x"$1" = x"--clean"; then
#
#Clean Files left by previous bootstrap run
#
if test -n "$CONFIG_AUX_DIR";
then CONFIG_AUX_DIR="$CONFIG_AUX_DIR/"
fi
# Clean Libtoolize generated files
for cf in $LIBTOOLIZE_FILES; do
cf="$CONFIG_AUX_DIR$cf"
test -f $cf && \
$RM $cf
done
#aclocal.m4 created by aclocal
test -f $ACLOCAL_FILES && $RM $ACLOCAL_FILES
#Clean Autoheader Generated files
for cf in $AUTOHEADER_FILES; do
cf=$CONFIG_AUX_DIR$cf
test -f $cf && \
$RM $cf
done
# remove config header (Usaually config.h)
test -n "$CONFIG_HEADER" && test -f $CONFIG_HEADER && $RM $CONFIG_HEADER
#Clean Automake generated files
for cf in $AUTOMAKE_FILES; do
cf=$CONFIG_AUX_DIR$cf
test -f $cf && \
$RM $cf
done
for i in $SUBDIRS; do
test -f $i/Makefile.in && \
$RM $i/Makefile.in
done
#Autoconf generated files
for cf in $AUTOCONF_FILES; do
test -f $cf && \
$RM $cf
done
for cf in $CONFIG_FILES; do
cf="$CONFIG_AUX_DIR$cf"
test -f $cf && \
$RM $cf
done
else
$LIBTOOLIZE
$ACLOCAL
$AUTOHEADER
$AUTOMAKE
$AUTOCONF
fi

63
ci/build_autotools.sh Executable file
View File

@@ -0,0 +1,63 @@
#!/bin/sh
./bootstrap
ret=$?
if [ $ret -ne 0 ]
then
exit $ret
fi
if [ $1 = "cpp11" ]
then
cpp11="-std=c++11"
else
cpp11=""
fi
if [ $2 = "32" ]
then
bit32="-m32"
else
bit32=""
fi
if [ $3 = "boost" ]
then
boost="-DMSGPACK_USE_BOOST"
else
boost=""
fi
./configure CFLAGS="$bit32 -f${CHAR_SIGN}-char" CXXFLAGS="$bit32 -f${CHAR_SIGN}-char $cpp11 $boost -I$4"
ret=$?
if [ $ret -ne 0 ]
then
exit $ret
fi
make
ret=$?
if [ $ret -ne 0 ]
then
exit $ret
fi
make check
ret=$?
if [ $ret -ne 0 ]
then
exit $ret
fi
make install DESTDIR=`pwd`/build/install
ret=$?
if [ $ret -ne 0 ]
then
exit $ret
fi
exit 0

View File

@@ -1,37 +1,91 @@
#!/bin/bash
build_dir="$CXX-build"
prefix_dir="`pwd`/$CXX-prefix"
mkdir $build_dir || exit 1
mkdir $prefix_dir || exit 1
mkdir build
if [ "${ARCH}" == "32" ]; then
export BIT32="ON"
export ARCH_FLAG="-m32"
else
export BIT32="OFF"
export ARCH_FLAG="-m64"
ret=$?
if [ $ret -ne 0 ]
then
exit $ret
fi
cmake \
-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
cd build
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
if [ $1 = "cpp11" ]
then
cpp11="-DMSGPACK_CXX11=ON"
else
cpp11=""
fi
if [ "${ARCH}" != "32" ] && [ `uname` = "Linux" ]; then
ctest -T memcheck --test-dir $build_dir | tee memcheck.log
if [ $2 = "32" ]
then
bit32="-DMSGPACK_32BIT=ON"
else
bit32=""
fi
if [ $3 = "boost" ]
then
boost="-DMSGPACK_BOOST=ON"
else
boost=""
fi
if [ "$4" != "" ]
then
boost_dir="-DMSGPACK_BOOST_DIR=$4"
else
boost_dir=""
fi
if [ "$5" = "OFF" ]
then
shared="-DMSGPACK_ENABLE_SHARED=OFF"
else
shared=""
fi
cmake $cpp11 $bit32 $boost $boost_dir $shared -DMSGPACK_CHAR_SIGN=${CHAR_SIGN} ..
ret=$?
if [ $ret -ne 0 ]
then
exit $ret
fi
make
ret=$?
if [ $ret -ne 0 ]
then
exit $ret
fi
make test
ret=$?
if [ $ret -ne 0 ]
then
exit $ret
fi
make install DESTDIR=`pwd`/install
ret=$?
if [ $ret -ne 0 ]
then
exit $ret
fi
if [ "$2" != "32" ]
then
ctest -T memcheck | tee memcheck.log
ret=${PIPESTATUS[0]}
if [ $ret -ne 0 ]
@@ -46,15 +100,4 @@ if [ "${ARCH}" != "32" ] && [ `uname` = "Linux" ]; then
fi
fi
if [ "${ARCH}" != "32" ]; then
cd test-install || exit 1
mkdir $build_dir
cmake \
-D CMAKE_PREFIX_PATH="$prefix_dir;${HOME}/boost-prefix/${ARCH}" \
-B $build_dir \
-S . || exit 1
cmake --build $build_dir --target all || exit 1
$build_dir/test-install || exit 1
fi
exit 0

View File

@@ -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

View File

@@ -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}

View File

@@ -1,55 +0,0 @@
# Check prereqs
FIND_PROGRAM(GCOV_PATH gcov)
FIND_PROGRAM(LCOV_PATH lcov)
FIND_PROGRAM(GENHTML_PATH genhtml)
IF(NOT GCOV_PATH)
MESSAGE(FATAL_ERROR "gcov not found! Aborting...")
ENDIF()
IF(NOT CMAKE_COMPILER_IS_GNUCC AND NOT CMAKE_COMPILER_IS_GNUCXX)
# Clang version 3.0.0 and greater now supports gcov as well.
MESSAGE(STATUS "Compiler is not GNU gcc! Clang Version 3.0.0 and greater supports gcov as well, but older versions don't.")
IF(NOT "${CMAKE_C_COMPILER_ID}" MATCHES "Clang" AND NOT "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
MESSAGE(FATAL_ERROR "Compiler is not GNU gcc! Aborting...")
ENDIF()
ENDIF()
SET(COVERAGE_FLAGS "-g -O0 --coverage")
FUNCTION(SETUP_TARGET_FOR_COVERAGE _targetname _testrunner _outputname)
IF(NOT LCOV_PATH)
MESSAGE(FATAL_ERROR "lcov not found! Aborting...")
ENDIF()
IF(NOT GENHTML_PATH)
MESSAGE(FATAL_ERROR "genhtml not found! Aborting...")
ENDIF()
# Setup target
ADD_CUSTOM_TARGET(${_targetname}
# Cleanup lcov
${LCOV_PATH} --directory . --zerocounters
# Run tests
COMMAND ${_testrunner} ${ARGV3}
# Capturing lcov counters and generating report
COMMAND ${LCOV_PATH} --directory . --capture --output-file ${_outputname}.info --base-directory ${CMAKE_SOURCE_DIR} --no-external --quiet
COMMAND ${LCOV_PATH} --remove ${_outputname}.info '*/test/*' '*/fuzz/*' --output-file ${_outputname}.info.cleaned --quiet
COMMAND ${GENHTML_PATH} -o ${_outputname} ${_outputname}.info.cleaned --prefix ${CMAKE_SOURCE_DIR}
# COMMAND ${CMAKE_COMMAND} -E remove ${_outputname}.info ${_outputname}.info.cleaned
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
COMMENT "Resetting code coverage counters to zero.\nProcessing code coverage counters and generating report."
)
# Show info where to find the report
ADD_CUSTOM_COMMAND(TARGET ${_targetname} POST_BUILD
COMMAND ;
COMMENT "Open ./${_outputname}/index.html in your browser to view the coverage report."
)
ENDFUNCTION()

View File

@@ -1,36 +0,0 @@
codecov:
notify:
require_ci_to_pass: yes
coverage:
precision: 2
round: down
range: "70...100"
status:
project: yes
patch: yes
changes: no
parsers:
gcov:
branch_detection:
conditional: yes
loop: yes
method: no
macro: no
comment:
layout: "header, diff"
behavior: default
require_changes: no
ignore:
- "test"
- "fuzz"
- "erb"
- "ci"
- "cmake"
- "examle"
- "external"
- "usr"

98
configure.in Normal file
View File

@@ -0,0 +1,98 @@
AC_INIT(msgpack, m4_esyscmd([cat include/msgpack/version_master.h | tr -d "\n" | sed -e 's/#define MSGPACK_VERSION_MAJOR[[:space:]]*\([[:alnum:]]*\)/\1./g' -e 's/#define MSGPACK_VERSION_MINOR[[:space:]]*\([[:alnum:]]*\)/\1./g' -e 's/#define MSGPACK_VERSION_REVISION[[:space:]]*\([[:alnum:]]*\)/\1/g' | tr -d "\n"]))
AC_CONFIG_AUX_DIR(ac)
AM_INIT_AUTOMAKE
AC_CONFIG_HEADER(config.h)
AC_SUBST(CFLAGS)
CFLAGS="-O3 -Wall -Wextra -Werror $CFLAGS"
AC_SUBST(CXXFLAGS)
CXXFLAGS="-O3 -Wall -Wextra -Wno-mismatched-tags -Werror $CXXFLAGS"
AC_PROG_CC
AC_MSG_CHECKING([if C++ API is enabled])
AC_ARG_ENABLE(cxx,
AS_HELP_STRING([--disable-cxx],
[don't build C++ API]) ) #'
AC_MSG_RESULT([$enable_cxx])
if test "$enable_cxx" != "no"; then
AC_PROG_CXX
AM_PROG_CC_C_O
fi
AM_CONDITIONAL(ENABLE_CXX, test "$enable_cxx" != "no")
AC_PROG_LIBTOOL
AM_PROG_AS
AC_MSG_CHECKING([if debug option is enabled])
AC_ARG_ENABLE(debug,
AS_HELP_STRING([--disable-debug],
[disable assert macros and omit -g option]) )
AC_MSG_RESULT([$enable_debug])
if test "$enable_debug" != "no"; then
CXXFLAGS="$CXXFLAGS -g"
CFLAGS="$CFLAGS -g"
else
CXXFLAGS="$CXXFLAGS -DNDEBUG"
CFLAGS="$CFLAGS -DNDEBUG"
fi
AC_CACHE_CHECK([for __sync_* atomic operations], msgpack_cv_atomic_ops, [
AC_TRY_LINK([
int atomic_sub(int i) { return __sync_sub_and_fetch(&i, 1); }
int atomic_add(int i) { return __sync_add_and_fetch(&i, 1); }
], [atomic_sub(1); atomic_add(1);], msgpack_cv_atomic_ops="yes")
])
if test "$msgpack_cv_atomic_ops" != "yes"; then
if test "$enable_cxx" = "no"; then
AC_MSG_ERROR([__sync_* atomic operations are not found. Try to enable C++ support.
If you are using gcc >= 4.1 and the default target CPU architecture is "i386", try to
add CFLAGS="-march=i686" and CXXFLAGS="-march=i686" options to ./configure as follows:
$ ./configure CFLAGS="-march=i686" CXXFLAGS="-march=i686"
])
fi
AC_LANG_PUSH([C++])
AC_CACHE_CHECK([for __gnu_cxx::__exchange_and_add], msgpack_cv_gcc_cxx_atomic_ops, [
AC_TRY_LINK([
#include <bits/atomicity.h>
int atomic_sub(int i) { return __gnu_cxx::__exchange_and_add(&i, -1) - 1; }
int atomic_add(int i) { return __gnu_cxx::__exchange_and_add(&i, 1) + 1; }
], [atomic_sub(1); atomic_add(1);], msgpack_cv_gcc_cxx_atomic_ops="yes")
])
AC_LANG_POP([C++])
if test "$msgpack_cv_gcc_cxx_atomic_ops" != "yes"; then
AC_MSG_ERROR([__sync_* atomic operations nor __gnu_cxx::__exchange_and_add are not found.
If you are using gcc >= 4.1 and the default target CPU architecture is "i386", try to
add CFLAGS="-march=i686" and CXXFLAGS="-march=i686" options to ./configure as follows:
$ ./configure CFLAGS="-march=i686" CXXFLAGS="-march=i686"
])
else
enable_gcc_cxx_atomic=yes
fi
fi
AM_CONDITIONAL(ENABLE_GCC_CXX_ATOMIC, test "$enable_gcc_cxx_atomic" = "yes")
major=`echo $VERSION | sed 's/\([[0-9]]*\)\.\([[0-9]]*\).\([[0-9]]*\).*/\1/'`
minor=`echo $VERSION | sed 's/\([[0-9]]*\)\.\([[0-9]]*\).\([[0-9]]*\).*/\2/'`
revision=`echo $VERSION | sed 's/\([[0-9]]*\)\.\([[0-9]]*\).\([[0-9]]*\).*/\3/'`
AC_SUBST(VERSION_MAJOR, $major)
AC_SUBST(VERSION_MINOR, $minor)
AC_SUBST(VERSION_REVISION, $revision)
AC_OUTPUT([Makefile
msgpack.pc
src/Makefile
test/Makefile])

View File

@@ -1,27 +1,91 @@
//
// MessagePack for C++ static resolution routine
//
// Copyright (C) 2008-2016 FURUHASHI Sadayuki and KONDO Takatoshi
// 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)
//
#ifndef MSGPACK_V1_CPP03_DEFINE_ARRAY_HPP
#define MSGPACK_V1_CPP03_DEFINE_ARRAY_HPP
#ifndef MSGPACK_CPP03_DEFINE_ARRAY_HPP
#define MSGPACK_CPP03_DEFINE_ARRAY_HPP
#include "msgpack/v1/adaptor/detail/cpp03_define_array_decl.hpp"
#include "msgpack/versioning.hpp"
#include "msgpack/adaptor/msgpack_tuple.hpp"
#include "msgpack/adaptor/adaptor_base.hpp"
#include "msgpack/object_fwd.hpp"
#define MSGPACK_DEFINE_ARRAY(...) \
template <typename Packer> \
void msgpack_pack(Packer& pk) const \
{ \
msgpack::type::make_define_array(__VA_ARGS__).msgpack_pack(pk); \
} \
void msgpack_unpack(msgpack::object const& o) \
{ \
msgpack::type::make_define_array(__VA_ARGS__).msgpack_unpack(o); \
}\
template <typename MSGPACK_OBJECT> \
void msgpack_object(MSGPACK_OBJECT* o, msgpack::zone& z) const \
{ \
msgpack::type::make_define_array(__VA_ARGS__).msgpack_object(o, z); \
}
#define MSGPACK_BASE_ARRAY(base) (*const_cast<base *>(static_cast<base const*>(this)))
// MSGPACK_ADD_ENUM must be used in the global namespace.
#define MSGPACK_ADD_ENUM(enum_name) \
namespace msgpack { \
/** @cond */ \
MSGPACK_API_VERSION_NAMESPACE(v1) { \
/** @endcond */ \
namespace adaptor { \
template<> \
struct convert<enum_name> { \
msgpack::object const& operator()(msgpack::object const& o, enum_name& v) const {\
int tmp; \
o >> tmp; \
v = static_cast<enum_name>(tmp); \
return o; \
} \
}; \
template<> \
struct object<enum_name> { \
void operator()(msgpack::object& o, const enum_name& v) const {\
o << static_cast<int>(v); \
} \
}; \
template<> \
struct object_with_zone<enum_name> { \
void operator()(msgpack::object::with_zone& o, const enum_name& v) const { \
o << static_cast<int>(v); \
} \
}; \
template<> \
struct pack<enum_name> { \
template <typename Stream> \
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const enum_name& v) const { \
return o << static_cast<int>(v); \
} \
}; \
} \
/** @cond */ \
} \
/** @endcond */ \
}
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
template <>
struct define_array<> {
typedef define_array<> value_type;
@@ -38,7 +102,7 @@ struct define_array<> {
void msgpack_object(msgpack::object* o, msgpack::zone&) const
{
o->type = msgpack::type::ARRAY;
o->via.array.ptr = MSGPACK_NULLPTR;
o->via.array.ptr = nullptr;
o->via.array.size = 0;
}
};
@@ -66,16 +130,14 @@ struct define_array<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> {
msgpack::object *ptr = o.via.array.ptr;
switch(size) {
default:<%(i).downto(0) {|j|%>
case <%=j+1%>: ptr[<%=j%>].convert(a<%=j%>);
// fallthrough
<%}%>
case <%=j+1%>: ptr[<%=j%>].convert(a<%=j%>);<%}%>
}
}
}
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.ptr = static_cast<msgpack::object*>(z.allocate_align(sizeof(msgpack::object)*<%=i+1%>));
o->via.array.size = <%=i+1%>;
<%0.upto(i) {|j|%>
o->via.array.ptr[<%=j%>] = msgpack::object(a<%=j%>, z);<%}%>
@@ -107,4 +169,5 @@ inline define_array<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> make_define_array(A0& a0
/// @endcond
} // namespace msgpack
#endif // MSGPACK_V1_CPP03_DEFINE_ARRAY_HPP
#endif // MSGPACK_CPP03_DEFINE_ARRAY_HPP

View File

@@ -1,21 +1,70 @@
//
// MessagePack for C++ static resolution routine
//
// Copyright (C) 2015-2016 KONDO Takatoshi
// 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_V1_CPP03_DEFINE_MAP_HPP
#define MSGPACK_V1_CPP03_DEFINE_MAP_HPP
#ifndef MSGPACK_CPP03_DEFINE_MAP_HPP
#define MSGPACK_CPP03_DEFINE_MAP_HPP
#include "msgpack/v1/adaptor/detail/cpp03_define_map_decl.hpp"
// BOOST_PP_VARIADICS is defined in boost/preprocessor/config/config.hpp
// http://www.boost.org/libs/preprocessor/doc/ref/variadics.html
// However, supporting compiler detection is not complete. msgpack-c requires
// variadic macro arguments support. So BOOST_PP_VARIADICS is defined here explicitly.
#if !defined(MSGPACK_PP_VARIADICS)
#define MSGPACK_PP_VARIADICS
#endif
#include <msgpack/preprocessor.hpp>
#include "msgpack/versioning.hpp"
#include "msgpack/adaptor/msgpack_tuple.hpp"
#include "msgpack/adaptor/adaptor_base.hpp"
#include "msgpack/object_fwd.hpp"
#include <map>
#define MSGPACK_DEFINE_MAP_EACH_PROC(r, data, elem) \
MSGPACK_PP_IF( \
MSGPACK_PP_IS_BEGIN_PARENS(elem), \
elem, \
(MSGPACK_PP_STRINGIZE(elem))(elem) \
)
#define MSGPACK_DEFINE_MAP_IMPL(...) \
MSGPACK_PP_SEQ_TO_TUPLE( \
MSGPACK_PP_SEQ_FOR_EACH( \
MSGPACK_DEFINE_MAP_EACH_PROC, \
0, \
MSGPACK_PP_VARIADIC_TO_SEQ(__VA_ARGS__) \
) \
)
#define MSGPACK_DEFINE_MAP(...) \
template <typename Packer> \
void msgpack_pack(Packer& pk) const \
{ \
msgpack::type::make_define_map \
MSGPACK_DEFINE_MAP_IMPL(__VA_ARGS__) \
.msgpack_pack(pk); \
} \
void msgpack_unpack(msgpack::object const& o) \
{ \
msgpack::type::make_define_map \
MSGPACK_DEFINE_MAP_IMPL(__VA_ARGS__) \
.msgpack_unpack(o); \
}\
template <typename MSGPACK_OBJECT> \
void msgpack_object(MSGPACK_OBJECT* o, msgpack::zone& z) const \
{ \
msgpack::type::make_define_map \
MSGPACK_DEFINE_MAP_IMPL(__VA_ARGS__) \
.msgpack_object(o, z); \
}
#define MSGPACK_BASE_MAP(base) \
(MSGPACK_PP_STRINGIZE(base))(*const_cast<base *>(static_cast<base const*>(this)))
namespace msgpack {
/// @cond
@@ -23,7 +72,12 @@ 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
template <>
struct define_map<> {
template <typename Packer>
@@ -38,7 +92,7 @@ struct define_map<> {
void msgpack_object(msgpack::object* o, msgpack::zone&) const
{
o->type = msgpack::type::MAP;
o->via.map.ptr = MSGPACK_NULLPTR;
o->via.map.ptr = nullptr;
o->via.map.size = 0;
}
};
@@ -61,7 +115,6 @@ struct define_map<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> {
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(
@@ -83,7 +136,7 @@ struct define_map<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> {
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.ptr = static_cast<msgpack::object_kv*>(z.allocate_align(sizeof(msgpack::object_kv)*<%=(i+1)/2%>));
o->via.map.size = <%=(i+1)/2%>;
<%0.step(i,2) {|j|%>
o->via.map.ptr[<%=j/2%>].key = msgpack::object(a<%=j%>, z);
@@ -117,4 +170,4 @@ inline define_map<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> make_define_map(A0& a0<%1.
/// @endcond
} // namespace msgpack
#endif // MSGPACK_V1_CPP03_DEFINE_MAP_HPP
#endif // MSGPACK_CPP03_DEFINE_MAP_HPP

View File

@@ -1,16 +1,18 @@
//
// MessagePack for C++ static resolution routine
//
// Copyright (C) 2008-2016 FURUHASHI Sadayuki and KONDO Takatoshi
// Copyright (C) 2008-2013 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
#ifndef MSGPACK_CPP03_MSGPACK_TUPLE_HPP
#define MSGPACK_CPP03_MSGPACK_TUPLE_HPP
#include "msgpack/v1/adaptor/msgpack_tuple_decl.hpp"
#include "msgpack/versioning.hpp"
#include "msgpack/object.hpp"
#include "msgpack/adaptor/adaptor_base.hpp"
namespace msgpack {
@@ -24,6 +26,17 @@ namespace type {
// 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 {
typedef T type;
@@ -83,7 +96,6 @@ struct tuple<> {
tuple() {}
tuple(msgpack::object const& o) { o.convert(*this); }
typedef tuple<> value_type;
std::size_t size() const { return 0; }
};
/// @cond
@@ -91,7 +103,6 @@ struct tuple<> {
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%>)<%}%> {}
@@ -121,7 +132,7 @@ inline 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%><%}%>)
inline tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> make_tuple(typename tuple_type<A0>::transparent_reference a0<%1.upto(i) {|j|%>, typename tuple_type<A<%=j%>>::transparent_reference a<%=j%><%}%>)
{
return tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>>(a0<%1.upto(i) {|j|%>, a<%=j%><%}%>);
}
@@ -150,10 +161,10 @@ struct convert<type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> > {
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(); }
if(o.via.array.size < <%=i+1%>) { 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%>>());<%}%>
o.via.array.ptr[<%=j%>].msgpack::object::convert<typename type::tuple_type<A<%=j%>>::type>(v.template get<<%=j%>>());<%}%>
return o;
}
};
@@ -194,7 +205,7 @@ struct object_with_zone<type::tuple<> > {
msgpack::object::with_zone& o,
const type::tuple<>&) const {
o.type = msgpack::type::ARRAY;
o.via.array.ptr = MSGPACK_NULLPTR;
o.via.array.ptr = nullptr;
o.via.array.size = 0;
}
};
@@ -207,7 +218,7 @@ struct object_with_zone<type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> > {
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.ptr = static_cast<msgpack::object*>(o.zone.allocate_align(sizeof(msgpack::object)*<%=i+1%>));
o.via.array.size = <%=i+1%>;
<%0.upto(i) {|j|%>
o.via.array.ptr[<%=j%>] = msgpack::object(v.template get<<%=j%>>(), o.zone);<%}%>
@@ -224,4 +235,4 @@ struct object_with_zone<type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> > {
} // namespace msgpack
#endif // MSGPACK_V1_CPP03_MSGPACK_TUPLE_HPP
#endif // MSGPACK_CPP03_MSGPACK_TUPLE_HPP

View File

@@ -1,25 +1,29 @@
//
// MessagePack for C++ memory pool
//
// Copyright (C) 2008-2016 FURUHASHI Sadayuki and KONDO Takatoshi
// 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_V1_CPP03_ZONE_HPP
#define MSGPACK_V1_CPP03_ZONE_HPP
#ifndef MSGPACK_CPP03_ZONE_HPP
#define MSGPACK_CPP03_ZONE_HPP
#include "msgpack/versioning.hpp"
#include "msgpack/cpp_config.hpp"
#include "msgpack/zone_decl.hpp"
#include "msgpack/assert.hpp"
#include <stdint.h>
#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
<% GENERATION_LIMIT = 15 %>
namespace msgpack {
@@ -35,7 +39,7 @@ class zone {
void* m_data;
};
struct finalizer_array {
finalizer_array():m_tail(MSGPACK_NULLPTR), m_end(MSGPACK_NULLPTR), m_array(MSGPACK_NULLPTR) {}
finalizer_array():m_tail(nullptr), m_end(nullptr), m_array(nullptr) {}
void call() {
finalizer* fin = m_tail;
for(; fin != m_array; --fin) (*(fin-1))();
@@ -63,7 +67,7 @@ class zone {
++m_tail;
}
void push_expand(void (*func)(void*), void* data) {
const size_t nused = static_cast<size_t>(m_end - m_array);
const size_t nused = m_end - m_array;
size_t nnext;
if(nused == 0) {
nnext = (sizeof(finalizer) < 72/2) ?
@@ -101,7 +105,7 @@ class zone {
m_head = c;
m_free = chunk_size;
m_ptr = reinterpret_cast<char*>(c) + sizeof(chunk);
c->m_next = MSGPACK_NULLPTR;
c->m_next = nullptr;
}
~chunk_list()
{
@@ -121,11 +125,10 @@ class zone {
::free(c);
c = n;
} else {
m_head = c;
break;
}
}
m_head->m_next = MSGPACK_NULLPTR;
m_head->m_next = nullptr;
m_free = chunk_size;
m_ptr = reinterpret_cast<char*>(m_head) + sizeof(chunk);
}
@@ -186,9 +189,7 @@ private:
template <typename T>
static void object_delete(void* obj);
static char* get_aligned(char* ptr, size_t align);
char* allocate_expand(size_t size);
void* allocate_expand(size_t size);
private:
zone(const zone&);
zone& operator=(const zone&);
@@ -198,43 +199,37 @@ inline zone::zone(size_t chunk_size) /* throw() */ :m_chunk_size(chunk_size), m_
{
}
inline char* zone::get_aligned(char* ptr, size_t align)
{
MSGPACK_ASSERT(align != 0 && (align & (align - 1)) == 0); // align must be 2^n (n >= 0)
return
reinterpret_cast<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);
char* aligned =
reinterpret_cast<char*>(
reinterpret_cast<size_t>(
(m_chunk_list.m_ptr + (align - 1))) / align * align);
size_t adjusted_size = size + (aligned - m_chunk_list.m_ptr);
if(m_chunk_list.m_free >= adjusted_size) {
m_chunk_list.m_free -= adjusted_size;
m_chunk_list.m_ptr += adjusted_size;
return aligned;
}
m_chunk_list.m_free -= adjusted_size;
m_chunk_list.m_ptr += adjusted_size;
return aligned;
return reinterpret_cast<char*>(
reinterpret_cast<size_t>(
allocate_expand(size + (align - 1))) / align * align);
}
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);
return allocate_expand(size);
}
char* ptr = m_chunk_list.m_ptr;
m_chunk_list.m_free -= size;
m_chunk_list.m_ptr += size;
return ptr;
}
inline char* zone::allocate_expand(size_t size)
inline void* zone::allocate_expand(size_t size)
{
chunk_list* const cl = &m_chunk_list;
@@ -256,8 +251,8 @@ inline char* zone::allocate_expand(size_t size)
c->m_next = cl->m_head;
cl->m_head = c;
cl->m_free = sz;
cl->m_ptr = ptr;
cl->m_free = sz - size;
cl->m_ptr = ptr + size;
return ptr;
}
@@ -307,7 +302,7 @@ inline void zone::undo_allocate(size_t size)
inline std::size_t aligned_size(
std::size_t size,
std::size_t align) {
std::size_t align = MSGPACK_ZONE_ALIGN) {
return (size + align - 1) / align * align;
}
@@ -316,7 +311,7 @@ inline std::size_t aligned_size(
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));
void* x = allocate_align(sizeof(T));
try {
m_finalizer_array.push(&zone::object_destruct<T>, x);
} catch (...) {
@@ -340,4 +335,4 @@ T* zone::allocate(<%=(1..i).map{|j|"A#{j} a#{j}"}.join(', ')%>)
} // namespace msgpack
#endif // MSGPACK_V1_CPP03_ZONE_HPP
#endif // MSGPACK_CPP03_ZONE_HPP

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -1,9 +1,4 @@
ADD_SUBDIRECTORY (c)
ADD_SUBDIRECTORY (cpp03)
ADD_SUBDIRECTORY (cpp11)
IF (MSGPACK_USE_BOOST)
ADD_SUBDIRECTORY (boost)
IF (MSGPACK_USE_X3_PARSE)
ADD_SUBDIRECTORY (x3)
ENDIF ()
ENDIF ()
ADD_SUBDIRECTORY (boost)

View File

@@ -1,17 +1,8 @@
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 ()
IF (MSGPACK_BOOST)
LIST (APPEND exec_PROGRAMS
msgpack_variant_capitalize.cpp
msgpack_variant_mapbased.cpp
)
ENDIF ()
FOREACH (source_file ${exec_PROGRAMS})
@@ -20,22 +11,21 @@ FOREACH (source_file ${exec_PROGRAMS})
${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")
IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
SET_PROPERTY (TARGET ${source_file_we} APPEND_STRING PROPERTY COMPILE_FLAGS "-Wall -Wextra -Werror -g -O3")
ENDIF ()
IF ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
SET_PROPERTY (TARGET ${source_file_we} APPEND_STRING PROPERTY COMPILE_FLAGS " -Wno-mismatched-tags")
ENDIF ()
IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
IF ((CMAKE_CXX_COMPILER_VERSION VERSION_GREATER ${GNUCXX_NO_MISMATCHED_TAGS_SUPPORT_VERSION}) OR
(CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL ${GNUCXX_NO_MISMATCHED_TAGS_SUPPORT_VERSION}))
SET_PROPERTY (TARGET ${source_file_we} APPEND_STRING PROPERTY COMPILE_FLAGS " -Wno-mismatched-tags")
ENDIF ()
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}")

View File

@@ -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();
}

View File

@@ -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();
}

View File

@@ -73,8 +73,8 @@ int main() {
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();
msgpack::unpacked unp1 = msgpack::unpack(ss1.str().data(), ss1.str().size());
msgpack::object const& obj1 = unp1.get();
std::cout << "Unpacked msgpack object." << std::endl;
std::cout << obj1 << std::endl;
@@ -87,8 +87,8 @@ int main() {
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();
msgpack::unpacked unp2 = msgpack::unpack(ss2.str().data(), ss2.str().size());
msgpack::object const& obj2 = unp2.get();
std::cout << "Modified msgpack object." << std::endl;
std::cout << obj2 << std::endl;
}

View File

@@ -45,11 +45,7 @@ struct proc:boost::static_visitor<void> {
// 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));
@@ -83,9 +79,8 @@ int main() {
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();
msgpack::unpacked unp = msgpack::unpack(ss.str().data(), ss.str().size());
msgpack::object const& obj = unp.get();
std::cout << "Unpacked msgpack object." << std::endl;
std::cout << obj << std::endl;
msgpack::type::variant_ref v = obj.as<msgpack::type::variant_ref>();

44
example/c/CMakeLists.txt Normal file
View File

@@ -0,0 +1,44 @@
INCLUDE_DIRECTORIES (
../include
)
LIST (APPEND exec_PROGRAMS
lib_buffer_unpack.c
simple_c.c
speed_test_uint32_array.c
speed_test_uint64_array.c
user_buffer_unpack.c
)
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_CXX_COMPILER_ID}" STREQUAL "Clang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
SET_PROPERTY (TARGET ${source_file_we} APPEND_STRING PROPERTY COMPILE_FLAGS "-Wall -Wextra -Werror -g -O3")
ENDIF ()
IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
SET_PROPERTY (TARGET ${source_file_we} APPEND_STRING PROPERTY COMPILE_FLAGS " -Wno-mismatched-tags")
ENDIF ()
IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
IF ((CMAKE_CXX_COMPILER_VERSION VERSION_GREATER ${GNUCXX_NO_MISMATCHED_TAGS_SUPPORT_VERSION}) OR
(CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL ${GNUCXX_NO_MISMATCHED_TAGS_SUPPORT_VERSION}))
SET_PROPERTY (TARGET ${source_file_we} APPEND_STRING PROPERTY COMPILE_FLAGS " -Wno-mismatched-tags")
ENDIF ()
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 ()

View File

@@ -0,0 +1,122 @@
#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)
{
// 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);
}
size_t 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)
printf("receive count: %d %zd bytes received.\n", recv_count++, recv_len);
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/c/simple_c.c Normal file
View File

@@ -0,0 +1,47 @@
#include <msgpack.h>
#include <stdio.h>
void print(char const* buf, unsigned int 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;
}

View File

@@ -0,0 +1,36 @@
#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_sbuffer_destroy(&buf);
}
int main(void)
{
int i = 0;
for (; i < 10; ++i) test();
return 0;
}

View 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_sbuffer_destroy(&buf);
}
int main(void)
{
int i = 0;
for (; i < 10; ++i) test();
return 0;
}

View File

@@ -0,0 +1,76 @@
#include <msgpack.h>
#include <stdio.h>
#include <assert.h>
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;
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");
/* 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.
*/

View File

@@ -1,7 +1,3 @@
FIND_PACKAGE (Threads REQUIRED)
FIND_PACKAGE (Boost COMPONENTS timer)
LIST (APPEND exec_PROGRAMS
class_intrusive.cpp
class_intrusive_map.cpp
@@ -9,26 +5,20 @@ LIST (APPEND exec_PROGRAMS
custom.cpp
enum.cpp
map_based_versionup.cpp
protocol.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 (MSGPACK_USE_BOOST)
IF (Boost_TIMER_LIBRARY)
IF (MSGPACK_BOOST)
IF (NOT MSVC)
LIST (APPEND with_boost_lib_PROGRAMS
speed_test.cpp
speed_test_nested_array.cpp
@@ -42,11 +32,8 @@ FOREACH (source_file ${exec_PROGRAMS})
${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")
IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
SET_PROPERTY (TARGET ${source_file_we} APPEND_STRING PROPERTY COMPILE_FLAGS "-Wall -Wextra -Werror -g -O3")
ENDIF ()
IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
IF (CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
@@ -63,12 +50,11 @@ FOREACH (source_file ${with_pthread_PROGRAMS})
${source_file_we}
${source_file}
)
TARGET_LINK_LIBRARIES (${source_file_we} PRIVATE
msgpackc-cxx
Threads::Threads
TARGET_LINK_LIBRARIES (${source_file_we}
pthread
)
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")
IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
SET_PROPERTY (TARGET ${source_file_we} APPEND_STRING PROPERTY COMPILE_FLAGS "-Wall -Wextra -Werror -g -O3 -pthread")
ENDIF ()
IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
IF (CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
@@ -80,29 +66,42 @@ FOREACH (source_file ${with_pthread_PROGRAMS})
ENDFOREACH ()
FOREACH (source_file ${with_boost_lib_PROGRAMS})
INCLUDE_DIRECTORIES (
../include
${Boost_INCLUDE_DIRS}
)
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
LINK_DIRECTORIES(${Boost_LIBRARY_DIRS})
TARGET_LINK_LIBRARIES (${source_file_we}
${Boost_TIMER_LIBRARY}
${Boost_CHRONO_LIBRARY}
${Boost_SYSTEM_LIBRARY}
)
IF (NOT MSVC AND NOT APPLE)
TARGET_LINK_LIBRARIES (${source_file_we} PRIVATE
TARGET_LINK_LIBRARIES (${source_file_we}
rt
)
ENDIF ()
IF ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "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")
IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
SET_PROPERTY (TARGET ${source_file_we} APPEND_STRING PROPERTY COMPILE_FLAGS " -Wno-mismatched-tags")
ENDIF ()
IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
IF ((CMAKE_CXX_COMPILER_VERSION VERSION_GREATER ${GNUCXX_NO_MISMATCHED_TAGS_SUPPORT_VERSION}) OR
(CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL ${GNUCXX_NO_MISMATCHED_TAGS_SUPPORT_VERSION}))
SET_PROPERTY (TARGET ${source_file_we} APPEND_STRING PROPERTY COMPILE_FLAGS " -Wno-mismatched-tags")
ENDIF ()
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}")

View File

@@ -82,12 +82,11 @@ int main() {
std::stringstream ss;
msgpack::pack(ss, my);
std::string const& str = ss.str();
print(str);
print(ss.str());
msgpack::object_handle oh =
msgpack::unpack(str.data(), str.size());
msgpack::object obj = oh.get();
msgpack::unpacked unp;
msgpack::unpack(unp, ss.str().data(), ss.str().size());
msgpack::object obj = unp.get();
std::cout << obj << std::endl;
assert(obj.as<my_class>() == my);
}

View File

@@ -59,10 +59,9 @@ int main() {
print(ss.str());
std::string const& str = ss.str();
msgpack::object_handle oh =
msgpack::unpack(str.data(), str.size());
msgpack::object obj = oh.get();
msgpack::unpacked unp;
msgpack::unpack(unp, ss.str().data(), ss.str().size());
msgpack::object obj = unp.get();
std::cout << obj << std::endl;
assert(obj.as<my_class>() == my);
}

View File

@@ -69,7 +69,7 @@ struct object_with_zone<my_class> {
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.zone.allocate_align(sizeof(msgpack::object) * o.via.array.size));
o.via.array.ptr[0] = msgpack::object(v.get_name(), o.zone);
o.via.array.ptr[1] = msgpack::object(v.get_age(), o.zone);
}
@@ -100,12 +100,11 @@ int main() {
std::stringstream ss;
msgpack::pack(ss, my);
std::string const& str = ss.str();
print(str);
print(ss.str());
msgpack::object_handle oh =
msgpack::unpack(str.data(), str.size());
msgpack::object obj = oh.get();
msgpack::unpacked unp;
msgpack::unpack(unp, ss.str().data(), ss.str().size());
msgpack::object obj = unp.get();
std::cout << obj << std::endl;
assert(obj.as<my_class>() == my);
}

View File

@@ -40,9 +40,9 @@ int main(void)
std::stringstream sbuf;
msgpack::pack(sbuf, oc);
msgpack::object_handle oh =
msgpack::unpack(sbuf.str().data(), sbuf.str().size());
msgpack::object obj = oh.get();
msgpack::unpacked result;
msgpack::unpack(result, sbuf.str().data(), sbuf.str().size());
msgpack::object obj = result.get();
obj.convert(nc);
@@ -56,9 +56,9 @@ int main(void)
std::stringstream sbuf;
msgpack::pack(sbuf, nc);
msgpack::object_handle oh =
msgpack::unpack(sbuf.str().data(), sbuf.str().size());
msgpack::object obj = oh.get();
msgpack::unpacked result;
msgpack::unpack(result, sbuf.str().data(), sbuf.str().size());
msgpack::object obj = result.get();
obj.convert(oc);

View File

@@ -30,20 +30,20 @@ int main(void)
my_enum e3 = elem3;
msgpack::pack(sbuf, e3);
msgpack::object_handle oh;
msgpack::unpacked result;
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(result, sbuf.str().data(), sbuf.str().size(), off);
std::cout << result.get().as<my_enum>() << std::endl;
assert(result.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(result, sbuf.str().data(), sbuf.str().size(), off);
std::cout << result.get().as<my_enum>() << std::endl;
assert(result.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);
msgpack::unpack(result, sbuf.str().data(), sbuf.str().size(), off);
std::cout << result.get().as<my_enum>() << std::endl;
assert(result.get().as<my_enum>() == elem3);
}
{ // create object without zone
msgpack::object obj(elem2);

View File

@@ -71,10 +71,9 @@ int main() {
print(ss.str());
std::string const& str = ss.str();
msgpack::object_handle oh = msgpack::unpack(str.data(), str.size());
msgpack::unpacked unp = msgpack::unpack(ss.str().data(), ss.str().size());
msgpack::object obj = oh.get();
msgpack::object obj = unp.get();
std::cout << obj << std::endl;
v2 newv = obj.as<v2>();

View File

@@ -57,9 +57,9 @@ int main(void)
{
std::string buffer(stream.str());
msgpack::object_handle oh =
msgpack::unpack(buffer.data(), buffer.size());
msgpack::object o = oh.get();
msgpack::unpacked result;
msgpack::unpack(result, buffer.data(), buffer.size());
msgpack::object o = result.get();
myprotocol::Get req;
o.convert(req);
@@ -85,9 +85,9 @@ int main(void)
{
std::string buffer(stream.str());
msgpack::object_handle oh =
msgpack::unpack(buffer.data(), buffer.size());
msgpack::object o = oh.get();
msgpack::unpacked result;
msgpack::unpack(result, buffer.data(), buffer.size());
msgpack::object o = result.get();
myprotocol::MultiGet req;

View File

@@ -44,9 +44,9 @@ int main(void)
{
std::string buffer(stream.str());
msgpack::object_handle oh =
msgpack::unpack(buffer.data(), buffer.size());
msgpack::object o = oh.get();
msgpack::unpacked result;
msgpack::unpack(result, buffer.data(), buffer.size());
msgpack::object o = result.get();
myprotocol::Get req;
o.convert(req);
@@ -72,9 +72,9 @@ int main(void)
{
std::string buffer(stream.str());
msgpack::object_handle oh =
msgpack::unpack(buffer.data(), buffer.size());
msgpack::object o = oh.get();
msgpack::unpacked result;
msgpack::unpack(result, buffer.data(), buffer.size());
msgpack::object o = result.get();
myprotocol::MultiGet req;

View File

@@ -31,13 +31,12 @@ int main() {
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);
msgpack::object obj = msgpack::unpack(z, ss.str().data(), ss.str().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::string const& str = msgpack::unpack(z, ss.str().data(), ss.str().size(), offset).as<std::string>();
std::cout << str << std::endl;
assert(str == s);
}

View File

@@ -27,10 +27,12 @@ int main(void)
// deserialize the buffer into msgpack::object instance.
std::string str(buffer.str());
msgpack::object_handle oh = msgpack::unpack(str.data(), str.size());
msgpack::unpacked result;
// deserialized object is valid during the msgpack::object_handle instance alive.
msgpack::object deserialized = oh.get();
msgpack::unpack(result, str.data(), str.size());
// deserialized object is valid during the msgpack::unpacked instance alive.
msgpack::object deserialized = result.get();
// msgpack::object supports ostream.
std::cout << deserialized << std::endl;

View File

@@ -37,11 +37,11 @@ void test_map_pack_unpack() {
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;
msgpack::unpacked unpacked;
std::cout << "Start unpacking...by void unpack(unpacked& result, const char* data, size_t len)" << std::endl;
{
boost::timer::cpu_timer timer;
msgpack::unpack(oh, str.data(), str.size());
msgpack::unpack(unpacked, str.data(), str.size());
std::string result = timer.format();
std::cout << result << std::endl;
}
@@ -50,7 +50,7 @@ void test_map_pack_unpack() {
std::cout << "Start converting..." << std::endl;
{
boost::timer::cpu_timer timer;
oh.get().convert(m2);
unpacked.get().convert(m2);
std::string result = timer.format();
std::cout << result << std::endl;
}

View File

@@ -60,11 +60,11 @@ void test_array_of_array() {
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;
msgpack::unpacked unpacked;
std::cout << "Start unpacking...by void unpack(unpacked& result, const char* data, size_t len)" << std::endl;
{
boost::timer::cpu_timer timer;
msgpack::unpack(oh, str.data(), str.size());
msgpack::unpack(unpacked, str.data(), str.size());
std::string result = timer.format();
std::cout << result << std::endl;
}
@@ -73,7 +73,7 @@ void test_array_of_array() {
std::cout << "Start converting..." << std::endl;
{
boost::timer::cpu_timer timer;
oh.get().convert(v2);
unpacked.get().convert(v2);
std::string result = timer.format();
std::cout << result << std::endl;
}

View File

@@ -16,12 +16,6 @@
#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) { }
@@ -49,10 +43,10 @@ public:
m_pac.buffer_consumed(count);
msgpack::object_handle oh;
while (m_pac.next(oh)) {
msgpack::object msg = oh.get();
unique_zone& life = oh.zone();
msgpack::unpacked result;
while (m_pac.next(&result)) {
msgpack::object msg = result.get();
unique_zone& life = result.zone();
process_message(msg, life);
}

View File

@@ -1,32 +1,34 @@
IF (MSGPACK_CXX11 OR MSGPACK_CXX14 OR MSGPACK_CXX17)
IF (MSGPACK_CXX11)
INCLUDE_DIRECTORIES (
../include
)
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")
IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
SET_PROPERTY (TARGET ${source_file_we} APPEND_STRING PROPERTY COMPILE_FLAGS "-Wall -Wextra -Werror -g -O3 ")
ENDIF ()
IF ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
SET_PROPERTY (TARGET ${source_file_we} APPEND_STRING PROPERTY COMPILE_FLAGS " -Wno-mismatched-tags")
ENDIF ()
IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
IF ((CMAKE_CXX_COMPILER_VERSION VERSION_GREATER ${GNUCXX_NO_MISMATCHED_TAGS_SUPPORT_VERSION}) OR
(CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL ${GNUCXX_NO_MISMATCHED_TAGS_SUPPORT_VERSION}))
SET_PROPERTY (TARGET ${source_file_we} APPEND_STRING PROPERTY COMPILE_FLAGS " -Wno-mismatched-tags")
ENDIF ()
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}")

View File

@@ -25,9 +25,8 @@ void array() {
std::stringstream ss;
msgpack::pack(ss, a);
auto const& str = ss.str();
auto oh = msgpack::unpack(str.data(), str.size());
auto obj = oh.get();
msgpack::unpacked und = msgpack::unpack(ss.str().data(), ss.str().size());
msgpack::object obj = und.get();
std::cout << obj << std::endl;
assert((obj.as<std::array<int, 5>>()) == a);
@@ -38,9 +37,8 @@ void tuple() {
std::stringstream ss;
msgpack::pack(ss, t);
auto const& str = ss.str();
auto oh = msgpack::unpack(str.data(), str.size());
auto obj = oh.get();
auto und = msgpack::unpack(ss.str().data(), ss.str().size());
auto obj = und.get();
std::cout << obj << std::endl;
assert(obj.as<decltype(t)>() == t);
@@ -51,9 +49,8 @@ void unordered_map() {
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();
auto und = msgpack::unpack(ss.str().data(), ss.str().size());
msgpack::object obj = und.get();
std::cout << obj << std::endl;
assert(obj.as<decltype(m)>() == m);
@@ -64,9 +61,8 @@ void unordered_set() {
std::stringstream ss;
msgpack::pack(ss, s);
auto const& str = ss.str();
auto oh = msgpack::unpack(str.data(), str.size());
auto obj = oh.get();
auto und = msgpack::unpack(ss.str().data(), ss.str().size());
auto obj = und.get();
std::cout << obj << std::endl;
assert(obj.as<decltype(s)>() == s);
@@ -78,9 +74,8 @@ void forward_list() {
std::stringstream ss;
msgpack::pack(ss, f);
auto const& str = ss.str();
auto oh = msgpack::unpack(str.data(), str.size());
auto obj = oh.get();
auto und = msgpack::unpack(ss.str().data(), ss.str().size());
auto obj = und.get();
std::cout << obj << std::endl;
assert(obj.as<type>() == f);
@@ -103,45 +98,40 @@ void combi() {
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();
auto und = msgpack::unpack(ss.str().data(), ss.str().size(), offset);
auto obj = und.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();
auto und = msgpack::unpack(ss.str().data(), ss.str().size(), offset);
auto obj = und.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();
auto und = msgpack::unpack(ss.str().data(), ss.str().size(), offset);
auto obj = und.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();
auto und = msgpack::unpack(ss.str().data(), ss.str().size(), offset);
auto obj = und.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();
auto und = msgpack::unpack(ss.str().data(), ss.str().size(), offset);
auto obj = und.get();
std::cout << obj << std::endl;
assert(obj.as<decltype(f)>() == f);

View File

@@ -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);
}
}

View File

@@ -1,64 +0,0 @@
IF (MSGPACK_USE_X3_PARSE AND MSGPACK_DEFAULT_API_VERSION VERSION_GREATER 1)
FIND_PACKAGE (Boost REQUIRED COMPONENTS context system)
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
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 ()

View File

@@ -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;
}
}

View File

@@ -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;
}

View File

@@ -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
external/boost/predef vendored Submodule

Submodule external/boost/predef added at c14eafa3ef

1
external/boost/preprocessor vendored Submodule

View File

@@ -1,38 +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_COMPILE_DEFINITIONS (${source_file_we} PRIVATE
$<IF:$<BOOL:${MSGPACK_USE_STATIC_BOOST}>,,BOOST_TEST_DYN_LINK>)
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 ()

View File

@@ -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, LLVMFuzzerTestOneInput(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;
}

View File

@@ -1,27 +0,0 @@
#include <msgpack.hpp>
// The function's signature must NOT be changed since other projects rely on it:
// - libFuzzer
// - AFL++
// - Google's oss-fuzz (uses the previous two ones)
extern "C" int LLVMFuzzerTestOneInput(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;
}

View File

@@ -1 +0,0 @@
<EFBFBD>

View File

@@ -1 +0,0 @@
<EFBFBD>

View File

@@ -1,2 +0,0 @@
<EFBFBD><01><02><03><04><05><06><07><08> <09>
<EFBFBD> <0B> <0C>

24
include/msgpack.h Normal file
View 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"

View File

@@ -11,11 +11,7 @@
#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"

View File

@@ -1,7 +1,7 @@
//
// MessagePack for C++ static resolution routine
//
// Copyright (C) 2015-2016 KONDO Takatoshi
// Copyright (C) 2015 KONDO Takatoshi
//
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
@@ -10,10 +10,75 @@
#ifndef MSGPACK_ADAPTOR_BASE_HPP
#define MSGPACK_ADAPTOR_BASE_HPP
#include "msgpack/adaptor/adaptor_base_decl.hpp"
#include "msgpack/object_fwd.hpp"
namespace msgpack {
/// @cond
MSGPACK_API_VERSION_NAMESPACE(v1) {
/// @endcond
template <typename Stream>
class packer;
namespace adaptor {
// Adaptor functors
template <typename T, typename Enabler = void>
struct convert {
msgpack::object const& operator()(msgpack::object const& o, T& v) const;
};
template <typename T, typename Enabler = void>
struct pack {
template <typename Stream>
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, T const& v) const;
};
template <typename T, typename Enabler = void>
struct object {
void operator()(msgpack::object& o, T const& v) const;
};
template <typename T, typename Enabler = void>
struct object_with_zone {
void operator()(msgpack::object::with_zone& o, T const& v) const;
};
} // namespace adaptor
// operators
template <typename T>
inline
msgpack::object const& operator>> (msgpack::object const& o, T& v) {
return adaptor::convert<T>()(o, v);
}
template <typename Stream, typename T>
inline
msgpack::packer<Stream>& operator<< (msgpack::packer<Stream>& o, T const& v) {
return adaptor::pack<T>()(o, v);
}
template <typename T>
inline
void operator<< (msgpack::object& o, T const& v) {
adaptor::object<T>()(o, v);
}
template <typename T>
inline
void operator<< (msgpack::object::with_zone& o, T const& v) {
adaptor::object_with_zone<T>()(o, v);
}
/// @cond
} // MSGPACK_API_VERSION_NAMESPACE(v1)
/// @endcond
} // namespace msgpack
#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

View File

@@ -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

View File

@@ -1,7 +1,7 @@
//
// MessagePack for C++ static resolution routine
//
// Copyright (C) 2008-2016 FURUHASHI Sadayuki and KONDO Takatoshi
// 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
@@ -10,8 +10,165 @@
#ifndef MSGPACK_TYPE_ARRAY_REF_HPP
#define MSGPACK_TYPE_ARRAY_REF_HPP
#include "msgpack/adaptor/array_ref_decl.hpp"
#include "msgpack/versioning.hpp"
#include "msgpack/adaptor/adaptor_base.hpp"
#include "msgpack/adaptor/check_container_size.hpp"
#include <cstring>
#include <string>
#include "msgpack/v1/adaptor/array_ref.hpp"
namespace msgpack {
#endif // MSGPACK_TYPE_ARRAY_REFL_HPP
/// @cond
MSGPACK_API_VERSION_NAMESPACE(v1) {
/// @endcond
namespace type {
template <typename T>
struct array_ref {
array_ref() : data(nullptr) {}
array_ref(T& t) : data(&t) {}
T* data;
template <typename U>
bool operator==(array_ref<U> const& t) const {
return *data == *t.data;
}
template <typename U>
bool operator!=(array_ref<U> const& t) const {
return !(*data == *t.data);
}
template <typename U>
bool operator< (array_ref<U> const& t) const
{
return *data < *t.data;
}
template <typename U>
bool operator> (array_ref<U> const& t) const
{
return *t.data < *data;
}
template <typename U>
bool operator<= (array_ref<U> const& t) const
{
return !(*t.data < *data);
}
template <typename U>
bool operator>= (array_ref<U> const& t) const
{
return !(*data < *t.data);
}
};
template <typename T>
inline array_ref<T const> make_array_ref(T const& t) {
return array_ref<T const>(t);
}
template <typename T>
inline array_ref<T> make_array_ref(T& t) {
return array_ref<T>(t);
}
} // namespace type
namespace adaptor {
template <typename T>
struct convert<msgpack::type::array_ref<T> > {
msgpack::object const& operator()(msgpack::object const& o, msgpack::type::array_ref<T>& v) const {
if (!v.data) { throw msgpack::type_error(); }
if (o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
if (v.data->size() < o.via.bin.size) { throw msgpack::type_error(); }
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;
typename T::iterator it = v.data->begin();
do {
p->convert(*it);
++p;
++it;
} while(p < pend);
}
return o;
}
};
template <typename T>
struct convert<msgpack::type::array_ref<std::vector<T> > > {
msgpack::object const& operator()(msgpack::object const& o, msgpack::type::array_ref<std::vector<T> >& v) const {
if (!v.data) { throw msgpack::type_error(); }
if (o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
v.data->resize(o.via.bin.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;
typename std::vector<T>::iterator it = v.data->begin();
do {
p->convert(*it);
++p;
++it;
} while(p < pend);
}
return o;
}
};
template <typename T>
struct pack<msgpack::type::array_ref<T> > {
template <typename Stream>
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const msgpack::type::array_ref<T>& v) const {
if (!v.data) { throw msgpack::type_error(); }
uint32_t size = checked_get_container_size(v.data->size());
o.pack_array(size);
for (typename T::const_iterator it(v.data->begin()), it_end(v.data->end());
it != it_end; ++it) {
o.pack(*it);
}
return o;
}
};
template <typename T>
struct object_with_zone<msgpack::type::array_ref<T> > {
void operator()(msgpack::object::with_zone& o, const msgpack::type::array_ref<T>& v) const {
if (!v.data) { throw msgpack::type_error(); }
o.type = msgpack::type::ARRAY;
if (v.data->empty()) {
o.via.array.ptr = nullptr;
o.via.array.size = 0;
}
else {
uint32_t size = checked_get_container_size(v.data->size());
msgpack::object* p = static_cast<msgpack::object*>(o.zone.allocate_align(sizeof(msgpack::object)*size));
msgpack::object* const pend = p + size;
o.via.array.ptr = p;
o.via.array.size = size;
typename T::const_iterator it(v.data->begin());
do {
#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && !defined(__clang__)
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
#endif // (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && !defined(__clang__)
*p = msgpack::object(*it, o.zone);
#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && !defined(__clang__)
#pragma GCC diagnostic pop
#endif // (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && !defined(__clang__)
++p;
++it;
} while(p < pend);
}
}
};
} // namespace adaptor
/// @cond
} // MSGPACK_API_VERSION_NAMESPACE(v1)
/// @endcond
} // namespace msgpack
#endif // MSGPACK_TYPE_ARRAY_REF_HPP

View File

@@ -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

View File

@@ -1,7 +1,7 @@
//
// MessagePack for C++ static resolution routine
//
// Copyright (C) 2008-2016 FURUHASHI Sadayuki and KONDO Takatoshi
// 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
@@ -10,6 +10,57 @@
#ifndef MSGPACK_TYPE_BOOL_HPP
#define MSGPACK_TYPE_BOOL_HPP
#include "msgpack/v1/adaptor/bool.hpp"
#include "msgpack/versioning.hpp"
#include "msgpack/adaptor/adaptor_base.hpp"
namespace msgpack {
/// @cond
MSGPACK_API_VERSION_NAMESPACE(v1) {
/// @endcond
namespace adaptor {
template <>
struct convert<bool> {
msgpack::object const& operator()(msgpack::object const& o, bool& v) const {
if(o.type != msgpack::type::BOOLEAN) { throw msgpack::type_error(); }
v = o.via.boolean;
return o;
}
};
template <>
struct pack<bool> {
template <typename Stream>
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const bool& v) const {
if(v) { o.pack_true(); }
else { o.pack_false(); }
return o;
}
};
template <>
struct object<bool> {
void operator()(msgpack::object& o, bool v) const {
o.type = msgpack::type::BOOLEAN;
o.via.boolean = v;
}
};
template <>
struct object_with_zone<bool> {
void operator()(msgpack::object::with_zone& o, bool v) const {
static_cast<msgpack::object&>(o) << v;
}
};
} // namespace adaptor
/// @cond
} // MSGPACK_API_VERSION_NAMESPACE(v1)
/// @endcond
} // namespace msgpack
#endif // MSGPACK_TYPE_BOOL_HPP

View File

@@ -10,6 +10,151 @@
#ifndef MSGPACK_TYPE_BOOST_FUSION_HPP
#define MSGPACK_TYPE_BOOST_FUSION_HPP
#include "msgpack/v1/adaptor/boost/fusion.hpp"
#include "msgpack/versioning.hpp"
#include "msgpack/adaptor/adaptor_base.hpp"
#include "msgpack/adaptor/check_container_size.hpp"
#include "msgpack/meta.hpp"
#if !defined (MSGPACK_USE_CPP03)
#include "msgpack/adaptor/cpp11/tuple.hpp"
#endif // #if !defined (MSGPACK_USE_CPP03)
#include <boost/fusion/support/is_sequence.hpp>
#include <boost/fusion/sequence/intrinsic/size.hpp>
#include <boost/fusion/algorithm/iteration/for_each.hpp>
#include <boost/fusion/sequence/intrinsic/at.hpp>
#include <boost/fusion/include/mpl.hpp>
#include <boost/mpl/size.hpp>
namespace msgpack {
/// @cond
MSGPACK_API_VERSION_NAMESPACE(v1) {
/// @endcond
namespace adaptor {
#if !defined (MSGPACK_USE_CPP03)
template <typename T>
struct as<
T,
typename msgpack::enable_if<
boost::fusion::traits::is_sequence<T>::value &&
boost::mpl::fold<
T,
boost::mpl::bool_<true>,
boost::mpl::if_ <
boost::mpl::and_<
boost::mpl::_1,
msgpack::has_as<boost::mpl::_2>
>,
boost::mpl::bool_<true>,
boost::mpl::bool_<false>
>
>::type::value
>::type
> {
T operator()(msgpack::object const& o) const {
if (o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
if (o.via.array.size != checked_get_container_size(boost::mpl::size<T>::value)) {
throw msgpack::type_error();
}
using tuple_t = decltype(to_tuple(std::declval<T>(), gen_seq<boost::mpl::size<T>::value>()));
return to_t(
o.as<tuple_t>(),
msgpack::gen_seq<boost::mpl::size<T>::value>());
}
template<std::size_t... Is, typename U>
static std::tuple<
typename std::remove_reference<
typename boost::fusion::result_of::at_c<T, Is>::type
>::type...>
to_tuple(U const& u, seq<Is...>) {
return std::make_tuple(boost::fusion::at_c<Is>(u)...);
}
template<std::size_t... Is, typename U>
static T to_t(U const& u, seq<Is...>) {
return T(std::get<Is>(u)...);
}
};
#endif // !defined (MSGPACK_USE_CPP03)
template <typename T>
struct convert<T, typename msgpack::enable_if<boost::fusion::traits::is_sequence<T>::value>::type > {
msgpack::object const& operator()(msgpack::object const& o, T& v) const {
if (o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
if (o.via.array.size != checked_get_container_size(boost::fusion::size(v))) {
throw msgpack::type_error();
}
uint32_t index = 0;
boost::fusion::for_each(v, convert_imp(o, index));
return o;
}
private:
struct convert_imp {
convert_imp(msgpack::object const& obj, uint32_t& index):obj_(obj), index_(index) {}
template <typename U>
void operator()(U& v) const {
msgpack::adaptor::convert<U>()(obj_.via.array.ptr[index_++], v);
}
private:
msgpack::object const& obj_;
uint32_t& index_;
};
};
template <typename T>
struct pack<T, typename msgpack::enable_if<boost::fusion::traits::is_sequence<T>::value>::type > {
template <typename Stream>
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const T& v) const {
uint32_t size = checked_get_container_size(boost::fusion::size(v));
o.pack_array(size);
boost::fusion::for_each(v, pack_imp<Stream>(o));
return o;
}
private:
template <typename Stream>
struct pack_imp {
pack_imp(msgpack::packer<Stream>& stream):stream_(stream) {}
template <typename U>
void operator()(U const& v) const {
stream_.pack(v);
}
private:
msgpack::packer<Stream>& stream_;
};
};
template <typename T>
struct object_with_zone<T, typename msgpack::enable_if<boost::fusion::traits::is_sequence<T>::value>::type > {
void operator()(msgpack::object::with_zone& o, const T& v) const {
uint32_t size = checked_get_container_size(boost::fusion::size(v));
o.type = msgpack::type::ARRAY;
o.via.array.ptr = static_cast<msgpack::object*>(o.zone.allocate_align(sizeof(msgpack::object)*size));
o.via.array.size = size;
uint32_t count = 0;
boost::fusion::for_each(v, with_zone_imp(o, count));
}
private:
struct with_zone_imp {
with_zone_imp(msgpack::object::with_zone const& obj, uint32_t& count):obj_(obj), count_(count) {}
template <typename U>
void operator()(U const& v) const {
obj_.via.array.ptr[count_++] = msgpack::object(v, obj_.zone);
}
msgpack::object::with_zone const& obj_;
uint32_t& count_;
};
};
} // namespace adaptor
/// @cond
} // MSGPACK_API_VERSION_NAMESPACE(v1)
/// @endcond
} // namespace msgpack
#endif // MSGPACK_TYPE_BOOST_FUSION_HPP

View File

@@ -1,7 +1,7 @@
//
// MessagePack for C++ static resolution routine
//
// Copyright (C) 2015-2016 KONDO Takatoshi
// Copyright (C) 2015 KONDO Takatoshi
//
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
@@ -10,9 +10,421 @@
#ifndef MSGPACK_TYPE_BOOST_MSGPACK_VARIANT_HPP
#define MSGPACK_TYPE_BOOST_MSGPACK_VARIANT_HPP
#include "msgpack/adaptor/boost/msgpack_variant_decl.hpp"
#if defined(MSGPACK_USE_BOOST)
#include "msgpack/v1/adaptor/boost/msgpack_variant.hpp"
//#include "msgpack/v2/adaptor/boost/msgpack_variant.hpp"
#include "msgpack/versioning.hpp"
#include "msgpack/adaptor/adaptor_base.hpp"
#include "msgpack/adaptor/check_container_size.hpp"
#include "msgpack/adaptor/boost/string_ref.hpp"
#include "msgpack/adaptor/nil.hpp"
#include "msgpack/adaptor/bool.hpp"
#include "msgpack/adaptor/int.hpp"
#include "msgpack/adaptor/float.hpp"
#include "msgpack/adaptor/string.hpp"
#include "msgpack/adaptor/vector_char.hpp"
#include "msgpack/adaptor/raw.hpp"
#include "msgpack/adaptor/ext.hpp"
#include "msgpack/adaptor/vector.hpp"
#include "msgpack/adaptor/map.hpp"
#include <boost/variant.hpp>
#include <boost/operators.hpp>
namespace msgpack {
/// @cond
MSGPACK_API_VERSION_NAMESPACE(v1) {
/// @endcond
namespace type {
template <typename STR, typename BIN, typename EXT>
struct basic_variant :
boost::variant<
nil_t, // NIL
bool, // BOOL
int64_t, // NEGATIVE_INTEGER
uint64_t, // POSITIVE_INTEGER
double, // FLOAT
std::string, // STR
#if (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53
boost::string_ref, // STR
#endif // (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53
std::vector<char>, // BIN
msgpack::type::raw_ref, // BIN
ext, // EXT
ext_ref, // EXT
boost::recursive_wrapper<std::vector<basic_variant<STR, BIN, EXT> > >, // ARRAY
boost::recursive_wrapper<std::map<basic_variant<STR, BIN, EXT>, basic_variant<STR, BIN, EXT> > >, // MAP
boost::recursive_wrapper<std::multimap<basic_variant<STR, BIN, EXT>, basic_variant<STR, BIN, EXT> > >// MAP
>,
private boost::totally_ordered<basic_variant<STR, BIN, EXT> > {
typedef boost::variant<
nil_t, // NIL
bool, // BOOL
int64_t, // NEGATIVE_INTEGER
uint64_t, // POSITIVE_INTEGER
double, // FLOAT
std::string, // STR
#if (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53
boost::string_ref, // STR
#endif // (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53
std::vector<char>, // BIN
msgpack::type::raw_ref, // BIN
ext, // EXT
ext_ref, // EXT
boost::recursive_wrapper<std::vector<basic_variant<STR, BIN, EXT> > >, // ARRAY
boost::recursive_wrapper<std::map<basic_variant<STR, BIN, EXT>, basic_variant<STR, BIN, EXT> > >, // MAP
boost::recursive_wrapper<std::multimap<basic_variant<STR, BIN, EXT>, basic_variant<STR, BIN, EXT> > >// MAP
> base;
basic_variant() {}
template <typename T>
basic_variant(T const& t):base(t) {}
basic_variant(char const* p):base(std::string(p)) {}
basic_variant(char v) {
int_init(v);
}
basic_variant(signed char v) {
int_init(v);
}
basic_variant(unsigned char v):base(uint64_t(v)) {}
basic_variant(signed int v) {
int_init(v);
}
basic_variant(unsigned int v):base(uint64_t(v)) {}
basic_variant(signed long v) {
int_init(v);
}
basic_variant(unsigned long v):base(uint64_t(v)) {}
basic_variant(signed long long v) {
int_init(v);
}
basic_variant(unsigned long long v):base(uint64_t(v)) {}
bool is_nil() const {
return boost::get<msgpack::type::nil_t>(this);
}
bool is_bool() const {
return boost::get<bool>(this);
}
bool is_int64_t() const {
return boost::get<int64_t>(this);
}
bool is_uint64_t() const {
return boost::get<uint64_t>(this);
}
bool is_double() const {
return boost::get<double>(this);
}
bool is_string() const {
return boost::get<std::string>(this);
}
#if (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53
bool is_boost_string_ref() const {
return boost::get<boost::string_ref>(this);
}
#endif // (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53
bool is_vector_char() const {
return boost::get<std::vector<char> >(this);
}
bool is_vector_char() {
return boost::get<std::vector<char> >(this);
}
bool is_raw_ref() const {
return boost::get<raw_ref>(this);
}
bool is_ext() const {
return boost::get<ext>(this);
}
bool is_ext_ref() const {
return boost::get<ext_ref>(this);
}
bool is_vector() const {
return boost::get<std::vector<basic_variant<STR, BIN, EXT> > >(this);
}
bool is_map() const {
return boost::get<std::map<basic_variant<STR, BIN, EXT>, basic_variant<STR, BIN, EXT> > >(this);
}
bool is_multimap() const {
return boost::get<std::multimap<basic_variant<STR, BIN, EXT>, basic_variant<STR, BIN, EXT> > >(this);
}
bool as_bool() const {
return boost::get<bool>(*this);
}
int64_t as_int64_t() const {
return boost::get<int64_t>(*this);
}
int64_t& as_int64_t() {
return boost::get<int64_t>(*this);
}
uint64_t as_uint64_t() const {
return boost::get<uint64_t>(*this);
}
uint64_t& as_uint64_t() {
return boost::get<uint64_t>(*this);
}
double as_double() const {
return boost::get<double>(*this);
}
double& as_double() {
return boost::get<double>(*this);
}
std::string const& as_string() const {
return boost::get<std::string>(*this);
}
std::string& as_string() {
return boost::get<std::string>(*this);
}
#if (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53
boost::string_ref const& as_boost_string_ref() const {
return boost::get<boost::string_ref>(*this);
}
boost::string_ref& as_boost_string_ref() {
return boost::get<boost::string_ref>(*this);
}
#endif // (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53
std::vector<char> const& as_vector_char() const {
return boost::get<std::vector<char> >(*this);
}
std::vector<char>& as_vector_char() {
return boost::get<std::vector<char> >(*this);
}
raw_ref const& as_raw_ref() const {
return boost::get<raw_ref>(*this);
}
ext const& as_ext() const {
return boost::get<ext>(*this);
}
ext& as_ext() {
return boost::get<ext>(*this);
}
ext_ref const& as_ext_ref() const {
return boost::get<ext_ref>(*this);
}
std::vector<basic_variant<STR, BIN, EXT> > const& as_vector() const {
return boost::get<std::vector<basic_variant<STR, BIN, EXT> > >(*this);
}
std::vector<basic_variant<STR, BIN, EXT> >& as_vector() {
return boost::get<std::vector<basic_variant<STR, BIN, EXT> > >(*this);
}
std::map<basic_variant<STR, BIN, EXT>, basic_variant<STR, BIN, EXT> > const& as_map() const {
return boost::get<std::map<basic_variant<STR, BIN, EXT>, basic_variant<STR, BIN, EXT> > >(*this);
}
std::map<basic_variant<STR, BIN, EXT>, basic_variant<STR, BIN, EXT> >& as_map() {
return boost::get<std::map<basic_variant<STR, BIN, EXT>, basic_variant<STR, BIN, EXT> > >(*this);
}
std::multimap<basic_variant<STR, BIN, EXT>, basic_variant<STR, BIN, EXT> > const& as_multimap() const {
return boost::get<std::multimap<basic_variant<STR, BIN, EXT>, basic_variant<STR, BIN, EXT> > >(*this);
}
std::multimap<basic_variant<STR, BIN, EXT>, basic_variant<STR, BIN, EXT> >& as_multimap() {
return boost::get<std::multimap<basic_variant<STR, BIN, EXT>, basic_variant<STR, BIN, EXT> > >(*this);
}
private:
template <typename T>
void int_init(T v) {
if (v < 0) {
static_cast<base&>(*this) = int64_t(v);
}
else {
static_cast<base&>(*this) = uint64_t(v);
}
}
};
template <typename STR, typename BIN, typename EXT>
inline bool operator<(basic_variant<STR, BIN, EXT> const& lhs, basic_variant<STR, BIN, EXT> const& rhs) {
return
static_cast<typename basic_variant<STR, BIN, EXT>::base const&>(lhs) <
static_cast<typename basic_variant<STR, BIN, EXT>::base const&>(rhs);
}
template <typename STR, typename BIN, typename EXT>
inline bool operator==(basic_variant<STR, BIN, EXT> const& lhs, basic_variant<STR, BIN, EXT> const& rhs) {
return
static_cast<typename basic_variant<STR, BIN, EXT>::base const&>(lhs) ==
static_cast<typename basic_variant<STR, BIN, EXT>::base const&>(rhs);
}
typedef basic_variant<std::string, std::vector<char>, ext> variant;
typedef basic_variant<
#if (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53
boost::string_ref,
#else // (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53
std::string,
#endif // (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53
raw_ref, ext_ref> variant_ref;
} // namespace type
namespace adaptor {
#if !defined (MSGPACK_USE_CPP03)
template <typename STR, typename BIN, typename EXT>
struct as<msgpack::type::basic_variant<STR, BIN, EXT> > {
msgpack::type::basic_variant<STR, BIN, EXT> operator()(msgpack::object const& o) const {
switch(o.type) {
case type::NIL:
return o.as<msgpack::type::nil_t>();
case type::BOOLEAN:
return o.as<bool>();
case type::POSITIVE_INTEGER:
return o.as<uint64_t>();
case type::NEGATIVE_INTEGER:
return o.as<int64_t>();
case type::FLOAT:
return o.as<double>();
case type::STR:
return o.as<STR>();
case type::BIN:
return o.as<BIN>();
case type::EXT:
return o.as<EXT>();
case type::ARRAY:
return o.as<std::vector<msgpack::type::basic_variant<STR, BIN, EXT> > >();
case type::MAP:
return o.as<std::multimap<msgpack::type::basic_variant<STR, BIN, EXT>, msgpack::type::basic_variant<STR, BIN, EXT> > >();
default:
break;
}
return msgpack::type::basic_variant<STR, BIN, EXT>();
}
};
#endif // !defined (MSGPACK_USE_CPP03)
template <typename STR, typename BIN, typename EXT>
struct convert<msgpack::type::basic_variant<STR, BIN, EXT> > {
msgpack::object const& operator()(
msgpack::object const& o,
msgpack::type::basic_variant<STR, BIN, EXT>& v) const {
switch(o.type) {
case type::NIL:
v = o.as<msgpack::type::nil_t>();
break;
case type::BOOLEAN:
v = o.as<bool>();
break;
case type::POSITIVE_INTEGER:
v = o.as<uint64_t>();
break;
case type::NEGATIVE_INTEGER:
v = o.as<int64_t>();
break;
case type::FLOAT:
v = o.as<double>();
break;
case type::STR:
v = o.as<STR>();
break;
case type::BIN:
v = o.as<BIN>();
break;
case type::EXT:
v = o.as<EXT>();
break;
case type::ARRAY:
v = o.as<std::vector<msgpack::type::basic_variant<STR, BIN, EXT> > >();
break;
case type::MAP:
v = o.as<std::multimap<msgpack::type::basic_variant<STR, BIN, EXT>, msgpack::type::basic_variant<STR, BIN, EXT> > >();
break;
default:
break;
}
return o;
}
};
namespace detail {
template <typename Stream>
struct pack_imp : boost::static_visitor<void> {
template <typename T>
void operator()(T const& value) const {
pack<T>()(o_, value);
}
pack_imp(packer<Stream>& o):o_(o) {}
packer<Stream>& o_;
};
} // namespace detail
template <typename STR, typename BIN, typename EXT>
struct pack<msgpack::type::basic_variant<STR, BIN, EXT> > {
template <typename Stream>
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const msgpack::type::basic_variant<STR, BIN, EXT>& v) const {
boost::apply_visitor(detail::pack_imp<Stream>(o), v);
return o;
}
};
namespace detail {
struct object_imp : boost::static_visitor<void> {
void operator()(msgpack::type::nil_t const& v) const {
object<msgpack::type::nil_t>()(o_, v);
}
void operator()(bool const& v) const {
object<bool>()(o_, v);
}
void operator()(uint64_t const& v) const {
object<uint64_t>()(o_, v);
}
void operator()(int64_t const& v) const {
object<int64_t>()(o_, v);
}
void operator()(double const& v) const {
object<double>()(o_, v);
}
template <typename T>
void operator()(T const&) const {
throw msgpack::type_error();
}
object_imp(msgpack::object& o):o_(o) {}
msgpack::object& o_;
};
} // namespace detail
template <typename STR, typename BIN, typename EXT>
struct object<msgpack::type::basic_variant<STR, BIN, EXT> > {
void operator()(msgpack::object& o, const msgpack::type::basic_variant<STR, BIN, EXT>& v) const {
boost::apply_visitor(detail::object_imp(o), v);
}
};
namespace detail {
struct object_with_zone_imp : boost::static_visitor<void> {
template <typename T>
void operator()(T const& v) const {
object_with_zone<T>()(o_, v);
}
object_with_zone_imp(msgpack::object::with_zone& o):o_(o) {}
msgpack::object::with_zone& o_;
};
} // namespace detail
template <typename STR, typename BIN, typename EXT>
struct object_with_zone<msgpack::type::basic_variant<STR, BIN, EXT> > {
void operator()(msgpack::object::with_zone& o, const msgpack::type::basic_variant<STR, BIN, EXT>& v) const {
boost::apply_visitor(detail::object_with_zone_imp(o), v);
}
};
} // namespace adaptor
/// @cond
} // MSGPACK_API_VERSION_NAMESPACE(v1)
/// @endcond
} // namespace msgpack
#endif // MSGPACK_USE_BOOST
#endif // MSGPACK_TYPE_BOOST_MSGPACK_VARIANT_HPP

View File

@@ -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

View File

@@ -1,7 +1,7 @@
//
// MessagePack for C++ static resolution routine
//
// Copyright (C) 2016 KONDO Takatoshi
// Copyright (C) 2015 KONDO Takatoshi
//
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
@@ -10,6 +10,87 @@
#ifndef MSGPACK_TYPE_BOOST_OPTIONAL_HPP
#define MSGPACK_TYPE_BOOST_OPTIONAL_HPP
#include "msgpack/v1/adaptor/boost/optional.hpp"
#include "msgpack/versioning.hpp"
#include "msgpack/adaptor/adaptor_base.hpp"
#include "msgpack/adaptor/check_container_size.hpp"
// To suppress warning on Boost.1.58.0
#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) || defined(__clang__)
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-parameter"
#endif // (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) || defined(__clang__)
#include <boost/optional.hpp>
#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) || defined(__clang__)
#pragma GCC diagnostic pop
#endif // (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) || defined(__clang__)
namespace msgpack {
/// @cond
MSGPACK_API_VERSION_NAMESPACE(v1) {
/// @endcond
namespace adaptor {
#if !defined (MSGPACK_USE_CPP03)
template <typename T>
struct as<boost::optional<T>, typename std::enable_if<msgpack::has_as<T>::value>::type> {
boost::optional<T> operator()(msgpack::object const& o) const {
if(o.is_nil()) return boost::none;
return o.as<T>();
}
};
#endif // !defined (MSGPACK_USE_CPP03)
template <typename T>
struct convert<boost::optional<T> > {
msgpack::object const& operator()(msgpack::object const& o, boost::optional<T>& v) const {
if(o.is_nil()) v = boost::none;
else {
T t;
msgpack::adaptor::convert<T>()(o, t);
v = t;
}
return o;
}
};
template <typename T>
struct pack<boost::optional<T> > {
template <typename Stream>
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const boost::optional<T>& v) const {
if (v) o.pack(*v);
else o.pack_nil();
return o;
}
};
template <typename T>
struct object<boost::optional<T> > {
void operator()(msgpack::object& o, const boost::optional<T>& v) const {
if (v) msgpack::adaptor::object<T>()(o, *v);
else o.type = msgpack::type::NIL;
}
};
template <typename T>
struct object_with_zone<boost::optional<T> > {
void operator()(msgpack::object::with_zone& o, const boost::optional<T>& v) const {
if (v) msgpack::adaptor::object_with_zone<T>()(o, *v);
else o.type = msgpack::type::NIL;
}
};
} // namespace adaptor
/// @cond
} // MSGPACK_API_VERSION_NAMESPACE(v1)
/// @endcond
} // namespace msgpack
#endif // MSGPACK_TYPE_BOOST_OPTIONAL_HPP

View File

@@ -1,7 +1,7 @@
//
// MessagePack for C++ static resolution routine
//
// Copyright (C) 2016 KONDO Takatoshi
// Copyright (C) 2015 KONDO Takatoshi
//
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
@@ -10,6 +10,78 @@
#ifndef MSGPACK_TYPE_BOOST_STRING_REF_HPP
#define MSGPACK_TYPE_BOOST_STRING_REF_HPP
#include "msgpack/v1/adaptor/boost/string_ref.hpp"
#include <boost/version.hpp>
#if (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53
#include "msgpack/versioning.hpp"
#include "msgpack/adaptor/adaptor_base.hpp"
#include "msgpack/adaptor/check_container_size.hpp"
#include <boost/utility/string_ref.hpp>
namespace msgpack {
/// @cond
MSGPACK_API_VERSION_NAMESPACE(v1) {
/// @endcond
namespace adaptor {
template <>
struct convert<boost::string_ref> {
msgpack::object const& operator()(msgpack::object const& o, boost::string_ref& v) const {
switch (o.type) {
case msgpack::type::BIN:
v = boost::string_ref(o.via.bin.ptr, o.via.bin.size);
break;
case msgpack::type::STR:
v = boost::string_ref(o.via.str.ptr, o.via.str.size);
break;
default:
throw msgpack::type_error();
break;
}
return o;
}
};
template <>
struct pack<boost::string_ref> {
template <typename Stream>
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const boost::string_ref& v) const {
uint32_t size = checked_get_container_size(v.size());
o.pack_str(size);
o.pack_str_body(v.data(), size);
return o;
}
};
template <>
struct object<boost::string_ref> {
void operator()(msgpack::object& o, const boost::string_ref& v) const {
uint32_t size = checked_get_container_size(v.size());
o.type = msgpack::type::STR;
o.via.str.ptr = v.data();
o.via.str.size = size;
}
};
template <>
struct object_with_zone<boost::string_ref> {
void operator()(msgpack::object::with_zone& o, const boost::string_ref& v) const {
static_cast<msgpack::object&>(o) << v;
}
};
} // namespace adaptor
/// @cond
} // MSGPACK_API_VERSION_NAMESPACE(v1)
/// @endcond
} // namespace msgpack
#endif // (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53
#endif // MSGPACK_TYPE_BOOST_STRING_REF_HPP

View File

@@ -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

View File

@@ -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

View File

@@ -1,7 +1,7 @@
//
// MessagePack for C++ static resolution routine
//
// Copyright (C) 2016 KONDO Takatoshi
// Copyright (C) 2014-2015 KONDO Takatoshi
//
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
@@ -10,6 +10,148 @@
#ifndef MSGPACK_TYPE_CHAR_PTR_HPP
#define MSGPACK_TYPE_CHAR_PTR_HPP
#include "msgpack/v1/adaptor/char_ptr.hpp"
#include "msgpack/versioning.hpp"
#include "msgpack/object_fwd.hpp"
#include "msgpack/adaptor/check_container_size.hpp"
#include <cstring>
namespace msgpack {
/// @cond
MSGPACK_API_VERSION_NAMESPACE(v1) {
/// @endcond
namespace adaptor {
template <>
struct pack<const char*> {
template <typename Stream>
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const char* v) const {
uint32_t size = checked_get_container_size(std::strlen(v));
o.pack_str(size);
o.pack_str_body(v, size);
return o;
}
};
template <>
struct object_with_zone<const char*> {
void operator()(msgpack::object::with_zone& o, const char* v) const {
uint32_t size = checked_get_container_size(std::strlen(v));
o.type = msgpack::type::STR;
char* ptr = static_cast<char*>(o.zone.allocate_align(size));
o.via.str.ptr = ptr;
o.via.str.size = size;
std::memcpy(ptr, v, size);
}
};
template <>
struct object<const char*> {
void operator()(msgpack::object& o, const char* v) const {
uint32_t size = checked_get_container_size(std::strlen(v));
o.type = msgpack::type::STR;
o.via.str.ptr = v;
o.via.str.size = size;
}
};
template <>
struct pack<char*> {
template <typename Stream>
packer<Stream>& operator()(packer<Stream>& o, char* v) const {
return o << static_cast<const char*>(v);
}
};
template <>
struct object_with_zone<char*> {
void operator()(msgpack::object::with_zone& o, char* v) const {
o << static_cast<const char*>(v);
}
};
template <>
struct object<char*> {
void operator()(msgpack::object& o, char* v) const {
o << static_cast<const char*>(v);
}
};
template <std::size_t N>
struct pack<char[N]> {
template <typename Stream>
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const char* v) const {
uint32_t size = checked_get_container_size(std::strlen(v));
o.pack_str(size);
o.pack_str_body(v, size);
return o;
}
};
template <std::size_t N>
struct object_with_zone<char[N]> {
void operator()(msgpack::object::with_zone& o, const char* v) const {
uint32_t size = checked_get_container_size(std::strlen(v));
o.type = msgpack::type::STR;
char* ptr = static_cast<char*>(o.zone.allocate_align(size));
o.via.str.ptr = ptr;
o.via.str.size = size;
std::memcpy(ptr, v, size);
}
};
template <std::size_t N>
struct object<char[N]> {
void operator()(msgpack::object& o, const char* v) const {
uint32_t size = checked_get_container_size(std::strlen(v));
o.type = msgpack::type::STR;
o.via.str.ptr = v;
o.via.str.size = size;
}
};
template <std::size_t N>
struct pack<const char[N]> {
template <typename Stream>
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const char* v) const {
uint32_t size = checked_get_container_size(std::strlen(v));
o.pack_str(size);
o.pack_str_body(v, size);
return o;
}
};
template <std::size_t N>
struct object_with_zone<const char[N]> {
void operator()(msgpack::object::with_zone& o, const char* v) const {
uint32_t size = checked_get_container_size(std::strlen(v));
o.type = msgpack::type::STR;
char* ptr = static_cast<char*>(o.zone.allocate_align(size));
o.via.str.ptr = ptr;
o.via.str.size = size;
std::memcpy(ptr, v, size);
}
};
template <std::size_t N>
struct object<const char[N]> {
void operator()(msgpack::object& o, const char* v) const {
uint32_t size = checked_get_container_size(std::strlen(v));
o.type = msgpack::type::STR;
o.via.str.ptr = v;
o.via.str.size = size;
}
};
} // namespace adaptor
/// @cond
} // MSGPACK_API_VERSION_NAMESPACE(v1)
/// @endcond
} // namespace msgpack
#endif // MSGPACK_TYPE_CHAR_PTR_HPP

View File

@@ -1,7 +1,7 @@
//
// MessagePack for C++ static resolution routine
//
// Copyright (C) 2015-2016 KONDO Takatoshi
// Copyright (C) 2015 KONDO Takatoshi
//
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
@@ -10,8 +10,58 @@
#ifndef MSGPACK_CHECK_CONTAINER_SIZE_HPP
#define MSGPACK_CHECK_CONTAINER_SIZE_HPP
#include "msgpack/adaptor/check_container_size_decl.hpp"
#include "msgpack/versioning.hpp"
#include <stdexcept>
#include "msgpack/v1/adaptor/check_container_size.hpp"
namespace msgpack {
/// @cond
MSGPACK_API_VERSION_NAMESPACE(v1) {
/// @endcond
struct container_size_overflow : public std::runtime_error {
explicit container_size_overflow(const std::string& msg)
:std::runtime_error(msg) {}
#if !defined(MSGPACK_USE_CPP03)
explicit container_size_overflow(const char* msg):
std::runtime_error(msg) {}
#endif // !defined(MSGPACK_USE_CPP03)
};
namespace detail {
template <std::size_t N>
inline void check_container_size(std::size_t size) {
if (size > 0xffffffff) throw container_size_overflow("container size overflow");
}
template <>
inline void check_container_size<4>(std::size_t /*size*/) {
}
template <std::size_t N>
inline void check_container_size_for_ext(std::size_t size) {
if (size > 0xffffffff) throw container_size_overflow("container size overflow");
}
template <>
inline void check_container_size_for_ext<4>(std::size_t size) {
if (size > 0xfffffffe) throw container_size_overflow("container size overflow");
}
} // namespace detail
template <typename T>
inline uint32_t checked_get_container_size(T size) {
detail::check_container_size<sizeof(T)>(size);
return static_cast<uint32_t>(size);
}
/// @cond
} // MSGPACK_API_VERSION_NAMESPACE(v1)
/// @endcond
} // namespace msgpack
#endif // MSGPACK_CHECK_CONTAINER_SIZE_HPP

View File

@@ -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

View File

@@ -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

View File

@@ -1,16 +1,138 @@
//
// MessagePack for C++ static resolution routine
//
// Copyright (C) 2016 KONDO Takatoshi
// Copyright (C) 2014-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_CPP11_ARRAY_HPP
#define MSGPACK_TYPE_CPP11_ARRAY_HPP
#ifndef MSGPACK_CPP11_ARRAY_HPP
#define MSGPACK_CPP11_ARRAY_HPP
#include "msgpack/v1/adaptor/cpp11/array.hpp"
#include "msgpack/versioning.hpp"
#include "msgpack/adaptor/adaptor_base.hpp"
#include "msgpack/adaptor/check_container_size.hpp"
#include "msgpack/meta.hpp"
#endif // MSGPACK_TYPE_CPP11_ARRAY_HPP
#include <array>
namespace msgpack {
/// @cond
MSGPACK_API_VERSION_NAMESPACE(v1) {
/// @endcond
namespace adaptor {
namespace detail {
namespace array {
template<typename T, std::size_t N1, std::size_t... I1, std::size_t N2, std::size_t... I2>
inline std::array<T, N1+N2> concat(
std::array<T, N1>&& a1,
std::array<T, N2>&& a2,
msgpack::seq<I1...>,
msgpack::seq<I2...>) {
return {{ std::move(a1[I1])..., std::move(a2[I2])... }};
}
template<typename T, std::size_t N1, std::size_t N2>
inline std::array<T, N1+N2> concat(std::array<T, N1>&& a1, std::array<T, N2>&& a2) {
return concat(std::move(a1), std::move(a2), msgpack::gen_seq<N1>(), msgpack::gen_seq<N2>());
}
template <typename T, std::size_t N>
struct as_impl {
static std::array<T, N> as(msgpack::object const& o) {
msgpack::object* p = o.via.array.ptr + N - 1;
return concat(as_impl<T, N-1>::as(o), std::array<T, 1>{{p->as<T>()}});
}
};
template <typename T>
struct as_impl<T, 1> {
static std::array<T, 1> as(msgpack::object const& o) {
msgpack::object* p = o.via.array.ptr;
return std::array<T, 1>{{p->as<T>()}};
}
};
template <typename T>
struct as_impl<T, 0> {
static std::array<T, 0> as(msgpack::object const&) {
return std::array<T, 0>();
}
};
} // namespace array
} // namespace detail
template <typename T, std::size_t N>
struct as<std::array<T, N>, typename std::enable_if<msgpack::has_as<T>::value>::type> {
std::array<T, N> operator()(msgpack::object const& o) const {
if(o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
if(o.via.array.size != N) { throw msgpack::type_error(); }
return detail::array::as_impl<T, N>::as(o);
}
};
template <typename T, std::size_t N>
struct convert<std::array<T, N>> {
msgpack::object const& operator()(msgpack::object const& o, std::array<T, N>& v) const {
if(o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
if(o.via.array.size != N) { throw msgpack::type_error(); }
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;
T* it = &v[0];
do {
p->convert(*it);
++p;
++it;
} while(p < pend);
}
return o;
}
};
template <typename T, std::size_t N>
struct pack<std::array<T, N>> {
template <typename Stream>
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::array<T, N>& v) const {
uint32_t size = checked_get_container_size(v.size());
o.pack_array(size);
for(auto const& e : v) o.pack(e);
return o;
}
};
template <typename T, std::size_t N>
struct object_with_zone<std::array<T, N>> {
void operator()(msgpack::object::with_zone& o, const std::array<T, N>& v) const {
o.type = msgpack::type::ARRAY;
if(v.empty()) {
o.via.array.ptr = nullptr;
o.via.array.size = 0;
} else {
uint32_t size = checked_get_container_size(v.size());
msgpack::object* p = static_cast<msgpack::object*>(o.zone.allocate_align(sizeof(msgpack::object)*size));
o.via.array.size = size;
o.via.array.ptr = p;
for (auto const& e : v) *p++ = msgpack::object(e, o.zone);
}
}
};
} // namespace adaptor
/// @cond
} // MSGPACK_API_VERSION_NAMESPACE(v1)
/// @endcond
} // namespace msgpack
#endif // MSGPACK_CPP11_ARRAY_HPP

View File

@@ -1,16 +1,89 @@
//
// MessagePack for C++ static resolution routine
//
// Copyright (C) 2016 KONDO Takatoshi
// Copyright (C) 2014-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_ARRAY_CHAR_HPP
#define MSGPACK_TYPE_ARRAY_CHAR_HPP
#ifndef MSGPACK_TYPE_CPP11_ARRAY_CHAR_HPP
#define MSGPACK_TYPE_CPP11_ARRAY_CHAR_HPP
#include "msgpack/versioning.hpp"
#include "msgpack/adaptor/adaptor_base.hpp"
#include "msgpack/adaptor/check_container_size.hpp"
#include "msgpack/v1/adaptor/cpp11/array_char.hpp"
#include <array>
#endif // MSGPACK_TYPE_CPP11_ARRAY_CHAR_HPP
namespace msgpack {
/// @cond
MSGPACK_API_VERSION_NAMESPACE(v1) {
/// @endcond
namespace adaptor {
template <std::size_t N>
struct convert<std::array<char, N>> {
msgpack::object const& operator()(msgpack::object const& o, std::array<char, N>& v) const {
switch (o.type) {
case msgpack::type::BIN:
if(o.via.bin.size != N) { throw msgpack::type_error(); }
std::memcpy(v.data(), o.via.bin.ptr, o.via.bin.size);
break;
case msgpack::type::STR:
if(o.via.str.size != N) { throw msgpack::type_error(); }
std::memcpy(v.data(), o.via.str.ptr, N);
break;
default:
throw msgpack::type_error();
break;
}
return o;
}
};
template <std::size_t N>
struct pack<std::array<char, N>> {
template <typename Stream>
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::array<char, N>& v) const {
uint32_t size = checked_get_container_size(v.size());
o.pack_bin(size);
o.pack_bin_body(v.data(), size);
return o;
}
};
template <std::size_t N>
struct object<std::array<char, N>> {
void operator()(msgpack::object& o, const std::array<char, N>& v) const {
uint32_t size = checked_get_container_size(v.size());
o.type = msgpack::type::BIN;
o.via.bin.ptr = v.data();
o.via.bin.size = size;
}
};
template <std::size_t N>
struct object_with_zone<std::array<char, N>> {
void operator()(msgpack::object::with_zone& o, const std::array<char, N>& v) const {
uint32_t size = checked_get_container_size(v.size());
o.type = msgpack::type::BIN;
char* ptr = static_cast<char*>(o.zone.allocate_align(size));
o.via.bin.ptr = ptr;
o.via.bin.size = size;
std::memcpy(ptr, v.data(), size);
}
};
} // namespace adaptor
/// @cond
} // MSGPACK_API_VERSION_NAMESPACE(v1)
/// @endcond
} // namespace msgpack
#endif // MSGPACK_TYPE_ARRAY_CHAR_HPP

View File

@@ -1,16 +1,89 @@
//
// MessagePack for C++ static resolution routine
//
// Copyright (C) 2016 KONDO Takatoshi
// Copyright (C) 2014-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_ARRAY_UNSIGNED_CHAR_HPP
#define MSGPACK_TYPE_ARRAY_UNSIGNED_CHAR_HPP
#ifndef MSGPACK_TYPE_CPP11_ARRAY_UNSIGNED_CHAR_HPP
#define MSGPACK_TYPE_CPP11_ARRAY_UNSIGNED_CHAR_HPP
#include "msgpack/versioning.hpp"
#include "msgpack/adaptor/adaptor_base.hpp"
#include "msgpack/adaptor/check_container_size.hpp"
#include "msgpack/v1/adaptor/cpp11/array_unsigned_char.hpp"
#include <array>
#endif // MSGPACK_TYPE_CPP11_ARRAY_UNSIGNED_CHAR_HPP
namespace msgpack {
/// @cond
MSGPACK_API_VERSION_NAMESPACE(v1) {
/// @endcond
namespace adaptor {
template <std::size_t N>
struct convert<std::array<unsigned char, N>> {
msgpack::object const& operator()(msgpack::object const& o, std::array<unsigned char, N>& v) const {
switch (o.type) {
case msgpack::type::BIN:
if(o.via.bin.size != N) { throw msgpack::type_error(); }
std::memcpy(v.data(), o.via.bin.ptr, o.via.bin.size);
break;
case msgpack::type::STR:
if(o.via.str.size != N) { throw msgpack::type_error(); }
std::memcpy(v.data(), o.via.str.ptr, N);
break;
default:
throw msgpack::type_error();
break;
}
return o;
}
};
template <std::size_t N>
struct pack<std::array<unsigned char, N>> {
template <typename Stream>
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::array<unsigned char, N>& v) const {
uint32_t size = checked_get_container_size(v.size());
o.pack_bin(size);
o.pack_bin_body(reinterpret_cast<char const*>(v.data()), size);
return o;
}
};
template <std::size_t N>
struct object<std::array<unsigned char, N>> {
void operator()(msgpack::object& o, const std::array<unsigned char, N>& v) const {
uint32_t size = checked_get_container_size(v.size());
o.type = msgpack::type::BIN;
o.via.bin.ptr = reinterpret_cast<char const*>(v.data());
o.via.bin.size = size;
}
};
template <std::size_t N>
struct object_with_zone<std::array<unsigned char, N>> {
void operator()(msgpack::object::with_zone& o, const std::array<unsigned char, N>& v) const {
uint32_t size = checked_get_container_size(v.size());
o.type = msgpack::type::BIN;
char* ptr = static_cast<char*>(o.zone.allocate_align(size));
o.via.bin.ptr = ptr;
o.via.bin.size = size;
std::memcpy(ptr, v.data(), size);
}
};
} // namespace adaptor
/// @cond
} // MSGPACK_API_VERSION_NAMESPACE(v1)
/// @endcond
} // namespace msgpack
#endif // MSGPACK_TYPE_ARRAY_UNSIGNED_CHAR_HPP

View File

@@ -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

View File

@@ -1,16 +1,94 @@
//
// MessagePack for C++ static resolution routine
//
// Copyright (C) 2016 KONDO Takatoshi
// Copyright (C) 2014 KONDO-2015 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
#ifndef MSGPACK_CPP11_FORWARD_LIST_HPP
#define MSGPACK_CPP11_FORWARD_LIST_HPP
#include "msgpack/v1/adaptor/cpp11/forward_list.hpp"
#include "msgpack/versioning.hpp"
#include "msgpack/adaptor/adaptor_base.hpp"
#include "msgpack/adaptor/check_container_size.hpp"
#endif // MSGPACK_TYPE_CPP11_FORWARD_LIST_HPP
#include <forward_list>
namespace msgpack {
/// @cond
MSGPACK_API_VERSION_NAMESPACE(v1) {
/// @endcond
namespace adaptor {
template <typename T, typename Alloc>
struct as<std::forward_list<T, Alloc>, typename std::enable_if<msgpack::has_as<T>::value>::type> {
std::forward_list<T, Alloc> operator()(msgpack::object const& o) const {
if (o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
std::forward_list<T, Alloc> v;
msgpack::object* p = o.via.array.ptr + o.via.array.size;
msgpack::object* const pend = o.via.array.ptr;
while (p != pend) {
--p;
v.push_front(p->as<T>());
}
return v;
}
};
template <typename T, typename Alloc>
struct convert<std::forward_list<T, Alloc>> {
msgpack::object const& operator()(msgpack::object const& o, std::forward_list<T, Alloc>& v) const {
if(o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
v.resize(o.via.array.size);
msgpack::object* p = o.via.array.ptr;
for (auto &e : v) {
p->convert(e);
++p;
}
return o;
}
};
template <typename T, typename Alloc>
struct pack<std::forward_list<T, Alloc>> {
template <typename Stream>
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::forward_list<T, Alloc>& v) const {
uint32_t size = checked_get_container_size(std::distance(v.begin(), v.end()));
o.pack_array(size);
for(auto const& e : v) o.pack(e);
return o;
}
};
template <typename T, typename Alloc>
struct object_with_zone<std::forward_list<T, Alloc>> {
void operator()(msgpack::object::with_zone& o, const std::forward_list<T, Alloc>& v) const {
o.type = msgpack::type::ARRAY;
if(v.empty()) {
o.via.array.ptr = nullptr;
o.via.array.size = 0;
} else {
uint32_t size = checked_get_container_size(std::distance(v.begin(), v.end()));
o.via.array.size = size;
msgpack::object* p = static_cast<msgpack::object*>(
o.zone.allocate_align(sizeof(msgpack::object)*size));
o.via.array.ptr = p;
for(auto const& e : v) *p++ = msgpack::object(e, o.zone);
}
}
};
} // namespace adaptor
/// @cond
} // MSGPACK_API_VERSION_NAMESPACE(v1)
/// @endcond
} // namespace msgpack
#endif // MSGPACK_CPP11_FORWARD_LIST_HPP

View File

@@ -1,16 +1,68 @@
//
// MessagePack for C++ static resolution routine
//
// Copyright (C) 2016 KONDO Takatoshi
// 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_CPP11_REFERENCE_WRAPPER_HPP
#define MSGPACK_TYPE_CPP11_REFERENCE_WRAPPER_HPP
#ifndef MSGPACK_CPP11_REFERENCE_WRAPPER_HPP
#define MSGPACK_CPP11_REFERENCE_WRAPPER_HPP
#include "msgpack/v1/adaptor/cpp11/reference_wrapper.hpp"
#include "msgpack/versioning.hpp"
#include "msgpack/adaptor/adaptor_base.hpp"
#include "msgpack/adaptor/check_container_size.hpp"
#endif // MSGPACK_TYPE_CPP11_REFERENCE_WRAPPER_HPP
#include <memory>
#include <type_traits>
namespace msgpack {
/// @cond
MSGPACK_API_VERSION_NAMESPACE(v1) {
/// @endcond
namespace adaptor {
template <typename T>
struct convert<std::reference_wrapper<T>> {
msgpack::object const& operator()(msgpack::object const& o, std::reference_wrapper<T>& v) const {
msgpack::adaptor::convert<T>()(o, v.get());
return o;
}
};
template <typename T>
struct pack<std::reference_wrapper<T>> {
template <typename Stream>
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::reference_wrapper<T>& v) const {
o.pack(v.get());
return o;
}
};
template <typename T>
struct object<std::reference_wrapper<T> > {
void operator()(msgpack::object& o, const std::reference_wrapper<T>& v) const {
msgpack::adaptor::object<typename std::remove_const<T>::type>()(o, v.get());
}
};
template <typename T>
struct object_with_zone<std::reference_wrapper<T>> {
void operator()(msgpack::object::with_zone& o, const std::reference_wrapper<T>& v) const {
msgpack::adaptor::object_with_zone<typename std::remove_const<T>::type>()(o, v.get());
}
};
} // namespace adaptor
/// @cond
} // MSGPACK_API_VERSION_NAMESPACE(v1)
/// @endcond
} // namespace msgpack
#endif // MSGPACK_CPP11_REFERENCE_WRAPPER_HPP

Some files were not shown because too many files have changed in this diff Show More