mirror of
https://github.com/msgpack/msgpack-c.git
synced 2025-10-24 00:49:47 +02:00
Compare commits
521 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b0d379a6f2 | ||
|
|
7d5324f294 | ||
|
|
61f8780d59 | ||
|
|
6e7deb8091 | ||
|
|
66fa561256 | ||
|
|
243fb27c3c | ||
|
|
746e983bf3 | ||
|
|
766afb90ed | ||
|
|
403567c1c5 | ||
|
|
f3fe1b801e | ||
|
|
4fdbc7518f | ||
|
|
0dbdb3d974 | ||
|
|
d7d5be414f | ||
|
|
4d36456799 | ||
|
|
b1725d4007 | ||
|
|
102dba8e24 | ||
|
|
1a372058a6 | ||
|
|
f8b691f622 | ||
|
|
7893d4d8c9 | ||
|
|
9a3cd0c951 | ||
|
|
46684265d5 | ||
|
|
9e0d87b725 | ||
|
|
bbc03b2b0a | ||
|
|
b4d28c3d9d | ||
|
|
cc1098998f | ||
|
|
d9c5978958 | ||
|
|
d05daa1df6 | ||
|
|
534466894e | ||
|
|
d04520044f | ||
|
|
c0fb6b3b8c | ||
|
|
19df3314f4 | ||
|
|
b530b7f21a | ||
|
|
ed49ea3c95 | ||
|
|
7918c19f8f | ||
|
|
0d7caecdb5 | ||
|
|
f8b0ad1766 | ||
|
|
7ed7af90b6 | ||
|
|
4a94f836a7 | ||
|
|
b36e548db2 | ||
|
|
e6c276edf3 | ||
|
|
befc3cdd0c | ||
|
|
2e2e93ba2e | ||
|
|
3b2bb56243 | ||
|
|
9c4562382b | ||
|
|
08b0c88c21 | ||
|
|
d105f97ea0 | ||
|
|
bd0665bed3 | ||
|
|
8dc865d92d | ||
|
|
8085ab8721 | ||
|
|
b36e75a42e | ||
|
|
f17f8d79c4 | ||
|
|
f89f05b883 | ||
|
|
bd5f814cb2 | ||
|
|
bf6cc035c7 | ||
|
|
a6bf728a5c | ||
|
|
698a482b67 | ||
|
|
fbf5b9d74c | ||
|
|
65c35caab2 | ||
|
|
ff9f14742b | ||
|
|
4b4eb83cd1 | ||
|
|
7761497778 | ||
|
|
6046d5c666 | ||
|
|
83eb70d718 | ||
|
|
70f950ac05 | ||
|
|
3129326432 | ||
|
|
799cd15107 | ||
|
|
942965ee87 | ||
|
|
a123053823 | ||
|
|
c7603fbbd1 | ||
|
|
6954e01338 | ||
|
|
7e23ec496a | ||
|
|
bae148bd76 | ||
|
|
3fcecf7099 | ||
|
|
7d994630d2 | ||
|
|
29b9505cb7 | ||
|
|
e07d774004 | ||
|
|
ff77227e10 | ||
|
|
de99222801 | ||
|
|
7cdc5b88e3 | ||
|
|
fbdf16db09 | ||
|
|
41b2af8884 | ||
|
|
9389912eaf | ||
|
|
d5242a7d8c | ||
|
|
d3fecce359 | ||
|
|
7a70d74971 | ||
|
|
fcf89fe901 | ||
|
|
ec8c0bc1c1 | ||
|
|
a2f3689865 | ||
|
|
2d54c0e918 | ||
|
|
ce088e7e0a | ||
|
|
a1b86507da | ||
|
|
9235d1acae | ||
|
|
12172e7dc7 | ||
|
|
6a08446b3d | ||
|
|
c93a42b5f4 | ||
|
|
8febbfd9f5 | ||
|
|
33a8d8c30f | ||
|
|
ef5bcadd95 | ||
|
|
fadc615f4e | ||
|
|
eff6f5a2fd | ||
|
|
ed30252bdc | ||
|
|
2deed25da0 | ||
|
|
419877cf3a | ||
|
|
17267ed475 | ||
|
|
b759f5bdf7 | ||
|
|
f72372314e | ||
|
|
530561eec0 | ||
|
|
aec88c06a0 | ||
|
|
09e06a8cb7 | ||
|
|
084db3fcf1 | ||
|
|
709d6f4fdd | ||
|
|
27cf578e8c | ||
|
|
7001679959 | ||
|
|
daa78b4606 | ||
|
|
b893f7750c | ||
|
|
8792f42f8d | ||
|
|
4f9ec65713 | ||
|
|
db54c78ed4 | ||
|
|
1155babda8 | ||
|
|
83a82e3eb5 | ||
|
|
aa9c73352c | ||
|
|
df9e003b35 | ||
|
|
f6ddc9b85a | ||
|
|
11cfeeec92 | ||
|
|
d72765870a | ||
|
|
349c133171 | ||
|
|
c056026dad | ||
|
|
0421dabc1e | ||
|
|
60930f4b12 | ||
|
|
b3dfe28be4 | ||
|
|
e703d8a2f7 | ||
|
|
801f61c12c | ||
|
|
a3e75a0709 | ||
|
|
92d34cbd79 | ||
|
|
c99fd62ae6 | ||
|
|
a3986b3bdc | ||
|
|
7fed49e6fe | ||
|
|
005e06e00a | ||
|
|
b6d4bb5cb0 | ||
|
|
f57bfd998b | ||
|
|
e8d3387a04 | ||
|
|
53d2ea9ad3 | ||
|
|
b6803a5fec | ||
|
|
210d3ce390 | ||
|
|
a350e0714e | ||
|
|
72757feae4 | ||
|
|
fe2346efa1 | ||
|
|
43ae287be3 | ||
|
|
b804e12dec | ||
|
|
99c221ad01 | ||
|
|
3a615bcf44 | ||
|
|
87863c1696 | ||
|
|
45defd565a | ||
|
|
f1726cef0d | ||
|
|
8a788f3a48 | ||
|
|
7710868556 | ||
|
|
0b53833856 | ||
|
|
43c643bab6 | ||
|
|
ac64fcace8 | ||
|
|
84ba0c7b4b | ||
|
|
f79606d9ff | ||
|
|
3aaadb9b12 | ||
|
|
8a3a11f123 | ||
|
|
32f1f0edf2 | ||
|
|
5bd75905cb | ||
|
|
eebdc007a9 | ||
|
|
3aae588a6a | ||
|
|
cb2dcb19b9 | ||
|
|
c58a565366 | ||
|
|
93b944eec4 | ||
|
|
7340f1e9c8 | ||
|
|
0a65c443a2 | ||
|
|
bae6a8db57 | ||
|
|
ddb320197a | ||
|
|
dc51f6493b | ||
|
|
c027909acc | ||
|
|
2bd56533fa | ||
|
|
c07452a7a2 | ||
|
|
8701aeec30 | ||
|
|
2c4f2b890e | ||
|
|
f1acd78e54 | ||
|
|
49d22b7d28 | ||
|
|
96133c8dd9 | ||
|
|
bd18a36dae | ||
|
|
3fe630769e | ||
|
|
2f80758889 | ||
|
|
9f3efe9e54 | ||
|
|
6e44edf290 | ||
|
|
d28cbf32b9 | ||
|
|
48d226e97c | ||
|
|
64698e8e8c | ||
|
|
e0d098641c | ||
|
|
06f4b05487 | ||
|
|
122fce5aee | ||
|
|
e3f5281903 | ||
|
|
88e94e3776 | ||
|
|
95275ff16e | ||
|
|
4cb938ed18 | ||
|
|
5f3e62461e | ||
|
|
ec239933db | ||
|
|
de59b393c7 | ||
|
|
b02371efe5 | ||
|
|
f34289fdfd | ||
|
|
584478a4f1 | ||
|
|
700ec688f7 | ||
|
|
a133c1d393 | ||
|
|
6ba9a58648 | ||
|
|
bb92d326c8 | ||
|
|
1e13dadf1f | ||
|
|
7b271c2af2 | ||
|
|
c3f4e52bdb | ||
|
|
458b4c0363 | ||
|
|
f8dc0f0d04 | ||
|
|
347658cdc1 | ||
|
|
427a6e7313 | ||
|
|
7f76a3caf0 | ||
|
|
40539727e6 | ||
|
|
30e56d0a45 | ||
|
|
8eef2a245b | ||
|
|
2bcfe2fdb0 | ||
|
|
2b49e62b3c | ||
|
|
bf70a36a1d | ||
|
|
eb92058cf4 | ||
|
|
423eaf25fb | ||
|
|
280abe852c | ||
|
|
c91307aaa1 | ||
|
|
88ffd08087 | ||
|
|
bd337129c6 | ||
|
|
1f5cb86366 | ||
|
|
0d39c577d8 | ||
|
|
7e66dc28f0 | ||
|
|
bec47a59f0 | ||
|
|
064f854ddf | ||
|
|
a05d92ae85 | ||
|
|
1fdfde5d5f | ||
|
|
b1620f1f6a | ||
|
|
f789635ddc | ||
|
|
f65c26e280 | ||
|
|
579212996f | ||
|
|
208595b262 | ||
|
|
83a4b89818 | ||
|
|
d46f220737 | ||
|
|
b4db293181 | ||
|
|
d1eac600e9 | ||
|
|
7e758ca053 | ||
|
|
db6d4f2003 | ||
|
|
1ba46a30ce | ||
|
|
5ece2ef2c7 | ||
|
|
9513734040 | ||
|
|
d452625ed1 | ||
|
|
b02c6beb4d | ||
|
|
06c2896def | ||
|
|
724db8ed89 | ||
|
|
fa48078a52 | ||
|
|
d8ad85fa8c | ||
|
|
cc3b895449 | ||
|
|
384242e5eb | ||
|
|
7a98138f27 | ||
|
|
cd4e0bda57 | ||
|
|
1ad2db0c42 | ||
|
|
96a76a7a5c | ||
|
|
bc964bd847 | ||
|
|
12604b5c8e | ||
|
|
7c67109396 | ||
|
|
fd4e28f23d | ||
|
|
2098062613 | ||
|
|
22bc707035 | ||
|
|
7ad743f2da | ||
|
|
315bbd4b40 | ||
|
|
288a6b2e31 | ||
|
|
a0e4294b5a | ||
|
|
64baa15f8e | ||
|
|
354ee5b9a3 | ||
|
|
2ddd79499c | ||
|
|
7f0614e998 | ||
|
|
150d74508e | ||
|
|
8674c821c4 | ||
|
|
10be66712d | ||
|
|
2698cfc254 | ||
|
|
333ee98ab2 | ||
|
|
156e315394 | ||
|
|
01fedf847b | ||
|
|
56db4475f2 | ||
|
|
f065c2a447 | ||
|
|
ba4d8df63e | ||
|
|
c00584281f | ||
|
|
45a0124ede | ||
|
|
ceb27348bd | ||
|
|
1ad737ee08 | ||
|
|
7024a1ec2c | ||
|
|
ca4a425a52 | ||
|
|
a502097fd0 | ||
|
|
6b99a0c8b7 | ||
|
|
1a3fcc3a22 | ||
|
|
111739f8ce | ||
|
|
f638e2186b | ||
|
|
002376c678 | ||
|
|
09a2f81b5f | ||
|
|
ffcaaeb482 | ||
|
|
bd511a4bd1 | ||
|
|
684c5e0bb0 | ||
|
|
8e74449181 | ||
|
|
f2b788e51f | ||
|
|
7214b4c73f | ||
|
|
a7a78bde9b | ||
|
|
c50fbe4ce9 | ||
|
|
d7d28b6f24 | ||
|
|
5ebed34376 | ||
|
|
6871a82af7 | ||
|
|
3f79968910 | ||
|
|
2e10adabb1 | ||
|
|
0411ef85e7 | ||
|
|
28b6ee0db0 | ||
|
|
3d0fa6043c | ||
|
|
ee169c4eb5 | ||
|
|
0aaf95608f | ||
|
|
918e7edba4 | ||
|
|
88338195c0 | ||
|
|
e90231c865 | ||
|
|
15d8bb6792 | ||
|
|
20ef1f925b | ||
|
|
89b8f4ee13 | ||
|
|
304ff96d04 | ||
|
|
10c1917f22 | ||
|
|
d85e731ab4 | ||
|
|
d431e25257 | ||
|
|
3d82c2d651 | ||
|
|
2cbaa3a7db | ||
|
|
bfc6e45a2f | ||
|
|
e8fa6c1aee | ||
|
|
d49bec4e11 | ||
|
|
004939e732 | ||
|
|
09e8833d53 | ||
|
|
9ed842c014 | ||
|
|
99c4d37a39 | ||
|
|
4df2bdecda | ||
|
|
597cd63121 | ||
|
|
a51f33c02f | ||
|
|
88032f37e1 | ||
|
|
a76911a72c | ||
|
|
1bc27d72cc | ||
|
|
a6599e5fb4 | ||
|
|
791f55da35 | ||
|
|
e58b00016b | ||
|
|
b4fe698777 | ||
|
|
e89045cfcd | ||
|
|
c6e6dbc608 | ||
|
|
e271cf2aed | ||
|
|
53e4bb92fe | ||
|
|
303c1000c2 | ||
|
|
088ce946b9 | ||
|
|
dc86adbf8e | ||
|
|
ad0cae30ad | ||
|
|
bf3e2abc9e | ||
|
|
b7543e1386 | ||
|
|
1f515b3ae7 | ||
|
|
a933fa5892 | ||
|
|
a07622c276 | ||
|
|
c955727d8c | ||
|
|
094b70213a | ||
|
|
c0bf8b3aff | ||
|
|
5be2757216 | ||
|
|
c6c31dc5cd | ||
|
|
c704d4bfab | ||
|
|
4466bda819 | ||
|
|
4623654996 | ||
|
|
84ad9a2634 | ||
|
|
9b141fa9b6 | ||
|
|
6a1fa2e0fc | ||
|
|
c55f778198 | ||
|
|
b4f2acb945 | ||
|
|
7e139125e2 | ||
|
|
9d37316b44 | ||
|
|
364fc0daf6 | ||
|
|
f24201f71f | ||
|
|
9a113bb0ca | ||
|
|
2674e34769 | ||
|
|
c5c3de8f61 | ||
|
|
0b7cabd322 | ||
|
|
22780a6808 | ||
|
|
4ec0fdf207 | ||
|
|
85a0404d8c | ||
|
|
ce67c8ed35 | ||
|
|
1893a8e31e | ||
|
|
dc8c253577 | ||
|
|
9c77a0f24a | ||
|
|
61c053d37e | ||
|
|
04b549a46b | ||
|
|
4a1db60af8 | ||
|
|
55b51c506f | ||
|
|
a97c00e463 | ||
|
|
e61cd76310 | ||
|
|
c30962da25 | ||
|
|
6b7becdef0 | ||
|
|
cfa1ab38cc | ||
|
|
2f34d22bf5 | ||
|
|
401460b7d9 | ||
|
|
03b770fdf2 | ||
|
|
d3cd07987b | ||
|
|
b4786711df | ||
|
|
ccc9ac5538 | ||
|
|
1df97bc37b | ||
|
|
8d09b7090d | ||
|
|
2a7335ae90 | ||
|
|
e7eae65ab7 | ||
|
|
4e663609ca | ||
|
|
98820ec6c7 | ||
|
|
baea172cc9 | ||
|
|
e9e31a2899 | ||
|
|
8ffb619031 | ||
|
|
a3ed6274c2 | ||
|
|
f795e5d568 | ||
|
|
87ff7e4ccc | ||
|
|
da46fb1ef7 | ||
|
|
b90bcf3c11 | ||
|
|
c1f19c0e47 | ||
|
|
d9a77e220a | ||
|
|
894547582b | ||
|
|
3a87cc8826 | ||
|
|
6177038fcf | ||
|
|
25259dc705 | ||
|
|
5d69c22bf9 | ||
|
|
a9caff538e | ||
|
|
9a2bb0c972 | ||
|
|
7191a3b014 | ||
|
|
b82b58f184 | ||
|
|
73af452ed8 | ||
|
|
95b31d0d16 | ||
|
|
c73d9a9dab | ||
|
|
0164c1efe2 | ||
|
|
48abfe7aa1 | ||
|
|
8105c33f9d | ||
|
|
237cf888d8 | ||
|
|
b9bc9d4195 | ||
|
|
aa790ba785 | ||
|
|
1da0539a00 | ||
|
|
d7a656523b | ||
|
|
f573fd6a26 | ||
|
|
4fa661a63d | ||
|
|
2e4de8b65c | ||
|
|
42181289ed | ||
|
|
cd84d04860 | ||
|
|
0d1e1787de | ||
|
|
45b8d29cc0 | ||
|
|
0bfe4c49b7 | ||
|
|
3c997edd71 | ||
|
|
523e986077 | ||
|
|
90c2e35694 | ||
|
|
4ffdc01135 | ||
|
|
b398ce9acc | ||
|
|
1b87018a0a | ||
|
|
755342bb25 | ||
|
|
438c4ff8ca | ||
|
|
20e777c1fa | ||
|
|
3f98327f3b | ||
|
|
224a830ce0 | ||
|
|
b4c4c213b1 | ||
|
|
edc8004985 | ||
|
|
7f37eac04c | ||
|
|
0f66e144ab | ||
|
|
0d475a9dbc | ||
|
|
ca5ef097ac | ||
|
|
4ee616bbde | ||
|
|
de972fbe0f | ||
|
|
585f330694 | ||
|
|
89faf6ee9f | ||
|
|
83dbe398fd | ||
|
|
b68c073d1b | ||
|
|
7eb8c8221a | ||
|
|
7094e0872e | ||
|
|
4b26a82ae8 | ||
|
|
22613d4dd0 | ||
|
|
d15d9220ff | ||
|
|
a3f353ef42 | ||
|
|
cc02da0ccf | ||
|
|
e6f82cf2bb | ||
|
|
6593cba284 | ||
|
|
d5b515899c | ||
|
|
068041f05e | ||
|
|
e21b4ef28d | ||
|
|
4c9685977b | ||
|
|
c9814de513 | ||
|
|
bf7bc19ccb | ||
|
|
07b5000824 | ||
|
|
d6ef2bc91d | ||
|
|
db90ee4283 | ||
|
|
a3e868acb8 | ||
|
|
62048e1aa0 | ||
|
|
31a06a0682 | ||
|
|
72c7feb2c4 | ||
|
|
a83e43a52f | ||
|
|
8b1632dc1d | ||
|
|
170d29a13c | ||
|
|
1bfcf55469 | ||
|
|
85164687f3 | ||
|
|
f5f42782be | ||
|
|
60a4cba6d6 | ||
|
|
5ecb797d8a | ||
|
|
455e0190d1 | ||
|
|
84932e62e9 | ||
|
|
fe229d1df0 | ||
|
|
b5b865a6ca | ||
|
|
d8e9941fa9 | ||
|
|
bab3eea3a8 | ||
|
|
07e635f158 | ||
|
|
b641065d1f | ||
|
|
60d4b2833d | ||
|
|
1244edeaf1 | ||
|
|
acf4ac01fc | ||
|
|
549c28459e | ||
|
|
86ac7c6eb7 | ||
|
|
0e53b350d3 | ||
|
|
db0726fa76 | ||
|
|
664ab708e4 | ||
|
|
f88e621dca | ||
|
|
0e7345c282 | ||
|
|
7b578cc065 | ||
|
|
988f72d5eb | ||
|
|
c51e8ace48 | ||
|
|
43a86cf5b9 | ||
|
|
54cb4350b3 |
19
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
19
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
---
|
||||||
|
name: Bug report
|
||||||
|
about: Create a report to help us improve
|
||||||
|
title: ''
|
||||||
|
labels: ''
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Describe the bug**
|
||||||
|
A clear and concise description of what the bug is.
|
||||||
|
msgpack-c or msgpack-cxx version.
|
||||||
|
e.g) msgpack-cxx 5.0.0
|
||||||
|
|
||||||
|
**To Reproduce**
|
||||||
|
Please prepare https://stackoverflow.com/help/minimal-reproducible-example
|
||||||
|
|
||||||
|
**Expected behavior**
|
||||||
|
A clear and concise description of what you expected to happen.
|
||||||
51
.gitignore
vendored
51
.gitignore
vendored
@@ -1,51 +0,0 @@
|
|||||||
# Files generated by the bootstrap script.
|
|
||||||
/INSTALL
|
|
||||||
/AUTHORS
|
|
||||||
/ChangeLog
|
|
||||||
/NEWS
|
|
||||||
/README
|
|
||||||
/ac/
|
|
||||||
/aclocal.m4
|
|
||||||
/autom4te.cache/
|
|
||||||
/config.h.in
|
|
||||||
/configure
|
|
||||||
/msgpack_vc2008.sln
|
|
||||||
/msgpack_vc2008.vcproj
|
|
||||||
Makefile.in
|
|
||||||
|
|
||||||
# Files generated by the configure script.
|
|
||||||
|
|
||||||
/config.h
|
|
||||||
/config.log
|
|
||||||
/config.status
|
|
||||||
/libtool
|
|
||||||
/msgpack.pc
|
|
||||||
/src/msgpack/version.h
|
|
||||||
/src/msgpack/version.hpp
|
|
||||||
/stamp-h1
|
|
||||||
Makefile
|
|
||||||
.deps
|
|
||||||
.libs
|
|
||||||
|
|
||||||
# Files generated by make.
|
|
||||||
*.o
|
|
||||||
*.so
|
|
||||||
*.lo
|
|
||||||
*.la
|
|
||||||
|
|
||||||
# Files generated by make check.
|
|
||||||
# TODO: Replace these with something like /test/*_test
|
|
||||||
/test/buffer
|
|
||||||
/test/cases
|
|
||||||
/test/convert
|
|
||||||
/test/fixint
|
|
||||||
/test/fixint_c
|
|
||||||
/test/msgpack_test
|
|
||||||
/test/msgpackc_test
|
|
||||||
/test/object
|
|
||||||
/test/pack_unpack
|
|
||||||
/test/pack_unpack_c
|
|
||||||
/test/streaming
|
|
||||||
/test/streaming_c
|
|
||||||
/test/version
|
|
||||||
/test/zone
|
|
||||||
6
.gitmodules
vendored
6
.gitmodules
vendored
@@ -1,6 +0,0 @@
|
|||||||
[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
91
.travis.yml
@@ -1,91 +0,0 @@
|
|||||||
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}
|
|
||||||
191
CHANGELOG.md
191
CHANGELOG.md
@@ -1,12 +1,189 @@
|
|||||||
# 2016-05-26 version 1.4.2
|
# 2020-06-05 version 3.3.0
|
||||||
* Fix C++03 msgpack::zone::clear() memory access violation bug (#467)
|
* 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)
|
||||||
|
|
||||||
# 2016-03-06 version 1.4.1
|
# 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)
|
||||||
|
|
||||||
* Fix TARGET_OS_IPHONE checking (#436, #438)
|
# 2019-05-27 version 3.2.0
|
||||||
* Fix invalid front() call for empty container (#435. #437)
|
|
||||||
* Fix compile error on g++6 (C++11 only) (#426, #428)
|
* Fix invalid include (#783)
|
||||||
* Fix zone size expansion logic (#423, #427)
|
* 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)
|
||||||
|
|
||||||
# 2016-01-22 version 1.4.0
|
# 2016-01-22 version 1.4.0
|
||||||
|
|
||||||
|
|||||||
381
CMakeLists.txt
381
CMakeLists.txt
@@ -1,381 +0,0 @@
|
|||||||
CMAKE_MINIMUM_REQUIRED (VERSION 2.8.6)
|
|
||||||
PROJECT (msgpack)
|
|
||||||
|
|
||||||
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})
|
|
||||||
SET (VERSION_MINOR ${CMAKE_MATCH_1})
|
|
||||||
STRING (REGEX MATCH "#define MSGPACK_VERSION_REVISION *([0-9a-zA-Z_]*)" NULL_OUT ${contents})
|
|
||||||
SET (VERSION_REVISION ${CMAKE_MATCH_1})
|
|
||||||
SET (VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION})
|
|
||||||
|
|
||||||
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_32BIT "32bit compile" OFF)
|
|
||||||
OPTION (MSGPACK_BOOST "Using boost libraries" OFF)
|
|
||||||
|
|
||||||
SET (CMAKE_CXX_FLAGS "-DMSGPACK_DISABLE_LEGACY_NIL ${CMAKE_CXX_FLAGS}")
|
|
||||||
SET (CMAKE_CXX_FLAGS "-DMSGPACK_DISABLE_LEGACY_CONVERT ${CMAKE_CXX_FLAGS}")
|
|
||||||
|
|
||||||
IF (APPLE)
|
|
||||||
SET(CMAKE_MACOSX_RPATH ON)
|
|
||||||
SET(CMAKE_SKIP_BUILD_RPATH FALSE)
|
|
||||||
SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
|
|
||||||
SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
|
|
||||||
SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
|
|
||||||
LIST(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/lib" isSystemDir)
|
|
||||||
IF ("${isSystemDir}" STREQUAL "-1")
|
|
||||||
SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
|
|
||||||
ENDIF ()
|
|
||||||
ENDIF ()
|
|
||||||
|
|
||||||
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 ()
|
|
||||||
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_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_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_C_FLAGS "-f${MSGPACK_CHAR_SIGN}-char ${CMAKE_C_FLAGS}")
|
|
||||||
SET (CMAKE_CXX_FLAGS "-f${MSGPACK_CHAR_SIGN}-char ${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 ()
|
|
||||||
|
|
||||||
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; }
|
|
||||||
int main(int argc, char * argv[])
|
|
||||||
{
|
|
||||||
atomic_sub(1);
|
|
||||||
atomic_add(1);
|
|
||||||
}
|
|
||||||
" MSGPACK_ENABLE_GCC_CXX_ATOMIC)
|
|
||||||
|
|
||||||
|
|
||||||
LIST (APPEND msgpackc_SOURCES
|
|
||||||
src/unpack.c
|
|
||||||
src/objectc.c
|
|
||||||
src/version.c
|
|
||||||
src/vrefbuffer.c
|
|
||||||
src/zone.c
|
|
||||||
)
|
|
||||||
|
|
||||||
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 ()
|
|
||||||
|
|
||||||
EXECUTE_PROCESS (
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/src/msgpack
|
|
||||||
)
|
|
||||||
|
|
||||||
CONFIGURE_FILE (
|
|
||||||
msgpack.pc.in
|
|
||||||
msgpack.pc
|
|
||||||
@ONLY
|
|
||||||
)
|
|
||||||
|
|
||||||
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)
|
|
||||||
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)
|
|
||||||
ADD_SUBDIRECTORY (test)
|
|
||||||
ENDIF ()
|
|
||||||
|
|
||||||
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_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
|
|
||||||
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 ()
|
|
||||||
20
Makefile.am
20
Makefile.am
@@ -1,20 +0,0 @@
|
|||||||
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
194
QUICKSTART-C.md
@@ -1,194 +0,0 @@
|
|||||||
# 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
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
```
|
|
||||||
@@ -1,163 +0,0 @@
|
|||||||
# Implementation Status
|
|
||||||
|
|
||||||
The serialization library is production-ready.
|
|
||||||
|
|
||||||
Currently, RPC implementation is in testing phase. Requires newer kernel, not running on RHEL5/CentOS5.
|
|
||||||
|
|
||||||
# Install
|
|
||||||
|
|
||||||
Same as QuickStart for C Language.
|
|
||||||
|
|
||||||
# Serialization QuickStart for C+\+
|
|
||||||
|
|
||||||
## First program
|
|
||||||
|
|
||||||
Include `msgpack.hpp` header and link `msgpack` library to use MessagePack on your program.
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
#include <msgpack.hpp>
|
|
||||||
#include <vector>
|
|
||||||
#include <string>
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
int main(void) {
|
|
||||||
// serializes this object.
|
|
||||||
std::vector<std::string> vec;
|
|
||||||
vec.push_back("Hello");
|
|
||||||
vec.push_back("MessagePack");
|
|
||||||
|
|
||||||
// serialize it into simple buffer.
|
|
||||||
msgpack::sbuffer sbuf;
|
|
||||||
msgpack::pack(sbuf, vec);
|
|
||||||
|
|
||||||
// deserialize it.
|
|
||||||
msgpack::unpacked msg;
|
|
||||||
msgpack::unpack(&msg, sbuf.data(), sbuf.size());
|
|
||||||
|
|
||||||
// print the deserialized object.
|
|
||||||
msgpack::object obj = msg.get();
|
|
||||||
std::cout << obj << std::endl; //=> ["Hello", "MessagePack"]
|
|
||||||
|
|
||||||
// convert it into statically typed object.
|
|
||||||
std::vector<std::string> rvec;
|
|
||||||
obj.convert(rvec);
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
Compile it as follows:
|
|
||||||
|
|
||||||
```
|
|
||||||
$ g++ -Ipath_to_msgpack/include -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
|
|
||||||
#include <msgpack.hpp>
|
|
||||||
#include <iostream>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
int main(void) {
|
|
||||||
// serializes multiple objects using msgpack::packer.
|
|
||||||
msgpack::sbuffer buffer;
|
|
||||||
|
|
||||||
msgpack::packer<msgpack::sbuffer> pk(&buffer);
|
|
||||||
pk.pack(std::string("Log message ... 1"));
|
|
||||||
pk.pack(std::string("Log message ... 2"));
|
|
||||||
pk.pack(std::string("Log message ... 3"));
|
|
||||||
|
|
||||||
// deserializes these objects using msgpack::unpacker.
|
|
||||||
msgpack::unpacker pac;
|
|
||||||
|
|
||||||
// feeds the buffer.
|
|
||||||
pac.reserve_buffer(buffer.size());
|
|
||||||
memcpy(pac.buffer(), buffer.data(), buffer.size());
|
|
||||||
pac.buffer_consumed(buffer.size());
|
|
||||||
|
|
||||||
// now starts streaming deserialization.
|
|
||||||
msgpack::unpacked result;
|
|
||||||
while(pac.next(&result)) {
|
|
||||||
std::cout << result.get() << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
// results:
|
|
||||||
// $ g++ -Ipath_to_msgpack/include -DMSGPACK_DISABLE_LEGACY_NIL -DMSGPACK_DISABLE_LEGACY_CONVERT stream.cc -o stream
|
|
||||||
// $ ./stream
|
|
||||||
// "Log message ... 1"
|
|
||||||
// "Log message ... 2"
|
|
||||||
// "Log message ... 3"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
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
|
|
||||||
#include <msgpack.hpp>
|
|
||||||
#include <iostream>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
int main(void) {
|
|
||||||
// serializes multiple objects into one message containing an array using msgpack::packer.
|
|
||||||
msgpack::sbuffer buffer;
|
|
||||||
|
|
||||||
msgpack::packer<msgpack::sbuffer> pk(&buffer);
|
|
||||||
pk.pack_array(3);
|
|
||||||
pk.pack(std::string("Log message ... 1"));
|
|
||||||
pk.pack(std::string("Log message ... 2"));
|
|
||||||
pk.pack(std::string("Log message ... 3"));
|
|
||||||
|
|
||||||
// serializes multiple objects into one message containing a map using msgpack::packer.
|
|
||||||
msgpack::sbuffer buffer2;
|
|
||||||
|
|
||||||
msgpack::packer<msgpack::sbuffer> pk2(&buffer2);
|
|
||||||
pk2.pack_map(2);
|
|
||||||
pk2.pack(std::string("x"));
|
|
||||||
pk2.pack(3);
|
|
||||||
pk2.pack(std::string("y"));
|
|
||||||
pk2.pack(3.4321);
|
|
||||||
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
## User-defined classes
|
|
||||||
|
|
||||||
You can use serialize/deserializes user-defined classes using `MSGPACK_DEFINE` macro.
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
#include <msgpack.hpp>
|
|
||||||
#include <vector>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
class myclass {
|
|
||||||
private:
|
|
||||||
std::string m_str;
|
|
||||||
std::vector<int> m_vec;
|
|
||||||
public:
|
|
||||||
MSGPACK_DEFINE(m_str, m_vec);
|
|
||||||
};
|
|
||||||
|
|
||||||
int main(void) {
|
|
||||||
std::vector<myclass> vec;
|
|
||||||
// add some elements into vec...
|
|
||||||
|
|
||||||
// you can serialize myclass directly
|
|
||||||
msgpack::sbuffer sbuf;
|
|
||||||
msgpack::pack(sbuf, vec);
|
|
||||||
|
|
||||||
msgpack::unpacked msg;
|
|
||||||
msgpack::unpack(&msg, sbuf.data(), sbuf.size());
|
|
||||||
|
|
||||||
msgpack::object obj = msg.get();
|
|
||||||
|
|
||||||
// you can convert object to myclass directly
|
|
||||||
std::vector<myclass> rvec;
|
|
||||||
obj.convert(rvec);
|
|
||||||
}
|
|
||||||
```
|
|
||||||
194
README.md
194
README.md
@@ -1,9 +1,7 @@
|
|||||||
`msgpack` for C/C++
|
`msgpack` for C/C++
|
||||||
===================
|
===================
|
||||||
|
|
||||||
Version 1.4.2 [](https://travis-ci.org/msgpack/msgpack-c) [](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
|
Overview
|
||||||
--------
|
--------
|
||||||
@@ -11,198 +9,20 @@ Overview
|
|||||||
[MessagePack](http://msgpack.org/) is an efficient binary serialization
|
[MessagePack](http://msgpack.org/) is an efficient binary serialization
|
||||||
format, which lets you exchange data among multiple languages like JSON,
|
format, which lets you exchange data among multiple languages like JSON,
|
||||||
except that it's faster and smaller. Small integers are encoded into a
|
except that it's faster and smaller. Small integers are encoded into a
|
||||||
single byte while typical short strings require only one extra byte in
|
single byte and short strings require only one extra byte in
|
||||||
addition to the strings themselves.
|
addition to the strings themselves.
|
||||||
|
|
||||||
Example
|
### C Library
|
||||||
-------
|
|
||||||
|
|
||||||
In C:
|
See [c_master](https://github.com/msgpack/msgpack-c/tree/c_master)
|
||||||
|
|
||||||
```c
|
### C++ Library
|
||||||
#include <msgpack.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
int main(void)
|
See [cpp_master](https://github.com/msgpack/msgpack-c/tree/cpp_master)
|
||||||
{
|
|
||||||
/* 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(void)
|
|
||||||
{
|
|
||||||
msgpack::type::tuple<int, bool, std::string> src(1, true, "example");
|
|
||||||
|
|
||||||
// serialize the object into the buffer.
|
|
||||||
// any classes that implements write(const char*,size_t) can be a buffer.
|
|
||||||
std::stringstream buffer;
|
|
||||||
msgpack::pack(buffer, src);
|
|
||||||
|
|
||||||
// send the buffer ...
|
|
||||||
buffer.seekg(0);
|
|
||||||
|
|
||||||
// deserialize the buffer into msgpack::object instance.
|
|
||||||
std::string str(buffer.str());
|
|
||||||
|
|
||||||
msgpack::unpacked result;
|
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
// convert msgpack::object instance into the original type.
|
|
||||||
// if the type is mismatched, it throws msgpack::type_error exception.
|
|
||||||
msgpack::type::tuple<int, bool, std::string> dst;
|
|
||||||
deserialized.convert(dst);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
See [`QUICKSTART-CPP.md`](./QUICKSTART-CPP.md) for more details.
|
|
||||||
|
|
||||||
Usage
|
|
||||||
-----
|
|
||||||
|
|
||||||
### C++ Header Only Library
|
|
||||||
|
|
||||||
When you use msgpack on C++03 and C++11, you can just add
|
|
||||||
msgpack-c/include to your include path:
|
|
||||||
|
|
||||||
g++ -I msgpack-c/include -DMSGPACK_DISABLE_LEGACY_NIL -DMSGPACK_DISABLE_LEGACY_CONVERT your_source_file.cpp
|
|
||||||
|
|
||||||
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 want to use C version of msgpack, you need to build it. You can
|
|
||||||
also install the C and C++ versions of msgpack.
|
|
||||||
|
|
||||||
### Building and Installing
|
|
||||||
|
|
||||||
#### Install from git repository
|
|
||||||
|
|
||||||
##### Using autotools
|
|
||||||
|
|
||||||
You will need:
|
|
||||||
|
|
||||||
- `gcc >= 4.1.0` or `clang >= 3.3.0`
|
|
||||||
- `autoconf >= 2.60`
|
|
||||||
- `automake >= 1.10`
|
|
||||||
- `libtool >= 2.2.4`
|
|
||||||
|
|
||||||
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
|
|
||||||
$ cd msgpack-c
|
|
||||||
$ ./bootstrap
|
|
||||||
$ ./configure
|
|
||||||
$ make
|
|
||||||
```
|
|
||||||
|
|
||||||
You can install the resulting library like this:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
$ sudo make install
|
|
||||||
```
|
|
||||||
##### Using cmake
|
|
||||||
|
|
||||||
###### Using the Terminal (CLI)
|
|
||||||
|
|
||||||
You will need:
|
|
||||||
|
|
||||||
- `gcc >= 4.1.0`
|
|
||||||
- `cmake >= 2.8.0`
|
|
||||||
|
|
||||||
C and C++03:
|
|
||||||
|
|
||||||
$ git clone https://github.com/msgpack/msgpack-c.git
|
|
||||||
$ cd msgpack-c
|
|
||||||
$ cmake .
|
|
||||||
$ make
|
|
||||||
$ sudo make install
|
|
||||||
|
|
||||||
If you want to setup C++11 version of msgpack instead,
|
|
||||||
execute the following commands:
|
|
||||||
|
|
||||||
$ git clone https://github.com/msgpack/msgpack-c.git
|
|
||||||
$ cd msgpack-c
|
|
||||||
$ cmake -DMSGPACK_CXX11=ON .
|
|
||||||
$ sudo make install
|
|
||||||
|
|
||||||
##### GUI on Windows
|
|
||||||
|
|
||||||
Clone msgpack-c git repository.
|
|
||||||
|
|
||||||
$ git clone https://github.com/msgpack/msgpack-c.git
|
|
||||||
|
|
||||||
or using GUI git client.
|
|
||||||
|
|
||||||
e.g.) tortoise git https://code.google.com/p/tortoisegit/
|
|
||||||
|
|
||||||
1. Launch [cmake GUI client](http://www.cmake.org/cmake/resources/software.html).
|
|
||||||
|
|
||||||
2. Set 'Where is the source code:' text box and 'Where to build
|
|
||||||
the binaries:' text box.
|
|
||||||
|
|
||||||
3. Click 'Configure' button.
|
|
||||||
|
|
||||||
4. Choose your Visual Studio version.
|
|
||||||
|
|
||||||
5. Click 'Generate' button.
|
|
||||||
|
|
||||||
6. Open the created msgpack.sln on Visual Studio.
|
|
||||||
|
|
||||||
7. Build all.
|
|
||||||
|
|
||||||
### Documentation
|
### Documentation
|
||||||
|
|
||||||
You can get addtional information on the
|
You can get additional information including the tutorial on the
|
||||||
[wiki](https://github.com/msgpack/msgpack-c/wiki).
|
[wiki](https://github.com/msgpack/msgpack-c/wiki).
|
||||||
|
|
||||||
Contributing
|
Contributing
|
||||||
|
|||||||
42
appveyor.yml
42
appveyor.yml
@@ -1,42 +0,0 @@
|
|||||||
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:
|
|
||||||
- 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:
|
|
||||||
- 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%\gtest-1.7.0\build\Release;%APPVEYOR_BUILD_FOLDER%\zlib-1.2.8\build\Release;%APPVEYOR_BUILD_FOLDER%\build\release
|
|
||||||
- ctest -V
|
|
||||||
121
bootstrap
121
bootstrap
@@ -1,121 +0,0 @@
|
|||||||
#!/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
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,63 +0,0 @@
|
|||||||
#!/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
|
|
||||||
@@ -1,103 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
mkdir build
|
|
||||||
|
|
||||||
ret=$?
|
|
||||||
if [ $ret -ne 0 ]
|
|
||||||
then
|
|
||||||
exit $ret
|
|
||||||
fi
|
|
||||||
|
|
||||||
cd build
|
|
||||||
|
|
||||||
ret=$?
|
|
||||||
if [ $ret -ne 0 ]
|
|
||||||
then
|
|
||||||
exit $ret
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ $1 = "cpp11" ]
|
|
||||||
then
|
|
||||||
cpp11="-DMSGPACK_CXX11=ON"
|
|
||||||
else
|
|
||||||
cpp11=""
|
|
||||||
fi
|
|
||||||
|
|
||||||
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 ]
|
|
||||||
then
|
|
||||||
exit $ret
|
|
||||||
fi
|
|
||||||
cat memcheck.log | grep "Memory Leak" > /dev/null
|
|
||||||
ret=$?
|
|
||||||
if [ $ret -eq 0 ]
|
|
||||||
then
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
98
configure.in
98
configure.in
@@ -1,98 +0,0 @@
|
|||||||
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])
|
|
||||||
@@ -1,173 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// 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_CPP03_DEFINE_ARRAY_HPP
|
|
||||||
#define MSGPACK_CPP03_DEFINE_ARRAY_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;
|
|
||||||
typedef tuple<> tuple_type;
|
|
||||||
template <typename Packer>
|
|
||||||
void msgpack_pack(Packer& pk) const
|
|
||||||
{
|
|
||||||
pk.pack_array(0);
|
|
||||||
}
|
|
||||||
void msgpack_unpack(msgpack::object const& o)
|
|
||||||
{
|
|
||||||
if(o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
|
|
||||||
}
|
|
||||||
void msgpack_object(msgpack::object* o, msgpack::zone&) const
|
|
||||||
{
|
|
||||||
o->type = msgpack::type::ARRAY;
|
|
||||||
o->via.array.ptr = nullptr;
|
|
||||||
o->via.array.size = 0;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
<%0.upto(GENERATION_LIMIT) {|i|%>
|
|
||||||
template <typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>>
|
|
||||||
struct define_array<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> {
|
|
||||||
typedef define_array<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> value_type;
|
|
||||||
typedef tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> tuple_type;
|
|
||||||
define_array(A0& _a0<%1.upto(i) {|j|%>, A<%=j%>& _a<%=j%><%}%>) :
|
|
||||||
a0(_a0)<%1.upto(i) {|j|%>, a<%=j%>(_a<%=j%>)<%}%> {}
|
|
||||||
template <typename Packer>
|
|
||||||
void msgpack_pack(Packer& pk) const
|
|
||||||
{
|
|
||||||
pk.pack_array(<%=i+1%>);
|
|
||||||
<%0.upto(i) {|j|%>
|
|
||||||
pk.pack(a<%=j%>);<%}%>
|
|
||||||
}
|
|
||||||
void msgpack_unpack(msgpack::object const& o)
|
|
||||||
{
|
|
||||||
if(o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
|
|
||||||
const size_t size = o.via.array.size;
|
|
||||||
if(size > 0) {
|
|
||||||
msgpack::object *ptr = o.via.array.ptr;
|
|
||||||
switch(size) {
|
|
||||||
default:<%(i).downto(0) {|j|%>
|
|
||||||
case <%=j+1%>: ptr[<%=j%>].convert(a<%=j%>);<%}%>
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
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%>));
|
|
||||||
o->via.array.size = <%=i+1%>;
|
|
||||||
<%0.upto(i) {|j|%>
|
|
||||||
o->via.array.ptr[<%=j%>] = msgpack::object(a<%=j%>, z);<%}%>
|
|
||||||
}
|
|
||||||
<%0.upto(i) {|j|%>
|
|
||||||
A<%=j%>& a<%=j%>;<%}%>
|
|
||||||
};
|
|
||||||
<%}%>
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
inline define_array<> make_define_array()
|
|
||||||
{
|
|
||||||
return define_array<>();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
<%0.upto(GENERATION_LIMIT) {|i|%>
|
|
||||||
template <typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>>
|
|
||||||
inline define_array<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> make_define_array(A0& a0<%1.upto(i) {|j|%>, A<%=j%>& a<%=j%><%}%>)
|
|
||||||
{
|
|
||||||
return define_array<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>>(a0<%1.upto(i) {|j|%>, a<%=j%><%}%>);
|
|
||||||
}
|
|
||||||
<%}%>
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
} // namespace type
|
|
||||||
/// @cond
|
|
||||||
} // MSGPACK_API_VERSION_NAMESPACE(v1)
|
|
||||||
/// @endcond
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
|
|
||||||
#endif // MSGPACK_CPP03_DEFINE_ARRAY_HPP
|
|
||||||
@@ -1,173 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2015 KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Distributed under the Boost Software License, Version 1.0.
|
|
||||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
|
||||||
// http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
//
|
|
||||||
#ifndef MSGPACK_CPP03_DEFINE_MAP_HPP
|
|
||||||
#define MSGPACK_CPP03_DEFINE_MAP_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"
|
|
||||||
|
|
||||||
#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
|
|
||||||
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>
|
|
||||||
void msgpack_pack(Packer& pk) const
|
|
||||||
{
|
|
||||||
pk.pack_map(0);
|
|
||||||
}
|
|
||||||
void msgpack_unpack(msgpack::object const& o) const
|
|
||||||
{
|
|
||||||
if(o.type != msgpack::type::MAP) { throw msgpack::type_error(); }
|
|
||||||
}
|
|
||||||
void msgpack_object(msgpack::object* o, msgpack::zone&) const
|
|
||||||
{
|
|
||||||
o->type = msgpack::type::MAP;
|
|
||||||
o->via.map.ptr = nullptr;
|
|
||||||
o->via.map.size = 0;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
<%1.step(GENERATION_LIMIT+1,2) {|i|%>
|
|
||||||
template <typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>>
|
|
||||||
struct define_map<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> {
|
|
||||||
define_map(A0& _a0<%1.upto(i) {|j|%>, A<%=j%>& _a<%=j%><%}%>) :
|
|
||||||
a0(_a0)<%1.upto(i) {|j|%>, a<%=j%>(_a<%=j%>)<%}%> {}
|
|
||||||
template <typename Packer>
|
|
||||||
void msgpack_pack(Packer& pk) const
|
|
||||||
{
|
|
||||||
pk.pack_map(<%=(i+1)/2%>);
|
|
||||||
<%0.upto(i) {|j|%>
|
|
||||||
pk.pack(a<%=j%>);<%}%>
|
|
||||||
}
|
|
||||||
void msgpack_unpack(msgpack::object const& o) const
|
|
||||||
{
|
|
||||||
if(o.type != msgpack::type::MAP) { throw msgpack::type_error(); }
|
|
||||||
std::map<std::string, msgpack::object const*> kvmap;
|
|
||||||
for (uint32_t i = 0; i < o.via.map.size; ++i) {
|
|
||||||
kvmap.insert(
|
|
||||||
std::map<std::string, msgpack::object const*>::value_type(
|
|
||||||
std::string(
|
|
||||||
o.via.map.ptr[i].key.via.str.ptr,
|
|
||||||
o.via.map.ptr[i].key.via.str.size),
|
|
||||||
&o.via.map.ptr[i].val
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
<%0.step(i,2) {|j|%>
|
|
||||||
{
|
|
||||||
std::map<std::string, msgpack::object const*>::const_iterator it = kvmap.find(a<%=j%>);
|
|
||||||
if (it != kvmap.end()) {
|
|
||||||
it->second->convert(a<%=j+1%>);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
<%}%>
|
|
||||||
}
|
|
||||||
void msgpack_object(msgpack::object* o, msgpack::zone& z) const
|
|
||||||
{
|
|
||||||
o->type = msgpack::type::MAP;
|
|
||||||
o->via.map.ptr = static_cast<msgpack::object_kv*>(z.allocate_align(sizeof(msgpack::object_kv)*<%=(i+1)/2%>));
|
|
||||||
o->via.map.size = <%=(i+1)/2%>;
|
|
||||||
<%0.step(i,2) {|j|%>
|
|
||||||
o->via.map.ptr[<%=j/2%>].key = msgpack::object(a<%=j%>, z);
|
|
||||||
o->via.map.ptr[<%=j/2%>].val = msgpack::object(a<%=j+1%>, z);
|
|
||||||
<%}%>
|
|
||||||
}
|
|
||||||
<%0.upto(i) {|j|%>
|
|
||||||
A<%=j%>& a<%=j%>;<%}%>
|
|
||||||
};
|
|
||||||
<%}%>
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
inline define_map<> make_define_map()
|
|
||||||
{
|
|
||||||
return define_map<>();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
<%0.upto(GENERATION_LIMIT) {|i|%>
|
|
||||||
template <typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>>
|
|
||||||
inline define_map<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> make_define_map(A0& a0<%1.upto(i) {|j|%>, A<%=j%>& a<%=j%><%}%>)
|
|
||||||
{
|
|
||||||
return define_map<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>>(a0<%1.upto(i) {|j|%>, a<%=j%><%}%>);
|
|
||||||
}
|
|
||||||
<%}%>
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
} // namespace type
|
|
||||||
/// @cond
|
|
||||||
} // MSGPACK_API_VERSION_NAMESPACE(v1)
|
|
||||||
/// @endcond
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
#endif // MSGPACK_CPP03_DEFINE_MAP_HPP
|
|
||||||
@@ -1,238 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// 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_CPP03_MSGPACK_TUPLE_HPP
|
|
||||||
#define MSGPACK_CPP03_MSGPACK_TUPLE_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 {
|
|
||||||
typedef T type;
|
|
||||||
typedef T value_type;
|
|
||||||
typedef T& reference;
|
|
||||||
typedef const T& const_reference;
|
|
||||||
typedef const T& transparent_reference;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct tuple_type<T&> {
|
|
||||||
typedef T type;
|
|
||||||
typedef T& value_type;
|
|
||||||
typedef T& reference;
|
|
||||||
typedef const T& const_reference;
|
|
||||||
typedef T& transparent_reference;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct tuple_type<const T&> {
|
|
||||||
typedef T type;
|
|
||||||
typedef T& value_type;
|
|
||||||
typedef T& reference;
|
|
||||||
typedef const T& const_reference;
|
|
||||||
typedef const T& transparent_reference;
|
|
||||||
};
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
<%0.upto(GENERATION_LIMIT) {|i|%>
|
|
||||||
<%0.upto(i) {|j|%>
|
|
||||||
template <typename A0<%1.upto(i) {|k|%>, typename A<%=k%><%}%>>
|
|
||||||
struct tuple_element<tuple<A0<%1.upto(i) {|k|%>, A<%=k%><%}%>>, <%=j%>> : tuple_type<A<%=j%>> {
|
|
||||||
tuple_element(tuple<A0<%1.upto(i) {|k|%>, A<%=k%> <%}%>>& x) : m_x(x.a<%=j%>) {}
|
|
||||||
typename tuple_type<A<%=j%>>::reference get() { return m_x; }
|
|
||||||
typename tuple_type<A<%=j%>>::const_reference get() const { return m_x; }
|
|
||||||
private:
|
|
||||||
typename tuple_type<A<%=j%>>::reference m_x;
|
|
||||||
};
|
|
||||||
<%}%>
|
|
||||||
<%}%>
|
|
||||||
|
|
||||||
<%0.upto(GENERATION_LIMIT) {|i|%>
|
|
||||||
<%0.upto(i) {|j|%>
|
|
||||||
template <typename A0<%1.upto(i) {|k|%>, typename A<%=k%><%}%>>
|
|
||||||
struct const_tuple_element<tuple<A0<%1.upto(i) {|k|%>, A<%=k%><%}%>>, <%=j%>> : tuple_type<A<%=j%>> {
|
|
||||||
const_tuple_element(const tuple<A0<%1.upto(i) {|k|%>, A<%=k%><%}%>>& x) : m_x(x.a<%=j%>) {}
|
|
||||||
typename tuple_type<A<%=j%>>::const_reference get() const { return m_x; }
|
|
||||||
private:
|
|
||||||
typename tuple_type<A<%=j%>>::const_reference m_x;
|
|
||||||
};
|
|
||||||
<%}%>
|
|
||||||
<%}%>
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct tuple<> {
|
|
||||||
tuple() {}
|
|
||||||
tuple(msgpack::object const& o) { o.convert(*this); }
|
|
||||||
typedef tuple<> value_type;
|
|
||||||
};
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
<%0.upto(GENERATION_LIMIT) {|i|%>
|
|
||||||
template <typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>>
|
|
||||||
struct tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> {
|
|
||||||
typedef tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> value_type;
|
|
||||||
tuple() {}
|
|
||||||
tuple(typename tuple_type<A0>::transparent_reference _a0<%1.upto(i) {|j|%>, typename tuple_type<A<%=j%>>::transparent_reference _a<%=j%><%}%>) :
|
|
||||||
a0(_a0)<%1.upto(i) {|j|%>, a<%=j%>(_a<%=j%>)<%}%> {}
|
|
||||||
tuple(msgpack::object const& o) { o.convert(*this); }
|
|
||||||
template <int N> typename tuple_element<value_type, N>::reference get()
|
|
||||||
{ return tuple_element<value_type, N>(*this).get(); }
|
|
||||||
template <int N> typename const_tuple_element<value_type, N>::const_reference get() const
|
|
||||||
{ return const_tuple_element<value_type, N>(*this).get(); }
|
|
||||||
<%0.upto(i) {|j|%>
|
|
||||||
A<%=j%> a<%=j%>;<%}%>
|
|
||||||
};
|
|
||||||
|
|
||||||
template <int N, typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>>
|
|
||||||
inline typename type::tuple_element<type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>>, N>::reference get(type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>>& t)
|
|
||||||
{ return t.template get<N>(); }
|
|
||||||
template <int N, typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>>
|
|
||||||
inline typename type::const_tuple_element<type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>>, N>::const_reference get(type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> const& t)
|
|
||||||
{ return t.template get<N>(); }
|
|
||||||
<%}%>
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
inline tuple<> make_tuple()
|
|
||||||
{
|
|
||||||
return tuple<>();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
<%0.upto(GENERATION_LIMIT) {|i|%>
|
|
||||||
template <typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>>
|
|
||||||
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%><%}%>);
|
|
||||||
}
|
|
||||||
<%}%>
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
} // namespace type
|
|
||||||
|
|
||||||
namespace adaptor {
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct convert<type::tuple<> > {
|
|
||||||
msgpack::object const& operator()(
|
|
||||||
msgpack::object const& o,
|
|
||||||
type::tuple<>&) const {
|
|
||||||
if(o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
<%0.upto(GENERATION_LIMIT) {|i|%>
|
|
||||||
template <typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>>
|
|
||||||
struct convert<type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> > {
|
|
||||||
msgpack::object const& operator()(
|
|
||||||
msgpack::object const& o,
|
|
||||||
type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>>& v) const {
|
|
||||||
if(o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
|
|
||||||
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.
|
|
||||||
o.via.array.ptr[<%=j%>].msgpack::object::convert<typename type::tuple_type<A<%=j%>>::type>(v.template get<<%=j%>>());<%}%>
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
<%}%>
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct pack<type::tuple<> > {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(
|
|
||||||
msgpack::packer<Stream>& o,
|
|
||||||
const type::tuple<>&) const {
|
|
||||||
o.pack_array(0);
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
<%0.upto(GENERATION_LIMIT) {|i|%>
|
|
||||||
template <typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>>
|
|
||||||
struct pack<type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> > {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(
|
|
||||||
msgpack::packer<Stream>& o,
|
|
||||||
const type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>>& v) const {
|
|
||||||
o.pack_array(<%=i+1%>);
|
|
||||||
<%0.upto(i) {|j|%>
|
|
||||||
o.pack(v.template get<<%=j%>>());<%}%>
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
<%}%>
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object_with_zone<type::tuple<> > {
|
|
||||||
void operator()(
|
|
||||||
msgpack::object::with_zone& o,
|
|
||||||
const type::tuple<>&) const {
|
|
||||||
o.type = msgpack::type::ARRAY;
|
|
||||||
o.via.array.ptr = nullptr;
|
|
||||||
o.via.array.size = 0;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
<%0.upto(GENERATION_LIMIT) {|i|%>
|
|
||||||
template <typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>>
|
|
||||||
struct object_with_zone<type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> > {
|
|
||||||
void operator()(
|
|
||||||
msgpack::object::with_zone& o,
|
|
||||||
const type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>>& v) const {
|
|
||||||
o.type = msgpack::type::ARRAY;
|
|
||||||
o.via.array.ptr = static_cast<msgpack::object*>(o.zone.allocate_align(sizeof(msgpack::object)*<%=i+1%>));
|
|
||||||
o.via.array.size = <%=i+1%>;
|
|
||||||
<%0.upto(i) {|j|%>
|
|
||||||
o.via.array.ptr[<%=j%>] = msgpack::object(v.template get<<%=j%>>(), o.zone);<%}%>
|
|
||||||
}
|
|
||||||
};
|
|
||||||
<%}%>
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
} // namespace adaptor
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
} // MSGPACK_API_VERSION_NAMESPACE(v1)
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
#endif // MSGPACK_CPP03_MSGPACK_TUPLE_HPP
|
|
||||||
@@ -1,339 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ memory pool
|
|
||||||
//
|
|
||||||
// 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_CPP03_ZONE_HPP
|
|
||||||
#define MSGPACK_CPP03_ZONE_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
|
|
||||||
|
|
||||||
<% GENERATION_LIMIT = 15 %>
|
|
||||||
namespace msgpack {
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
MSGPACK_API_VERSION_NAMESPACE(v1) {
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
class zone {
|
|
||||||
struct finalizer {
|
|
||||||
finalizer(void (*func)(void*), void* data):m_func(func), m_data(data) {}
|
|
||||||
void operator()() { m_func(m_data); }
|
|
||||||
void (*m_func)(void*);
|
|
||||||
void* m_data;
|
|
||||||
};
|
|
||||||
struct finalizer_array {
|
|
||||||
finalizer_array():m_tail(nullptr), m_end(nullptr), m_array(nullptr) {}
|
|
||||||
void call() {
|
|
||||||
finalizer* fin = m_tail;
|
|
||||||
for(; fin != m_array; --fin) (*(fin-1))();
|
|
||||||
}
|
|
||||||
~finalizer_array() {
|
|
||||||
call();
|
|
||||||
::free(m_array);
|
|
||||||
}
|
|
||||||
void clear() {
|
|
||||||
call();
|
|
||||||
m_tail = m_array;
|
|
||||||
}
|
|
||||||
void push(void (*func)(void* data), void* data)
|
|
||||||
{
|
|
||||||
finalizer* fin = m_tail;
|
|
||||||
|
|
||||||
if(fin == m_end) {
|
|
||||||
push_expand(func, data);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
fin->m_func = func;
|
|
||||||
fin->m_data = data;
|
|
||||||
|
|
||||||
++m_tail;
|
|
||||||
}
|
|
||||||
void push_expand(void (*func)(void*), void* data) {
|
|
||||||
const size_t nused = m_end - m_array;
|
|
||||||
size_t nnext;
|
|
||||||
if(nused == 0) {
|
|
||||||
nnext = (sizeof(finalizer) < 72/2) ?
|
|
||||||
72 / sizeof(finalizer) : 8;
|
|
||||||
} else {
|
|
||||||
nnext = nused * 2;
|
|
||||||
}
|
|
||||||
finalizer* tmp =
|
|
||||||
static_cast<finalizer*>(::realloc(m_array, sizeof(finalizer) * nnext));
|
|
||||||
if(!tmp) {
|
|
||||||
throw std::bad_alloc();
|
|
||||||
}
|
|
||||||
m_array = tmp;
|
|
||||||
m_end = tmp + nnext;
|
|
||||||
m_tail = tmp + nused;
|
|
||||||
new (m_tail) finalizer(func, data);
|
|
||||||
|
|
||||||
++m_tail;
|
|
||||||
}
|
|
||||||
finalizer* m_tail;
|
|
||||||
finalizer* m_end;
|
|
||||||
finalizer* m_array;
|
|
||||||
};
|
|
||||||
struct chunk {
|
|
||||||
chunk* m_next;
|
|
||||||
};
|
|
||||||
struct chunk_list {
|
|
||||||
chunk_list(size_t chunk_size)
|
|
||||||
{
|
|
||||||
chunk* c = static_cast<chunk*>(::malloc(sizeof(chunk) + chunk_size));
|
|
||||||
if(!c) {
|
|
||||||
throw std::bad_alloc();
|
|
||||||
}
|
|
||||||
|
|
||||||
m_head = c;
|
|
||||||
m_free = chunk_size;
|
|
||||||
m_ptr = reinterpret_cast<char*>(c) + sizeof(chunk);
|
|
||||||
c->m_next = nullptr;
|
|
||||||
}
|
|
||||||
~chunk_list()
|
|
||||||
{
|
|
||||||
chunk* c = m_head;
|
|
||||||
while(c) {
|
|
||||||
chunk* n = c->m_next;
|
|
||||||
::free(c);
|
|
||||||
c = n;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
void clear(size_t chunk_size)
|
|
||||||
{
|
|
||||||
chunk* c = m_head;
|
|
||||||
while(true) {
|
|
||||||
chunk* n = c->m_next;
|
|
||||||
if(n) {
|
|
||||||
::free(c);
|
|
||||||
c = n;
|
|
||||||
} else {
|
|
||||||
m_head = c;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
m_head->m_next = nullptr;
|
|
||||||
m_free = chunk_size;
|
|
||||||
m_ptr = reinterpret_cast<char*>(m_head) + sizeof(chunk);
|
|
||||||
}
|
|
||||||
size_t m_free;
|
|
||||||
char* m_ptr;
|
|
||||||
chunk* m_head;
|
|
||||||
};
|
|
||||||
size_t m_chunk_size;
|
|
||||||
chunk_list m_chunk_list;
|
|
||||||
finalizer_array m_finalizer_array;
|
|
||||||
|
|
||||||
public:
|
|
||||||
zone(size_t chunk_size = MSGPACK_ZONE_CHUNK_SIZE) /* throw() */;
|
|
||||||
|
|
||||||
public:
|
|
||||||
void* allocate_align(size_t size, size_t align = MSGPACK_ZONE_ALIGN);
|
|
||||||
void* allocate_no_align(size_t size);
|
|
||||||
|
|
||||||
void push_finalizer(void (*func)(void*), void* data);
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
void push_finalizer(msgpack::unique_ptr<T> obj);
|
|
||||||
|
|
||||||
void clear();
|
|
||||||
|
|
||||||
void swap(zone& o);
|
|
||||||
static void* operator new(std::size_t size)
|
|
||||||
{
|
|
||||||
void* p = ::malloc(size);
|
|
||||||
if (!p) throw std::bad_alloc();
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
static void operator delete(void *p) /* throw() */
|
|
||||||
{
|
|
||||||
::free(p);
|
|
||||||
}
|
|
||||||
static void* operator new(std::size_t size, void* place) /* throw() */
|
|
||||||
{
|
|
||||||
return ::operator new(size, place);
|
|
||||||
}
|
|
||||||
static void operator delete(void* p, void* place) /* throw() */
|
|
||||||
{
|
|
||||||
::operator delete(p, place);
|
|
||||||
}
|
|
||||||
/// @cond
|
|
||||||
<%0.upto(GENERATION_LIMIT) {|i|%>
|
|
||||||
template <typename T<%1.upto(i) {|j|%>, typename A<%=j%><%}%>>
|
|
||||||
T* allocate(<%=(1..i).map{|j|"A#{j} a#{j}"}.join(', ')%>);
|
|
||||||
<%}%>
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
private:
|
|
||||||
void undo_allocate(size_t size);
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
static void object_destruct(void* obj);
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
static void object_delete(void* obj);
|
|
||||||
|
|
||||||
void* allocate_expand(size_t size);
|
|
||||||
private:
|
|
||||||
zone(const zone&);
|
|
||||||
zone& operator=(const zone&);
|
|
||||||
};
|
|
||||||
|
|
||||||
inline zone::zone(size_t chunk_size) /* throw() */ :m_chunk_size(chunk_size), m_chunk_list(m_chunk_size)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void* zone::allocate_align(size_t size, size_t align)
|
|
||||||
{
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
return reinterpret_cast<char*>(
|
|
||||||
reinterpret_cast<size_t>(
|
|
||||||
allocate_expand(size + (align - 1))) / align * align);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void* zone::allocate_no_align(size_t size)
|
|
||||||
{
|
|
||||||
if(m_chunk_list.m_free < 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 void* zone::allocate_expand(size_t size)
|
|
||||||
{
|
|
||||||
chunk_list* const cl = &m_chunk_list;
|
|
||||||
|
|
||||||
size_t sz = m_chunk_size;
|
|
||||||
|
|
||||||
while(sz < size) {
|
|
||||||
size_t tmp_sz = sz * 2;
|
|
||||||
if (tmp_sz <= sz) {
|
|
||||||
sz = size;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
sz = tmp_sz;
|
|
||||||
}
|
|
||||||
|
|
||||||
chunk* c = static_cast<chunk*>(::malloc(sizeof(chunk) + sz));
|
|
||||||
if (!c) throw std::bad_alloc();
|
|
||||||
|
|
||||||
char* ptr = reinterpret_cast<char*>(c) + sizeof(chunk);
|
|
||||||
|
|
||||||
c->m_next = cl->m_head;
|
|
||||||
cl->m_head = c;
|
|
||||||
cl->m_free = sz - size;
|
|
||||||
cl->m_ptr = ptr + size;
|
|
||||||
|
|
||||||
return ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void zone::push_finalizer(void (*func)(void*), void* data)
|
|
||||||
{
|
|
||||||
m_finalizer_array.push(func, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
inline void zone::push_finalizer(msgpack::unique_ptr<T> obj)
|
|
||||||
{
|
|
||||||
m_finalizer_array.push(&zone::object_delete<T>, obj.release());
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void zone::clear()
|
|
||||||
{
|
|
||||||
m_finalizer_array.clear();
|
|
||||||
m_chunk_list.clear(m_chunk_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void zone::swap(zone& o)
|
|
||||||
{
|
|
||||||
using std::swap;
|
|
||||||
swap(m_chunk_size, o.m_chunk_size);
|
|
||||||
swap(m_chunk_list, o.m_chunk_list);
|
|
||||||
swap(m_finalizer_array, o.m_finalizer_array);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
void zone::object_destruct(void* obj)
|
|
||||||
{
|
|
||||||
static_cast<T*>(obj)->~T();
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
void zone::object_delete(void* obj)
|
|
||||||
{
|
|
||||||
delete static_cast<T*>(obj);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void zone::undo_allocate(size_t size)
|
|
||||||
{
|
|
||||||
m_chunk_list.m_ptr -= size;
|
|
||||||
m_chunk_list.m_free += size;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline std::size_t aligned_size(
|
|
||||||
std::size_t size,
|
|
||||||
std::size_t align = MSGPACK_ZONE_ALIGN) {
|
|
||||||
return (size + align - 1) / align * align;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
<%0.upto(GENERATION_LIMIT) {|i|%>
|
|
||||||
template <typename T<%1.upto(i) {|j|%>, typename A<%=j%><%}%>>
|
|
||||||
T* zone::allocate(<%=(1..i).map{|j|"A#{j} a#{j}"}.join(', ')%>)
|
|
||||||
{
|
|
||||||
void* x = allocate_align(sizeof(T));
|
|
||||||
try {
|
|
||||||
m_finalizer_array.push(&zone::object_destruct<T>, x);
|
|
||||||
} catch (...) {
|
|
||||||
undo_allocate(sizeof(T));
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
return new (x) T(<%=(1..i).map{|j|"a#{j}"}.join(', ')%>);
|
|
||||||
} catch (...) {
|
|
||||||
--m_finalizer_array.m_tail;
|
|
||||||
undo_allocate(sizeof(T));
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
<%}%>
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
} // MSGPACK_API_VERSION_NAMESPACE(v1)
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
#endif // MSGPACK_CPP03_ZONE_HPP
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
ADD_SUBDIRECTORY (c)
|
|
||||||
ADD_SUBDIRECTORY (cpp03)
|
|
||||||
ADD_SUBDIRECTORY (cpp11)
|
|
||||||
ADD_SUBDIRECTORY (boost)
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
IF (MSGPACK_BOOST)
|
|
||||||
LIST (APPEND exec_PROGRAMS
|
|
||||||
msgpack_variant_capitalize.cpp
|
|
||||||
msgpack_variant_mapbased.cpp
|
|
||||||
)
|
|
||||||
ENDIF ()
|
|
||||||
|
|
||||||
FOREACH (source_file ${exec_PROGRAMS})
|
|
||||||
GET_FILENAME_COMPONENT (source_file_we ${source_file} NAME_WE)
|
|
||||||
ADD_EXECUTABLE (
|
|
||||||
${source_file_we}
|
|
||||||
${source_file}
|
|
||||||
)
|
|
||||||
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 ()
|
|
||||||
@@ -1,94 +0,0 @@
|
|||||||
// MessagePack for C++ example
|
|
||||||
//
|
|
||||||
// Copyright (C) 2015 KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Distributed under the Boost Software License, Version 1.0.
|
|
||||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
|
||||||
// http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
//
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <sstream>
|
|
||||||
#include <iostream>
|
|
||||||
#include <algorithm>
|
|
||||||
#include <cctype>
|
|
||||||
|
|
||||||
#include <msgpack.hpp>
|
|
||||||
|
|
||||||
struct user {
|
|
||||||
std::string name;
|
|
||||||
int age;
|
|
||||||
std::string address;
|
|
||||||
MSGPACK_DEFINE(name, age, address);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct proc:boost::static_visitor<void> {
|
|
||||||
void operator()(std::string& v) const {
|
|
||||||
std::cout << " match std::string& v" << std::endl;
|
|
||||||
std::cout << " v: " << v << std::endl;
|
|
||||||
std::cout << " capitalize" << std::endl;
|
|
||||||
for (std::string::iterator it = v.begin(), end = v.end();
|
|
||||||
it != end;
|
|
||||||
++it) {
|
|
||||||
*it = std::toupper(*it);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
void operator()(std::vector<msgpack::type::variant>& v) const {
|
|
||||||
std::cout << "match vector (msgpack::type::ARRAY)" << std::endl;
|
|
||||||
std::vector<msgpack::type::variant>::iterator it = v.begin();
|
|
||||||
std::vector<msgpack::type::variant>::const_iterator end = v.end();
|
|
||||||
for (; it != end; ++it) {
|
|
||||||
boost::apply_visitor(*this, *it);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
template <typename T>
|
|
||||||
void operator()(T const&) const {
|
|
||||||
std::cout << " match others" << std::endl;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
void print(std::string const& buf) {
|
|
||||||
for (std::string::const_iterator it = buf.begin(), end = buf.end();
|
|
||||||
it != end;
|
|
||||||
++it) {
|
|
||||||
std::cout
|
|
||||||
<< std::setw(2)
|
|
||||||
<< std::hex
|
|
||||||
<< std::setfill('0')
|
|
||||||
<< (static_cast<int>(*it) & 0xff)
|
|
||||||
<< ' ';
|
|
||||||
}
|
|
||||||
std::cout << std::dec << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int main() {
|
|
||||||
std::stringstream ss1;
|
|
||||||
user u;
|
|
||||||
u.name = "Takatoshi Kondo";
|
|
||||||
u.age = 42;
|
|
||||||
u.address = "Tokyo, JAPAN";
|
|
||||||
|
|
||||||
std::cout << "Packing object." << std::endl;
|
|
||||||
msgpack::pack(ss1, u);
|
|
||||||
print(ss1.str());
|
|
||||||
|
|
||||||
msgpack::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;
|
|
||||||
|
|
||||||
msgpack::type::variant v = obj1.as<msgpack::type::variant>();
|
|
||||||
std::cout << "Applying proc..." << std::endl;
|
|
||||||
boost::apply_visitor(proc(), v);
|
|
||||||
|
|
||||||
std::stringstream ss2;
|
|
||||||
std::cout << "Packing modified object." << std::endl;
|
|
||||||
msgpack::pack(ss2, v);
|
|
||||||
print(ss2.str());
|
|
||||||
|
|
||||||
msgpack::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;
|
|
||||||
}
|
|
||||||
@@ -1,92 +0,0 @@
|
|||||||
// MessagePack for C++ example
|
|
||||||
//
|
|
||||||
// Copyright (C) 2015 KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Distributed under the Boost Software License, Version 1.0.
|
|
||||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
|
||||||
// http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
//
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <sstream>
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
#include <msgpack.hpp>
|
|
||||||
|
|
||||||
struct user {
|
|
||||||
std::string name;
|
|
||||||
int age;
|
|
||||||
std::string address;
|
|
||||||
MSGPACK_DEFINE_MAP(name, age, address);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct proc:boost::static_visitor<void> {
|
|
||||||
// msgpack::type::MAP is converted to std::multimap, not std::map.
|
|
||||||
void operator()(std::multimap<msgpack::type::variant_ref, msgpack::type::variant_ref>& v) const {
|
|
||||||
std::cout << "match map" << std::endl;
|
|
||||||
std::multimap<msgpack::type::variant_ref, msgpack::type::variant_ref>::iterator it = v.begin();
|
|
||||||
std::multimap<msgpack::type::variant_ref, msgpack::type::variant_ref>::iterator end = v.end();
|
|
||||||
while(it != end) {
|
|
||||||
boost::string_ref const& key = it->first.as_boost_string_ref();
|
|
||||||
if (key == "name") {
|
|
||||||
boost::string_ref const& value = it->second.as_boost_string_ref();
|
|
||||||
if (value == "Takatoshi Kondo") {
|
|
||||||
// You can add values to msgpack::type::variant_ref.
|
|
||||||
v.insert(
|
|
||||||
std::multimap<msgpack::type::variant_ref, msgpack::type::variant_ref>::value_type(
|
|
||||||
"role",
|
|
||||||
"msgpack-c committer"
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
++it;
|
|
||||||
}
|
|
||||||
else if (key == "age") {
|
|
||||||
// You can remove key-value pair from msgpack::type::variant_ref
|
|
||||||
|
|
||||||
#if defined(MSGPACK_USE_CPP03)
|
|
||||||
v.erase(it++);
|
|
||||||
#else // defined(MSGPACK_USE_CPP03)
|
|
||||||
# if MSGPACK_LIB_STD_CXX
|
|
||||||
it = v.erase(std::multimap<msgpack::type::variant_ref, msgpack::type::variant_ref>::const_iterator(it));
|
|
||||||
# else // MSGPACK_LIB_STD_CXX
|
|
||||||
it = v.erase(it);
|
|
||||||
# endif // MSGPACK_LIB_STD_CXX
|
|
||||||
#endif // defined(MSGPACK_USE_CPP03)
|
|
||||||
}
|
|
||||||
else if (key == "address") {
|
|
||||||
// When you want to append string
|
|
||||||
// "Tokyo" -> "Tokyo, JAPAN"
|
|
||||||
// Use msgpack::type::variant instead of msgpack::type::variant_ref
|
|
||||||
// or do as follows:
|
|
||||||
boost::string_ref const& value = it->second.as_boost_string_ref();
|
|
||||||
it->second = std::string(&value.front(), value.size()) + ", JAPAN";
|
|
||||||
++it;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
template <typename T>
|
|
||||||
void operator()(T const&) const {
|
|
||||||
std::cout << " match others" << std::endl;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
int main() {
|
|
||||||
std::stringstream ss;
|
|
||||||
user u;
|
|
||||||
u.name = "Takatoshi Kondo";
|
|
||||||
u.age = 42;
|
|
||||||
u.address = "Tokyo";
|
|
||||||
msgpack::pack(ss, u);
|
|
||||||
|
|
||||||
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>();
|
|
||||||
std::cout << "Applying proc..." << std::endl;
|
|
||||||
boost::apply_visitor(proc(), v);
|
|
||||||
msgpack::zone z;
|
|
||||||
std::cout << "Applied msgpack object." << std::endl;
|
|
||||||
std::cout << msgpack::object(v, z) << std::endl;
|
|
||||||
}
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
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 ()
|
|
||||||
@@ -1,122 +0,0 @@
|
|||||||
#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]
|
|
||||||
*/
|
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
#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;
|
|
||||||
}
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
#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;
|
|
||||||
}
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
#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;
|
|
||||||
}
|
|
||||||
@@ -1,76 +0,0 @@
|
|||||||
#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.
|
|
||||||
*/
|
|
||||||
@@ -1,112 +0,0 @@
|
|||||||
LIST (APPEND exec_PROGRAMS
|
|
||||||
class_intrusive.cpp
|
|
||||||
class_intrusive_map.cpp
|
|
||||||
class_non_intrusive.cpp
|
|
||||||
custom.cpp
|
|
||||||
enum.cpp
|
|
||||||
map_based_versionup.cpp
|
|
||||||
protocol.cpp
|
|
||||||
protocol_new.cpp
|
|
||||||
reuse_zone.cpp
|
|
||||||
simple.cpp
|
|
||||||
)
|
|
||||||
|
|
||||||
IF (NOT MSVC)
|
|
||||||
LIST (APPEND with_pthread_PROGRAMS
|
|
||||||
stream.cpp
|
|
||||||
)
|
|
||||||
ENDIF ()
|
|
||||||
|
|
||||||
IF (MSGPACK_BOOST)
|
|
||||||
IF (NOT MSVC)
|
|
||||||
LIST (APPEND with_boost_lib_PROGRAMS
|
|
||||||
speed_test.cpp
|
|
||||||
speed_test_nested_array.cpp
|
|
||||||
)
|
|
||||||
ENDIF ()
|
|
||||||
ENDIF ()
|
|
||||||
|
|
||||||
FOREACH (source_file ${exec_PROGRAMS})
|
|
||||||
GET_FILENAME_COMPONENT (source_file_we ${source_file} NAME_WE)
|
|
||||||
ADD_EXECUTABLE (
|
|
||||||
${source_file_we}
|
|
||||||
${source_file}
|
|
||||||
)
|
|
||||||
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]")
|
|
||||||
STRING(REGEX REPLACE "/W[0-4]" "/W3 /WX" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
|
|
||||||
ELSE ()
|
|
||||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3 /WX")
|
|
||||||
ENDIF ()
|
|
||||||
ENDIF ()
|
|
||||||
ENDFOREACH ()
|
|
||||||
|
|
||||||
FOREACH (source_file ${with_pthread_PROGRAMS})
|
|
||||||
GET_FILENAME_COMPONENT (source_file_we ${source_file} NAME_WE)
|
|
||||||
ADD_EXECUTABLE (
|
|
||||||
${source_file_we}
|
|
||||||
${source_file}
|
|
||||||
)
|
|
||||||
TARGET_LINK_LIBRARIES (${source_file_we}
|
|
||||||
pthread
|
|
||||||
)
|
|
||||||
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]")
|
|
||||||
STRING(REGEX REPLACE "/W[0-4]" "/W3 /WX" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
|
|
||||||
ELSE ()
|
|
||||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3 /WX")
|
|
||||||
ENDIF ()
|
|
||||||
ENDIF ()
|
|
||||||
ENDFOREACH ()
|
|
||||||
|
|
||||||
FOREACH (source_file ${with_boost_lib_PROGRAMS})
|
|
||||||
INCLUDE_DIRECTORIES (
|
|
||||||
../include
|
|
||||||
${Boost_INCLUDE_DIRS}
|
|
||||||
)
|
|
||||||
GET_FILENAME_COMPONENT (source_file_we ${source_file} NAME_WE)
|
|
||||||
ADD_EXECUTABLE (
|
|
||||||
${source_file_we}
|
|
||||||
${source_file}
|
|
||||||
)
|
|
||||||
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}
|
|
||||||
rt
|
|
||||||
)
|
|
||||||
ENDIF ()
|
|
||||||
|
|
||||||
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}" 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 ()
|
|
||||||
@@ -1,103 +0,0 @@
|
|||||||
// MessagePack for C++ example
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2015 FURUHASHI Sadayuki and KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Distributed under the Boost Software License, Version 1.0.
|
|
||||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
|
||||||
// http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
//
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <iostream>
|
|
||||||
#include <iomanip>
|
|
||||||
#include <sstream>
|
|
||||||
#include <cassert>
|
|
||||||
|
|
||||||
// When you want to adapt map instead of array, you can enable these macro definition.
|
|
||||||
//
|
|
||||||
// #define MSGPACK_USE_DEFINE_MAP
|
|
||||||
|
|
||||||
|
|
||||||
#include <msgpack.hpp>
|
|
||||||
|
|
||||||
struct my_base1 {
|
|
||||||
int a;
|
|
||||||
MSGPACK_DEFINE(a);
|
|
||||||
};
|
|
||||||
inline bool operator==(my_base1 const& lhs, my_base1 const& rhs) {
|
|
||||||
return lhs.a == rhs.a;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct my_base2 {
|
|
||||||
std::string b;
|
|
||||||
std::string c;
|
|
||||||
MSGPACK_DEFINE(b, c);
|
|
||||||
};
|
|
||||||
inline bool operator==(my_base2 const& lhs, my_base2 const& rhs) {
|
|
||||||
return lhs.b == rhs.b && lhs.c == rhs.c;
|
|
||||||
}
|
|
||||||
|
|
||||||
class my_class : public my_base1, private my_base2 {
|
|
||||||
public:
|
|
||||||
my_class() {} // When you want to convert from msgpack::object to my_class,
|
|
||||||
// my_class should be default constractible.
|
|
||||||
my_class(std::string const& name, int age):name_(name), age_(age) {}
|
|
||||||
void set_b(std::string const& str) { b = str; }
|
|
||||||
void set_c(std::string const& str) { c = str; }
|
|
||||||
friend bool operator==(my_class const& lhs, my_class const& rhs) {
|
|
||||||
return
|
|
||||||
static_cast<my_base1 const&>(lhs) == static_cast<my_base1 const&>(rhs) &&
|
|
||||||
static_cast<my_base2 const&>(lhs) == static_cast<my_base2 const&>(rhs) &&
|
|
||||||
lhs.name_ == rhs.name_ && lhs.age_ == rhs.age_;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
std::string name_;
|
|
||||||
int age_;
|
|
||||||
|
|
||||||
public:
|
|
||||||
MSGPACK_DEFINE(name_, age_, MSGPACK_BASE(my_base1), MSGPACK_BASE(my_base2));
|
|
||||||
};
|
|
||||||
|
|
||||||
void print(std::string const& buf) {
|
|
||||||
for (std::string::const_iterator it = buf.begin(), end = buf.end();
|
|
||||||
it != end;
|
|
||||||
++it) {
|
|
||||||
std::cout
|
|
||||||
<< std::setw(2)
|
|
||||||
<< std::hex
|
|
||||||
<< std::setfill('0')
|
|
||||||
<< (static_cast<int>(*it) & 0xff)
|
|
||||||
<< ' ';
|
|
||||||
}
|
|
||||||
std::cout << std::dec << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main() {
|
|
||||||
{ // pack, unpack
|
|
||||||
my_class my("John Smith", 42);
|
|
||||||
my.a = 123;
|
|
||||||
my.set_b("ABC");
|
|
||||||
my.set_c("DEF");
|
|
||||||
std::stringstream ss;
|
|
||||||
msgpack::pack(ss, my);
|
|
||||||
|
|
||||||
print(ss.str());
|
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
{ // create object with zone
|
|
||||||
my_class my("John Smith", 42);
|
|
||||||
my.a = 123;
|
|
||||||
my.set_b("ABC");
|
|
||||||
my.set_c("DEF");
|
|
||||||
msgpack::zone z;
|
|
||||||
msgpack::object obj(my, z);
|
|
||||||
std::cout << obj << std::endl;
|
|
||||||
assert(obj.as<my_class>() == my);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,75 +0,0 @@
|
|||||||
// MessagePack for C++ example
|
|
||||||
//
|
|
||||||
// Copyright (C) 2015 KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Distributed under the Boost Software License, Version 1.0.
|
|
||||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
|
||||||
// http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
//
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <iostream>
|
|
||||||
#include <iomanip>
|
|
||||||
#include <sstream>
|
|
||||||
#include <cassert>
|
|
||||||
|
|
||||||
#include <msgpack.hpp>
|
|
||||||
|
|
||||||
|
|
||||||
class my_class {
|
|
||||||
public:
|
|
||||||
my_class() {} // When you want to convert from msgpack::object to my_class,
|
|
||||||
// my_class should be default constractible.
|
|
||||||
// If you use C++11, you can adapt non-default constructible
|
|
||||||
// classes to msgpack::object.
|
|
||||||
// See https://github.com/msgpack/msgpack-c/wiki/v1_1_cpp_adaptor#non-default-constructible-class-support-c11-only
|
|
||||||
my_class(std::string const& name, int age):name_(name), age_(age) {}
|
|
||||||
|
|
||||||
friend bool operator==(my_class const& lhs, my_class const& rhs) {
|
|
||||||
return lhs.name_ == rhs.name_ && lhs.age_ == rhs.age_;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
std::string name_;
|
|
||||||
int age_;
|
|
||||||
|
|
||||||
public:
|
|
||||||
MSGPACK_DEFINE_MAP(name_, age_);
|
|
||||||
};
|
|
||||||
|
|
||||||
void print(std::string const& buf) {
|
|
||||||
for (std::string::const_iterator it = buf.begin(), end = buf.end();
|
|
||||||
it != end;
|
|
||||||
++it) {
|
|
||||||
std::cout
|
|
||||||
<< std::setw(2)
|
|
||||||
<< std::hex
|
|
||||||
<< std::setfill('0')
|
|
||||||
<< (static_cast<int>(*it) & 0xff)
|
|
||||||
<< ' ';
|
|
||||||
}
|
|
||||||
std::cout << std::dec << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main() {
|
|
||||||
{ // pack, unpack
|
|
||||||
my_class my("John Smith", 42);
|
|
||||||
std::stringstream ss;
|
|
||||||
msgpack::pack(ss, my);
|
|
||||||
|
|
||||||
print(ss.str());
|
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
{ // create object with zone
|
|
||||||
my_class my("John Smith", 42);
|
|
||||||
msgpack::zone z;
|
|
||||||
msgpack::object obj(my, z);
|
|
||||||
std::cout << obj << std::endl;
|
|
||||||
assert(obj.as<my_class>() == my);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,118 +0,0 @@
|
|||||||
// MessagePack for C++ example
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2015 FURUHASHI Sadayuki and KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Distributed under the Boost Software License, Version 1.0.
|
|
||||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
|
||||||
// http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
//
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <iostream>
|
|
||||||
#include <iomanip>
|
|
||||||
#include <sstream>
|
|
||||||
#include <cassert>
|
|
||||||
|
|
||||||
#include <msgpack.hpp>
|
|
||||||
|
|
||||||
class my_class {
|
|
||||||
public:
|
|
||||||
my_class() {} // When you want to convert from msgpack::object to my_class,
|
|
||||||
// my_class should be default constractible.
|
|
||||||
my_class(std::string const& name, int age):name_(name), age_(age) {}
|
|
||||||
|
|
||||||
// my_class should provide getters for the data members you want to pack.
|
|
||||||
std::string const& get_name() const { return name_; }
|
|
||||||
int get_age() const { return age_; }
|
|
||||||
|
|
||||||
friend bool operator==(my_class const& lhs, my_class const& rhs) {
|
|
||||||
return lhs.name_ == rhs.name_ && lhs.age_ == rhs.age_;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
std::string name_;
|
|
||||||
int age_;
|
|
||||||
};
|
|
||||||
|
|
||||||
// User defined class template specialization
|
|
||||||
namespace msgpack {
|
|
||||||
MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS) {
|
|
||||||
namespace adaptor {
|
|
||||||
|
|
||||||
template<>
|
|
||||||
struct convert<my_class> {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, my_class& v) const {
|
|
||||||
if (o.type != msgpack::type::ARRAY) throw msgpack::type_error();
|
|
||||||
if (o.via.array.size != 2) throw msgpack::type_error();
|
|
||||||
v = my_class(
|
|
||||||
o.via.array.ptr[0].as<std::string>(),
|
|
||||||
o.via.array.ptr[1].as<int>());
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template<>
|
|
||||||
struct pack<my_class> {
|
|
||||||
template <typename Stream>
|
|
||||||
packer<Stream>& operator()(msgpack::packer<Stream>& o, my_class const& v) const {
|
|
||||||
// packing member variables as an array.
|
|
||||||
o.pack_array(2);
|
|
||||||
o.pack(v.get_name());
|
|
||||||
o.pack(v.get_age());
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object_with_zone<my_class> {
|
|
||||||
void operator()(msgpack::object::with_zone& o, my_class const& v) const {
|
|
||||||
o.type = type::ARRAY;
|
|
||||||
o.via.array.size = 2;
|
|
||||||
o.via.array.ptr = static_cast<msgpack::object*>(
|
|
||||||
o.zone.allocate_align(sizeof(msgpack::object) * o.via.array.size));
|
|
||||||
o.via.array.ptr[0] = msgpack::object(v.get_name(), o.zone);
|
|
||||||
o.via.array.ptr[1] = msgpack::object(v.get_age(), o.zone);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace adaptor
|
|
||||||
} // MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS)
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
|
|
||||||
void print(std::string const& buf) {
|
|
||||||
for (std::string::const_iterator it = buf.begin(), end = buf.end();
|
|
||||||
it != end;
|
|
||||||
++it) {
|
|
||||||
std::cout
|
|
||||||
<< std::setw(2)
|
|
||||||
<< std::hex
|
|
||||||
<< std::setfill('0')
|
|
||||||
<< (static_cast<int>(*it) & 0xff)
|
|
||||||
<< ' ';
|
|
||||||
}
|
|
||||||
std::cout << std::dec << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main() {
|
|
||||||
{ // pack, unpack
|
|
||||||
my_class my("John Smith", 42);
|
|
||||||
std::stringstream ss;
|
|
||||||
msgpack::pack(ss, my);
|
|
||||||
|
|
||||||
print(ss.str());
|
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
{ // create object with zone
|
|
||||||
my_class my("John Smith", 42);
|
|
||||||
msgpack::zone z;
|
|
||||||
msgpack::object obj(my, z);
|
|
||||||
std::cout << obj << std::endl;
|
|
||||||
assert(obj.as<my_class>() == my);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,67 +0,0 @@
|
|||||||
// MessagePack for C++ example
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2015 FURUHASHI Sadayuki and KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Distributed under the Boost Software License, Version 1.0.
|
|
||||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
|
||||||
// http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
//
|
|
||||||
|
|
||||||
#include <msgpack.hpp>
|
|
||||||
#include <sstream>
|
|
||||||
#include <string>
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
class old_class {
|
|
||||||
public:
|
|
||||||
old_class() : value("default") { }
|
|
||||||
|
|
||||||
std::string value;
|
|
||||||
|
|
||||||
MSGPACK_DEFINE(value);
|
|
||||||
};
|
|
||||||
|
|
||||||
class new_class {
|
|
||||||
public:
|
|
||||||
new_class() : value("default"), flag(-1) { }
|
|
||||||
|
|
||||||
std::string value;
|
|
||||||
int flag;
|
|
||||||
|
|
||||||
MSGPACK_DEFINE(value, flag);
|
|
||||||
};
|
|
||||||
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
{
|
|
||||||
old_class oc;
|
|
||||||
new_class nc;
|
|
||||||
|
|
||||||
std::stringstream sbuf;
|
|
||||||
msgpack::pack(sbuf, oc);
|
|
||||||
|
|
||||||
msgpack::unpacked result;
|
|
||||||
msgpack::unpack(result, sbuf.str().data(), sbuf.str().size());
|
|
||||||
msgpack::object obj = result.get();
|
|
||||||
|
|
||||||
obj.convert(nc);
|
|
||||||
|
|
||||||
std::cout << obj << " value=" << nc.value << " flag=" << nc.flag << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
new_class nc;
|
|
||||||
old_class oc;
|
|
||||||
|
|
||||||
std::stringstream sbuf;
|
|
||||||
msgpack::pack(sbuf, nc);
|
|
||||||
|
|
||||||
msgpack::unpacked result;
|
|
||||||
msgpack::unpack(result, sbuf.str().data(), sbuf.str().size());
|
|
||||||
msgpack::object obj = result.get();
|
|
||||||
|
|
||||||
obj.convert(oc);
|
|
||||||
|
|
||||||
std::cout << obj << " value=" << oc.value << std::endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
// MessagePack for C++ example
|
|
||||||
//
|
|
||||||
// Copyright (C) 2015 KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Distributed under the Boost Software License, Version 1.0.
|
|
||||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
|
||||||
// http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
//
|
|
||||||
|
|
||||||
#include <sstream>
|
|
||||||
#include <iostream>
|
|
||||||
#include <cassert>
|
|
||||||
|
|
||||||
#include <msgpack.hpp>
|
|
||||||
|
|
||||||
enum my_enum {
|
|
||||||
elem1,
|
|
||||||
elem2,
|
|
||||||
elem3
|
|
||||||
};
|
|
||||||
|
|
||||||
MSGPACK_ADD_ENUM(my_enum);
|
|
||||||
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
{ // pack, unpack
|
|
||||||
std::stringstream sbuf;
|
|
||||||
msgpack::pack(sbuf, elem1);
|
|
||||||
msgpack::pack(sbuf, elem2);
|
|
||||||
my_enum e3 = elem3;
|
|
||||||
msgpack::pack(sbuf, e3);
|
|
||||||
|
|
||||||
msgpack::unpacked result;
|
|
||||||
std::size_t off = 0;
|
|
||||||
|
|
||||||
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(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(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);
|
|
||||||
std::cout << obj.as<my_enum>() << std::endl;
|
|
||||||
assert(obj.as<my_enum>() == elem2);
|
|
||||||
}
|
|
||||||
{ // create object with zone
|
|
||||||
msgpack::zone z;
|
|
||||||
msgpack::object objz(elem3, z);
|
|
||||||
std::cout << objz.as<my_enum>() << std::endl;
|
|
||||||
assert(objz.as<my_enum>() == elem3);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,111 +0,0 @@
|
|||||||
// MessagePack for C++ example
|
|
||||||
//
|
|
||||||
// Copyright (C) 2015 KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Distributed under the Boost Software License, Version 1.0.
|
|
||||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
|
||||||
// http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
//
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <iostream>
|
|
||||||
#include <iomanip>
|
|
||||||
#include <sstream>
|
|
||||||
#include <cassert>
|
|
||||||
|
|
||||||
#include <msgpack.hpp>
|
|
||||||
|
|
||||||
struct base1 {
|
|
||||||
base1():a("default") {}
|
|
||||||
std::string a;
|
|
||||||
MSGPACK_DEFINE_MAP(a);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct v1 : base1 {
|
|
||||||
v1():name("default"), age(0) {}
|
|
||||||
std::string name;
|
|
||||||
int age;
|
|
||||||
MSGPACK_DEFINE_MAP(MSGPACK_BASE_MAP(base1), name, age);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct base2 {
|
|
||||||
base2():a("default") {}
|
|
||||||
std::string a;
|
|
||||||
MSGPACK_DEFINE_MAP(a);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Removed: base1, name
|
|
||||||
// Added : base2, address
|
|
||||||
struct v2 : base2 {
|
|
||||||
v2(): age(0), address("default") {}
|
|
||||||
int age;
|
|
||||||
std::string address;
|
|
||||||
MSGPACK_DEFINE_MAP(MSGPACK_BASE_MAP(base2), age, address);
|
|
||||||
};
|
|
||||||
|
|
||||||
// The member variable "age" is in common between v1 and v2.
|
|
||||||
|
|
||||||
void print(std::string const& buf) {
|
|
||||||
for (std::string::const_iterator it = buf.begin(), end = buf.end();
|
|
||||||
it != end;
|
|
||||||
++it) {
|
|
||||||
std::cout
|
|
||||||
<< std::setw(2)
|
|
||||||
<< std::hex
|
|
||||||
<< std::setfill('0')
|
|
||||||
<< (static_cast<int>(*it) & 0xff)
|
|
||||||
<< ' ';
|
|
||||||
}
|
|
||||||
std::cout << std::dec << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main() {
|
|
||||||
{ // pack v1, unpack, convert to v2
|
|
||||||
v1 v;
|
|
||||||
v.a = "ABC";
|
|
||||||
v.name = "John Smith";
|
|
||||||
v.age = 35;
|
|
||||||
|
|
||||||
std::stringstream ss;
|
|
||||||
msgpack::pack(ss, v);
|
|
||||||
|
|
||||||
print(ss.str());
|
|
||||||
|
|
||||||
msgpack::unpacked unp = msgpack::unpack(ss.str().data(), ss.str().size());
|
|
||||||
|
|
||||||
msgpack::object obj = unp.get();
|
|
||||||
std::cout << obj << std::endl;
|
|
||||||
|
|
||||||
v2 newv = obj.as<v2>();
|
|
||||||
|
|
||||||
std::cout << "v2::a " << newv.a << std::endl;
|
|
||||||
std::cout << "v2::age " << newv.age << std::endl;
|
|
||||||
std::cout << "v2::address " << newv.address << std::endl;
|
|
||||||
|
|
||||||
// "age" is set from v1
|
|
||||||
assert(newv.a == "default");
|
|
||||||
assert(newv.age == 35);
|
|
||||||
assert(newv.address == "default");
|
|
||||||
}
|
|
||||||
{ // create v2 object with zone, convert to v1
|
|
||||||
v2 v;
|
|
||||||
v.a = "DEF";
|
|
||||||
v.age = 42;
|
|
||||||
v.address = "Tokyo";
|
|
||||||
|
|
||||||
msgpack::zone z;
|
|
||||||
msgpack::object obj(v, z);
|
|
||||||
std::cout << obj << std::endl;
|
|
||||||
|
|
||||||
v1 newv = obj.as<v1>();
|
|
||||||
|
|
||||||
std::cout << "v1::a " << newv.a << std::endl;
|
|
||||||
std::cout << "v1::name " << newv.name << std::endl;
|
|
||||||
std::cout << "v1::age " << newv.age << std::endl;
|
|
||||||
|
|
||||||
// "age" is set from v2
|
|
||||||
assert(newv.a == "default");
|
|
||||||
assert(newv.name == "default");
|
|
||||||
assert(newv.age == 42);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,97 +0,0 @@
|
|||||||
// MessagePack for C++ example
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2015 FURUHASHI Sadayuki and KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Distributed under the Boost Software License, Version 1.0.
|
|
||||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
|
||||||
// http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
//
|
|
||||||
|
|
||||||
#include <msgpack.hpp>
|
|
||||||
#include <string>
|
|
||||||
#include <iostream>
|
|
||||||
#include <sstream>
|
|
||||||
|
|
||||||
// This example uses obsolete APIs
|
|
||||||
// See protocol_new.cpp
|
|
||||||
namespace myprotocol {
|
|
||||||
using namespace msgpack::type;
|
|
||||||
using msgpack::define;
|
|
||||||
|
|
||||||
struct Get : define< tuple<uint32_t, std::string> > {
|
|
||||||
Get() { }
|
|
||||||
Get(uint32_t f, const std::string& k) :
|
|
||||||
define_type(msgpack_type(f, k)) { }
|
|
||||||
uint32_t& flags() { return msgpack::type::get<0>(*this); }
|
|
||||||
std::string& key() { return msgpack::type::get<1>(*this); }
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Put : define< tuple<uint32_t, std::string, raw_ref> > {
|
|
||||||
Put() { }
|
|
||||||
Put(uint32_t f, const std::string& k, const char* valref, uint32_t vallen) :
|
|
||||||
define_type(msgpack_type( f, k, raw_ref(valref,vallen) )) { }
|
|
||||||
uint32_t& flags() { return msgpack::type::get<0>(*this); }
|
|
||||||
std::string& key() { return msgpack::type::get<1>(*this); }
|
|
||||||
raw_ref& value() { return msgpack::type::get<2>(*this); }
|
|
||||||
};
|
|
||||||
|
|
||||||
struct MultiGet : define< std::vector<Get> > {
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
// send Get request
|
|
||||||
std::stringstream stream;
|
|
||||||
{
|
|
||||||
myprotocol::Get req;
|
|
||||||
req.flags() = 0;
|
|
||||||
req.key() = "key0";
|
|
||||||
msgpack::pack(stream, req);
|
|
||||||
}
|
|
||||||
|
|
||||||
stream.seekg(0);
|
|
||||||
|
|
||||||
// receive Get request
|
|
||||||
{
|
|
||||||
std::string buffer(stream.str());
|
|
||||||
|
|
||||||
msgpack::unpacked result;
|
|
||||||
msgpack::unpack(result, buffer.data(), buffer.size());
|
|
||||||
msgpack::object o = result.get();
|
|
||||||
|
|
||||||
myprotocol::Get req;
|
|
||||||
o.convert(req);
|
|
||||||
std::cout << "received: " << o << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
stream.str("");
|
|
||||||
|
|
||||||
|
|
||||||
// send MultiGet request
|
|
||||||
{
|
|
||||||
myprotocol::MultiGet req;
|
|
||||||
req.push_back( myprotocol::Get(1, "key1") );
|
|
||||||
req.push_back( myprotocol::Get(2, "key2") );
|
|
||||||
req.push_back( myprotocol::Get(3, "key3") );
|
|
||||||
msgpack::pack(stream, req);
|
|
||||||
}
|
|
||||||
|
|
||||||
stream.seekg(0);
|
|
||||||
|
|
||||||
// receive MultiGet request
|
|
||||||
{
|
|
||||||
std::string buffer(stream.str());
|
|
||||||
|
|
||||||
msgpack::unpacked result;
|
|
||||||
msgpack::unpack(result, buffer.data(), buffer.size());
|
|
||||||
msgpack::object o = result.get();
|
|
||||||
|
|
||||||
|
|
||||||
myprotocol::MultiGet req;
|
|
||||||
o.convert(req);
|
|
||||||
std::cout << "received: " << o << std::endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,84 +0,0 @@
|
|||||||
// MessagePack for C++ example
|
|
||||||
//
|
|
||||||
// Copyright (C) 2015 KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Distributed under the Boost Software License, Version 1.0.
|
|
||||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
|
||||||
// http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
//
|
|
||||||
|
|
||||||
#include <msgpack.hpp>
|
|
||||||
#include <string>
|
|
||||||
#include <iostream>
|
|
||||||
#include <sstream>
|
|
||||||
|
|
||||||
// This example uses obsolete APIs
|
|
||||||
// See protocol_new.cpp
|
|
||||||
namespace myprotocol {
|
|
||||||
struct Get {
|
|
||||||
Get() {}
|
|
||||||
Get(uint32_t f, const std::string& k) : flags(f), key(k) {}
|
|
||||||
uint32_t flags;
|
|
||||||
std::string key;
|
|
||||||
MSGPACK_DEFINE(flags, key);
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef std::vector<Get> MultiGet;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
// send Get request
|
|
||||||
std::stringstream stream;
|
|
||||||
{
|
|
||||||
myprotocol::Get req;
|
|
||||||
req.flags = 0;
|
|
||||||
req.key = "key0";
|
|
||||||
msgpack::pack(stream, req);
|
|
||||||
}
|
|
||||||
|
|
||||||
stream.seekg(0);
|
|
||||||
|
|
||||||
// receive Get request
|
|
||||||
{
|
|
||||||
std::string buffer(stream.str());
|
|
||||||
|
|
||||||
msgpack::unpacked result;
|
|
||||||
msgpack::unpack(result, buffer.data(), buffer.size());
|
|
||||||
msgpack::object o = result.get();
|
|
||||||
|
|
||||||
myprotocol::Get req;
|
|
||||||
o.convert(req);
|
|
||||||
std::cout << "received: " << o << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
stream.str("");
|
|
||||||
|
|
||||||
|
|
||||||
// send MultiGet request
|
|
||||||
{
|
|
||||||
myprotocol::MultiGet req;
|
|
||||||
req.push_back( myprotocol::Get(1, "key1") );
|
|
||||||
req.push_back( myprotocol::Get(2, "key2") );
|
|
||||||
req.push_back( myprotocol::Get(3, "key3") );
|
|
||||||
msgpack::pack(stream, req);
|
|
||||||
}
|
|
||||||
|
|
||||||
stream.seekg(0);
|
|
||||||
|
|
||||||
// receive MultiGet request
|
|
||||||
{
|
|
||||||
std::string buffer(stream.str());
|
|
||||||
|
|
||||||
msgpack::unpacked result;
|
|
||||||
msgpack::unpack(result, buffer.data(), buffer.size());
|
|
||||||
msgpack::object o = result.get();
|
|
||||||
|
|
||||||
|
|
||||||
myprotocol::MultiGet req;
|
|
||||||
o.convert(req);
|
|
||||||
std::cout << "received: " << o << std::endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
// MessagePack for C++ example
|
|
||||||
//
|
|
||||||
// Copyright (C) 2015 KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Distributed under the Boost Software License, Version 1.0.
|
|
||||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
|
||||||
// http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
//
|
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
#include <sstream>
|
|
||||||
#include <cassert>
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include <msgpack.hpp>
|
|
||||||
|
|
||||||
|
|
||||||
int main() {
|
|
||||||
std::vector<int> v;
|
|
||||||
v.push_back(1);
|
|
||||||
v.push_back(42);
|
|
||||||
std::string s("ABC");
|
|
||||||
|
|
||||||
std::stringstream ss;
|
|
||||||
msgpack::pack(ss, v);
|
|
||||||
msgpack::pack(ss, s);
|
|
||||||
|
|
||||||
msgpack::zone z;
|
|
||||||
std::size_t offset = 0;
|
|
||||||
|
|
||||||
// msgpack array is constructed on z.
|
|
||||||
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, ss.str().data(), ss.str().size(), offset).as<std::string>();
|
|
||||||
std::cout << str << std::endl;
|
|
||||||
assert(str == s);
|
|
||||||
}
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
// MessagePack for C++ example
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2015 FURUHASHI Sadayuki and KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Distributed under the Boost Software License, Version 1.0.
|
|
||||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
|
||||||
// http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
//
|
|
||||||
|
|
||||||
#include <msgpack.hpp>
|
|
||||||
#include <string>
|
|
||||||
#include <iostream>
|
|
||||||
#include <sstream>
|
|
||||||
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
msgpack::type::tuple<int, bool, std::string> src(1, true, "example");
|
|
||||||
|
|
||||||
// serialize the object into the buffer.
|
|
||||||
// any classes that implements write(const char*,size_t) can be a buffer.
|
|
||||||
std::stringstream buffer;
|
|
||||||
msgpack::pack(buffer, src);
|
|
||||||
|
|
||||||
// send the buffer ...
|
|
||||||
buffer.seekg(0);
|
|
||||||
|
|
||||||
// deserialize the buffer into msgpack::object instance.
|
|
||||||
std::string str(buffer.str());
|
|
||||||
|
|
||||||
msgpack::unpacked result;
|
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
// convert msgpack::object instance into the original type.
|
|
||||||
// if the type is mismatched, it throws msgpack::type_error exception.
|
|
||||||
msgpack::type::tuple<int, bool, std::string> dst;
|
|
||||||
deserialized.convert(dst);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
@@ -1,63 +0,0 @@
|
|||||||
// MessagePack for C++ example
|
|
||||||
//
|
|
||||||
// Copyright (C) 2013-2015 KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Distributed under the Boost Software License, Version 1.0.
|
|
||||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
|
||||||
// http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
//
|
|
||||||
|
|
||||||
// g++ -std=c++11 -O3 -g -Ipath_to_msgpack_src -Ipath_to_boost speed_test.cc -Lpath_to_boost_lib -lboost_timer -lboost_system
|
|
||||||
// export LD_LIBRARY_PATH=path_to_boost_lib
|
|
||||||
|
|
||||||
#include <msgpack.hpp>
|
|
||||||
#include <string>
|
|
||||||
#include <iostream>
|
|
||||||
#include <sstream>
|
|
||||||
#include <map>
|
|
||||||
#include <boost/timer/timer.hpp>
|
|
||||||
|
|
||||||
void test_map_pack_unpack() {
|
|
||||||
std::cout << "[TEST][map_pack_unpack]" << std::endl;
|
|
||||||
// setup
|
|
||||||
std::cout << "Setting up map data..." << std::endl;
|
|
||||||
std::map<int, int> m1;
|
|
||||||
int const num = 30000000L;
|
|
||||||
for (int i = 0; i < num; ++i) m1[i] = i;
|
|
||||||
std::cout << "Start packing..." << std::endl;
|
|
||||||
std::stringstream buffer;
|
|
||||||
{
|
|
||||||
boost::timer::cpu_timer timer;
|
|
||||||
msgpack::pack(buffer, m1);
|
|
||||||
std::string result = timer.format();
|
|
||||||
std::cout << result << std::endl;
|
|
||||||
}
|
|
||||||
std::cout << "Pack finished..." << std::endl;
|
|
||||||
|
|
||||||
buffer.seekg(0);
|
|
||||||
std::string str(buffer.str());
|
|
||||||
|
|
||||||
msgpack::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(unpacked, str.data(), str.size());
|
|
||||||
std::string result = timer.format();
|
|
||||||
std::cout << result << std::endl;
|
|
||||||
}
|
|
||||||
std::cout << "Unpack finished..." << std::endl;
|
|
||||||
std::map<int, int> m2;
|
|
||||||
std::cout << "Start converting..." << std::endl;
|
|
||||||
{
|
|
||||||
boost::timer::cpu_timer timer;
|
|
||||||
unpacked.get().convert(m2);
|
|
||||||
std::string result = timer.format();
|
|
||||||
std::cout << result << std::endl;
|
|
||||||
}
|
|
||||||
std::cout << "Convert finished..." << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
test_map_pack_unpack();
|
|
||||||
}
|
|
||||||
@@ -1,86 +0,0 @@
|
|||||||
// MessagePack for C++ example
|
|
||||||
//
|
|
||||||
// Copyright (C) 2013-2015 KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Distributed under the Boost Software License, Version 1.0.
|
|
||||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
|
||||||
// http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
//
|
|
||||||
|
|
||||||
// g++ -std=c++11 -O3 -g -Ipath_to_msgpack_src -Ipath_to_boost speed_test.cc -Lpath_to_boost_lib -lboost_timer -lboost_system
|
|
||||||
// export LD_LIBRARY_PATH=path_to_boost_lib
|
|
||||||
|
|
||||||
#include <msgpack.hpp>
|
|
||||||
#include <string>
|
|
||||||
#include <iostream>
|
|
||||||
#include <sstream>
|
|
||||||
#include <vector>
|
|
||||||
#include <boost/timer/timer.hpp>
|
|
||||||
|
|
||||||
template <typename T, std::size_t level>
|
|
||||||
struct vecvec {
|
|
||||||
typedef std::vector<typename vecvec<T, level - 1>::type> type;
|
|
||||||
static void fill(type& v, std::size_t num_of_elems, T const& val) {
|
|
||||||
for (std::size_t elem = 0; elem < num_of_elems; ++elem) {
|
|
||||||
typename vecvec<T, level - 1>::type child;
|
|
||||||
vecvec<T, level - 1>::fill(child, num_of_elems, val);
|
|
||||||
v.push_back(child);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct vecvec<T, 0> {
|
|
||||||
typedef std::vector<T> type;
|
|
||||||
static void fill(type& v, std::size_t num_of_elems, T const& val) {
|
|
||||||
for (std::size_t elem = 0; elem < num_of_elems; ++elem) {
|
|
||||||
v.push_back(val);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
void test_array_of_array() {
|
|
||||||
std::cout << "[TEST][array_of_array]" << std::endl;
|
|
||||||
// setup
|
|
||||||
int const depth = 4;
|
|
||||||
std::cout << "Setting up array data..." << std::endl;
|
|
||||||
vecvec<int, depth>::type v1;
|
|
||||||
vecvec<int, depth>::fill(v1, 3, 42);
|
|
||||||
|
|
||||||
std::cout << "Start packing..." << std::endl;
|
|
||||||
std::stringstream buffer;
|
|
||||||
{
|
|
||||||
boost::timer::cpu_timer timer;
|
|
||||||
msgpack::pack(buffer, v1);
|
|
||||||
std::string result = timer.format();
|
|
||||||
std::cout << result << std::endl;
|
|
||||||
}
|
|
||||||
std::cout << "Pack finished..." << std::endl;
|
|
||||||
|
|
||||||
buffer.seekg(0);
|
|
||||||
std::string str(buffer.str());
|
|
||||||
|
|
||||||
msgpack::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(unpacked, str.data(), str.size());
|
|
||||||
std::string result = timer.format();
|
|
||||||
std::cout << result << std::endl;
|
|
||||||
}
|
|
||||||
std::cout << "Unpack finished..." << std::endl;
|
|
||||||
vecvec<int, depth>::type v2;
|
|
||||||
std::cout << "Start converting..." << std::endl;
|
|
||||||
{
|
|
||||||
boost::timer::cpu_timer timer;
|
|
||||||
unpacked.get().convert(v2);
|
|
||||||
std::string result = timer.format();
|
|
||||||
std::cout << result << std::endl;
|
|
||||||
}
|
|
||||||
std::cout << "Convert finished..." << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
test_array_of_array();
|
|
||||||
}
|
|
||||||
@@ -1,142 +0,0 @@
|
|||||||
// MessagePack for C++ example
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2015 FURUHASHI Sadayuki and KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Distributed under the Boost Software License, Version 1.0.
|
|
||||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
|
||||||
// http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
//
|
|
||||||
|
|
||||||
#include <msgpack.hpp>
|
|
||||||
#include <iostream>
|
|
||||||
#include <stdexcept>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <pthread.h>
|
|
||||||
|
|
||||||
class Server {
|
|
||||||
public:
|
|
||||||
Server(int sock) : m_sock(sock) { }
|
|
||||||
|
|
||||||
~Server() { }
|
|
||||||
|
|
||||||
typedef msgpack::unique_ptr<msgpack::zone> unique_zone;
|
|
||||||
|
|
||||||
void socket_readable()
|
|
||||||
{
|
|
||||||
m_pac.reserve_buffer(1024);
|
|
||||||
|
|
||||||
ssize_t count =
|
|
||||||
read(m_sock, m_pac.buffer(), m_pac.buffer_capacity());
|
|
||||||
|
|
||||||
if(count <= 0) {
|
|
||||||
if(count == 0) {
|
|
||||||
throw std::runtime_error("connection closed");
|
|
||||||
}
|
|
||||||
if(errno == EAGAIN || errno == EINTR) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
throw std::runtime_error(strerror(errno));
|
|
||||||
}
|
|
||||||
|
|
||||||
m_pac.buffer_consumed(count);
|
|
||||||
|
|
||||||
msgpack::unpacked result;
|
|
||||||
while (m_pac.next(&result)) {
|
|
||||||
msgpack::object msg = result.get();
|
|
||||||
unique_zone& life = result.zone();
|
|
||||||
process_message(msg, life);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(m_pac.message_size() > 10*1024*1024) {
|
|
||||||
throw std::runtime_error("message is too large");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
void process_message(msgpack::object msg, unique_zone&)
|
|
||||||
{
|
|
||||||
std::cout << "message reached: " << msg << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
int m_sock;
|
|
||||||
msgpack::unpacker m_pac;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
static void* run_server(void* arg)
|
|
||||||
{
|
|
||||||
try {
|
|
||||||
Server* srv = reinterpret_cast<Server*>(arg);
|
|
||||||
|
|
||||||
while(true) {
|
|
||||||
srv->socket_readable();
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
} catch (std::exception& e) {
|
|
||||||
std::cerr << "error while processing client packet: "
|
|
||||||
<< e.what() << std::endl;
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
} catch (...) {
|
|
||||||
std::cerr << "error while processing client packet: "
|
|
||||||
<< "unknown error" << std::endl;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct fwriter {
|
|
||||||
fwriter(int fd) : m_fp( fdopen(fd, "w") ) { }
|
|
||||||
|
|
||||||
void write(const char* buf, size_t buflen)
|
|
||||||
{
|
|
||||||
size_t count = fwrite(buf, buflen, 1, m_fp);
|
|
||||||
if(count < 1) {
|
|
||||||
std::cout << buflen << std::endl;
|
|
||||||
std::cout << count << std::endl;
|
|
||||||
throw std::runtime_error(strerror(errno));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void flush() { fflush(m_fp); }
|
|
||||||
|
|
||||||
void close() { fclose(m_fp); }
|
|
||||||
|
|
||||||
private:
|
|
||||||
FILE* m_fp;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
int pair[2];
|
|
||||||
if (pipe(pair) != 0) return -1;
|
|
||||||
|
|
||||||
// run server thread
|
|
||||||
Server srv(pair[0]);
|
|
||||||
pthread_t thread;
|
|
||||||
pthread_create(&thread, NULL,
|
|
||||||
run_server, reinterpret_cast<void*>(&srv));
|
|
||||||
|
|
||||||
// client thread:
|
|
||||||
fwriter writer(pair[1]);
|
|
||||||
msgpack::packer<fwriter> pk(writer);
|
|
||||||
|
|
||||||
typedef msgpack::type::tuple<std::string, std::string, std::string> put_t;
|
|
||||||
typedef msgpack::type::tuple<std::string, std::string> get_t;
|
|
||||||
|
|
||||||
put_t req1("put", "apple", "red");
|
|
||||||
put_t req2("put", "lemon", "yellow");
|
|
||||||
get_t req3("get", "apple");
|
|
||||||
pk.pack(req1);
|
|
||||||
pk.pack(req2);
|
|
||||||
pk.pack(req3);
|
|
||||||
writer.flush();
|
|
||||||
writer.close();
|
|
||||||
|
|
||||||
pthread_join(thread, NULL);
|
|
||||||
}
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
IF (MSGPACK_CXX11)
|
|
||||||
INCLUDE_DIRECTORIES (
|
|
||||||
../include
|
|
||||||
)
|
|
||||||
|
|
||||||
LIST (APPEND exec_PROGRAMS
|
|
||||||
container.cpp
|
|
||||||
non_def_con_class.cpp
|
|
||||||
)
|
|
||||||
|
|
||||||
FOREACH (source_file ${exec_PROGRAMS})
|
|
||||||
GET_FILENAME_COMPONENT (source_file_we ${source_file} NAME_WE)
|
|
||||||
ADD_EXECUTABLE (
|
|
||||||
${source_file_we}
|
|
||||||
${source_file}
|
|
||||||
)
|
|
||||||
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 ()
|
|
||||||
ENDIF ()
|
|
||||||
@@ -1,149 +0,0 @@
|
|||||||
// MessagePack for C++ example
|
|
||||||
//
|
|
||||||
// Copyright (C) 2015 KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Distributed under the Boost Software License, Version 1.0.
|
|
||||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
|
||||||
// http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
//
|
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
#include <sstream>
|
|
||||||
#include <cassert>
|
|
||||||
|
|
||||||
#include <array>
|
|
||||||
#include <tuple>
|
|
||||||
#include <unordered_map>
|
|
||||||
#include <unordered_set>
|
|
||||||
#include <forward_list>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
#include <msgpack.hpp>
|
|
||||||
|
|
||||||
void array() {
|
|
||||||
std::array<int, 5> a { { 1, 2, 3, 4, 5 } };
|
|
||||||
std::stringstream ss;
|
|
||||||
msgpack::pack(ss, a);
|
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
void tuple() {
|
|
||||||
std::tuple<bool, std::string, int> t(true, "ABC", 42);
|
|
||||||
std::stringstream ss;
|
|
||||||
msgpack::pack(ss, t);
|
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
void unordered_map() {
|
|
||||||
std::unordered_map<std::string, int> m { {"ABC", 1}, {"DEF", 3} };
|
|
||||||
std::stringstream ss;
|
|
||||||
msgpack::pack(ss, m);
|
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
void unordered_set() {
|
|
||||||
std::unordered_set<std::string> s { "ABC", "DEF" };
|
|
||||||
std::stringstream ss;
|
|
||||||
msgpack::pack(ss, s);
|
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
void forward_list() {
|
|
||||||
using type = std::forward_list<std::string>;
|
|
||||||
type f { "ABC", "DEF" };
|
|
||||||
std::stringstream ss;
|
|
||||||
msgpack::pack(ss, f);
|
|
||||||
|
|
||||||
auto und = msgpack::unpack(ss.str().data(), ss.str().size());
|
|
||||||
auto obj = und.get();
|
|
||||||
|
|
||||||
std::cout << obj << std::endl;
|
|
||||||
assert(obj.as<type>() == f);
|
|
||||||
}
|
|
||||||
|
|
||||||
void combi() {
|
|
||||||
std::array<int, 5> a { { 1, 2, 3, 4, 5 } };
|
|
||||||
std::tuple<bool, std::string, int> t {true, "ABC", 42};
|
|
||||||
std::unordered_map<std::string, int> m { {"ABC", 1}, {"DEF", 3} };
|
|
||||||
std::unordered_set<std::string> s { "ABC", "DEF" };
|
|
||||||
std::forward_list<std::string> f { "ABC", "DEF" };
|
|
||||||
|
|
||||||
std::stringstream ss;
|
|
||||||
msgpack::pack(ss, a);
|
|
||||||
msgpack::pack(ss, t);
|
|
||||||
msgpack::pack(ss, m);
|
|
||||||
msgpack::pack(ss, s);
|
|
||||||
msgpack::pack(ss, f);
|
|
||||||
|
|
||||||
std::size_t offset = 0;
|
|
||||||
std::cout << "offset: " << offset << std::endl;
|
|
||||||
{
|
|
||||||
auto 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 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 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 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 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);
|
|
||||||
}
|
|
||||||
std::cout << "offset: " << offset << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main() {
|
|
||||||
array();
|
|
||||||
tuple();
|
|
||||||
unordered_map();
|
|
||||||
unordered_set();
|
|
||||||
forward_list();
|
|
||||||
combi();
|
|
||||||
}
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
// MessagePack for C++ example
|
|
||||||
//
|
|
||||||
// Copyright (C) 2015 KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Distributed under the Boost Software License, Version 1.0.
|
|
||||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
|
||||||
// http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
//
|
|
||||||
|
|
||||||
#include <cassert>
|
|
||||||
#include <memory>
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
#include <msgpack.hpp>
|
|
||||||
|
|
||||||
struct my {
|
|
||||||
my() = delete;
|
|
||||||
|
|
||||||
// target class should be either copyable or movable (or both).
|
|
||||||
my(my const&) = delete;
|
|
||||||
my(my&&) = default;
|
|
||||||
|
|
||||||
my(int a):a(a) {}
|
|
||||||
int a;
|
|
||||||
MSGPACK_DEFINE(a);
|
|
||||||
};
|
|
||||||
|
|
||||||
namespace msgpack {
|
|
||||||
MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS) {
|
|
||||||
namespace adaptor {
|
|
||||||
|
|
||||||
template<>
|
|
||||||
struct as<my> {
|
|
||||||
my operator()(msgpack::object const& o) const {
|
|
||||||
if (o.type != msgpack::type::ARRAY) throw msgpack::type_error();
|
|
||||||
if (o.via.array.size != 1) throw msgpack::type_error();
|
|
||||||
return my(o.via.array.ptr[0].as<int>());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace adaptor
|
|
||||||
} // MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS)
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
int main() {
|
|
||||||
my m1(42);
|
|
||||||
msgpack::zone z;
|
|
||||||
msgpack::object obj(m1, z);
|
|
||||||
std::cout << obj << std::endl;
|
|
||||||
assert(m1.a == obj.as<my>().a);
|
|
||||||
}
|
|
||||||
1
external/boost/predef
vendored
1
external/boost/predef
vendored
Submodule external/boost/predef deleted from c14eafa3ef
1
external/boost/preprocessor
vendored
1
external/boost/preprocessor
vendored
Submodule external/boost/preprocessor deleted from 9cb039ab8b
@@ -1,24 +0,0 @@
|
|||||||
/*
|
|
||||||
* MessagePack for C
|
|
||||||
*
|
|
||||||
* Copyright (C) 2008-2009 FURUHASHI Sadayuki
|
|
||||||
*
|
|
||||||
* Distributed under the Boost Software License, Version 1.0.
|
|
||||||
* (See accompanying file LICENSE_1_0.txt or copy at
|
|
||||||
* http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @defgroup msgpack MessagePack C
|
|
||||||
* @{
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "msgpack/util.h"
|
|
||||||
#include "msgpack/object.h"
|
|
||||||
#include "msgpack/zone.h"
|
|
||||||
#include "msgpack/pack.h"
|
|
||||||
#include "msgpack/unpack.h"
|
|
||||||
#include "msgpack/sbuffer.h"
|
|
||||||
#include "msgpack/vrefbuffer.h"
|
|
||||||
#include "msgpack/version.h"
|
|
||||||
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2009 FURUHASHI Sadayuki
|
|
||||||
//
|
|
||||||
// Distributed under the Boost Software License, Version 1.0.
|
|
||||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
|
||||||
// http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
//
|
|
||||||
#include "msgpack/object.hpp"
|
|
||||||
#include "msgpack/iterator.hpp"
|
|
||||||
#include "msgpack/zone.hpp"
|
|
||||||
#include "msgpack/pack.hpp"
|
|
||||||
#include "msgpack/unpack.hpp"
|
|
||||||
#include "msgpack/sbuffer.hpp"
|
|
||||||
#include "msgpack/vrefbuffer.hpp"
|
|
||||||
#include "msgpack/version.hpp"
|
|
||||||
#include "msgpack/type.hpp"
|
|
||||||
@@ -1,84 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2015 KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Distributed under the Boost Software License, Version 1.0.
|
|
||||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
|
||||||
// http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
//
|
|
||||||
#ifndef MSGPACK_ADAPTOR_BASE_HPP
|
|
||||||
#define MSGPACK_ADAPTOR_BASE_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
|
|
||||||
|
|
||||||
|
|
||||||
#endif // MSGPACK_ADAPTOR_BASE_HPP
|
|
||||||
@@ -1,174 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// 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_TYPE_ARRAY_REF_HPP
|
|
||||||
#define MSGPACK_TYPE_ARRAY_REF_HPP
|
|
||||||
|
|
||||||
#include "msgpack/versioning.hpp"
|
|
||||||
#include "msgpack/adaptor/adaptor_base.hpp"
|
|
||||||
#include "msgpack/adaptor/check_container_size.hpp"
|
|
||||||
#include <cstring>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
namespace msgpack {
|
|
||||||
|
|
||||||
/// @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
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// 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_TYPE_BOOL_HPP
|
|
||||||
#define MSGPACK_TYPE_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
|
|
||||||
@@ -1,160 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2015 KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Distributed under the Boost Software License, Version 1.0.
|
|
||||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
|
||||||
// http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
//
|
|
||||||
#ifndef MSGPACK_TYPE_BOOST_FUSION_HPP
|
|
||||||
#define MSGPACK_TYPE_BOOST_FUSION_HPP
|
|
||||||
|
|
||||||
#include "msgpack/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
|
|
||||||
@@ -1,430 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2015 KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Distributed under the Boost Software License, Version 1.0.
|
|
||||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
|
||||||
// http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
//
|
|
||||||
#ifndef MSGPACK_TYPE_BOOST_MSGPACK_VARIANT_HPP
|
|
||||||
#define MSGPACK_TYPE_BOOST_MSGPACK_VARIANT_HPP
|
|
||||||
|
|
||||||
#if defined(MSGPACK_USE_BOOST)
|
|
||||||
|
|
||||||
#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
|
|
||||||
@@ -1,96 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2015 KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Distributed under the Boost Software License, Version 1.0.
|
|
||||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
|
||||||
// http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
//
|
|
||||||
#ifndef MSGPACK_TYPE_BOOST_OPTIONAL_HPP
|
|
||||||
#define MSGPACK_TYPE_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
|
|
||||||
@@ -1,87 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2015 KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Distributed under the Boost Software License, Version 1.0.
|
|
||||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
|
||||||
// http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
//
|
|
||||||
#ifndef MSGPACK_TYPE_BOOST_STRING_REF_HPP
|
|
||||||
#define MSGPACK_TYPE_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
|
|
||||||
@@ -1,157 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// 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_CHAR_PTR_HPP
|
|
||||||
#define MSGPACK_TYPE_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
|
|
||||||
@@ -1,67 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2015 KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Distributed under the Boost Software License, Version 1.0.
|
|
||||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
|
||||||
// http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
//
|
|
||||||
#ifndef MSGPACK_CHECK_CONTAINER_SIZE_HPP
|
|
||||||
#define MSGPACK_CHECK_CONTAINER_SIZE_HPP
|
|
||||||
|
|
||||||
#include "msgpack/versioning.hpp"
|
|
||||||
#include <stdexcept>
|
|
||||||
|
|
||||||
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
|
|
||||||
@@ -1,138 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// 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_CPP11_ARRAY_HPP
|
|
||||||
#define MSGPACK_CPP11_ARRAY_HPP
|
|
||||||
|
|
||||||
#include "msgpack/versioning.hpp"
|
|
||||||
#include "msgpack/adaptor/adaptor_base.hpp"
|
|
||||||
#include "msgpack/adaptor/check_container_size.hpp"
|
|
||||||
#include "msgpack/meta.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
|
|
||||||
@@ -1,89 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// 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
|
|
||||||
|
|
||||||
#include "msgpack/versioning.hpp"
|
|
||||||
#include "msgpack/adaptor/adaptor_base.hpp"
|
|
||||||
#include "msgpack/adaptor/check_container_size.hpp"
|
|
||||||
|
|
||||||
#include <array>
|
|
||||||
|
|
||||||
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
|
|
||||||
@@ -1,89 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// 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
|
|
||||||
|
|
||||||
#include "msgpack/versioning.hpp"
|
|
||||||
#include "msgpack/adaptor/adaptor_base.hpp"
|
|
||||||
#include "msgpack/adaptor/check_container_size.hpp"
|
|
||||||
|
|
||||||
#include <array>
|
|
||||||
|
|
||||||
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
|
|
||||||
@@ -1,94 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// 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_CPP11_FORWARD_LIST_HPP
|
|
||||||
#define MSGPACK_CPP11_FORWARD_LIST_HPP
|
|
||||||
|
|
||||||
#include "msgpack/versioning.hpp"
|
|
||||||
#include "msgpack/adaptor/adaptor_base.hpp"
|
|
||||||
#include "msgpack/adaptor/check_container_size.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
|
|
||||||
@@ -1,68 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2015 KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Distributed under the Boost Software License, Version 1.0.
|
|
||||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
|
||||||
// http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifndef MSGPACK_CPP11_REFERENCE_WRAPPER_HPP
|
|
||||||
#define MSGPACK_CPP11_REFERENCE_WRAPPER_HPP
|
|
||||||
|
|
||||||
#include "msgpack/versioning.hpp"
|
|
||||||
#include "msgpack/adaptor/adaptor_base.hpp"
|
|
||||||
#include "msgpack/adaptor/check_container_size.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
|
|
||||||
@@ -1,82 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2015 KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Distributed under the Boost Software License, Version 1.0.
|
|
||||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
|
||||||
// http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifndef MSGPACK_CPP11_SHARED_PTR_HPP
|
|
||||||
#define MSGPACK_CPP11_SHARED_PTR_HPP
|
|
||||||
|
|
||||||
#include "msgpack/versioning.hpp"
|
|
||||||
#include "msgpack/adaptor/adaptor_base.hpp"
|
|
||||||
#include "msgpack/adaptor/check_container_size.hpp"
|
|
||||||
|
|
||||||
#include <memory>
|
|
||||||
|
|
||||||
namespace msgpack {
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
MSGPACK_API_VERSION_NAMESPACE(v1) {
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
namespace adaptor {
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct as<std::shared_ptr<T>, typename std::enable_if<msgpack::has_as<T>::value>::type> {
|
|
||||||
std::shared_ptr<T> operator()(msgpack::object const& o) const {
|
|
||||||
if(o.is_nil()) return nullptr;
|
|
||||||
return std::make_shared<T>(o.as<T>());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct convert<std::shared_ptr<T>> {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, std::shared_ptr<T>& v) const {
|
|
||||||
if(o.is_nil()) v.reset();
|
|
||||||
else {
|
|
||||||
v = std::make_shared<T>();
|
|
||||||
msgpack::adaptor::convert<T>()(o, *v);
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct pack<std::shared_ptr<T>> {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::shared_ptr<T>& v) const {
|
|
||||||
if (v) o.pack(*v);
|
|
||||||
else o.pack_nil();
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct object<std::shared_ptr<T> > {
|
|
||||||
void operator()(msgpack::object& o, const std::shared_ptr<T>& v) const {
|
|
||||||
if (v) msgpack::adaptor::object<T>()(o, *v);
|
|
||||||
else o.type = msgpack::type::NIL;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct object_with_zone<std::shared_ptr<T>> {
|
|
||||||
void operator()(msgpack::object::with_zone& o, const std::shared_ptr<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_CPP11_SHARED_PTR_HPP
|
|
||||||
@@ -1,176 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2015 FURUHASHI Sadayuki and KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Distributed under the Boost Software License, Version 1.0.
|
|
||||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
|
||||||
// http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
//
|
|
||||||
#ifndef MSGPACK_CPP11_TUPLE_HPP
|
|
||||||
#define MSGPACK_CPP11_TUPLE_HPP
|
|
||||||
|
|
||||||
#include "msgpack/versioning.hpp"
|
|
||||||
#include "msgpack/adaptor/adaptor_base.hpp"
|
|
||||||
#include "msgpack/adaptor/check_container_size.hpp"
|
|
||||||
#include "msgpack/meta.hpp"
|
|
||||||
|
|
||||||
#include <tuple>
|
|
||||||
|
|
||||||
namespace msgpack {
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
MSGPACK_API_VERSION_NAMESPACE(v1) {
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
// --- Pack from tuple to packer stream ---
|
|
||||||
template <typename Stream, typename Tuple, std::size_t N>
|
|
||||||
struct StdTuplePacker {
|
|
||||||
static void pack(
|
|
||||||
msgpack::packer<Stream>& o,
|
|
||||||
const Tuple& v) {
|
|
||||||
StdTuplePacker<Stream, Tuple, N-1>::pack(o, v);
|
|
||||||
o.pack(std::get<N-1>(v));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Stream, typename Tuple>
|
|
||||||
struct StdTuplePacker<Stream, Tuple, 0> {
|
|
||||||
static void pack (
|
|
||||||
msgpack::packer<Stream>&,
|
|
||||||
const Tuple&) {
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
namespace adaptor {
|
|
||||||
|
|
||||||
template <typename... Args>
|
|
||||||
struct pack<std::tuple<Args...>> {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(
|
|
||||||
msgpack::packer<Stream>& o,
|
|
||||||
const std::tuple<Args...>& v) const {
|
|
||||||
uint32_t size = checked_get_container_size(sizeof...(Args));
|
|
||||||
o.pack_array(size);
|
|
||||||
StdTuplePacker<Stream, decltype(v), sizeof...(Args)>::pack(o, v);
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace adaptor
|
|
||||||
|
|
||||||
// --- Convert from tuple to object ---
|
|
||||||
|
|
||||||
template <typename... Args>
|
|
||||||
struct StdTupleAs;
|
|
||||||
|
|
||||||
template <typename T, typename... Args>
|
|
||||||
struct StdTupleAsImpl {
|
|
||||||
static std::tuple<T, Args...> as(msgpack::object const& o) {
|
|
||||||
return std::tuple_cat(
|
|
||||||
std::make_tuple(o.via.array.ptr[o.via.array.size - sizeof...(Args) - 1].as<T>()),
|
|
||||||
StdTupleAs<Args...>::as(o));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename... Args>
|
|
||||||
struct StdTupleAs {
|
|
||||||
static std::tuple<Args...> as(msgpack::object const& o) {
|
|
||||||
return StdTupleAsImpl<Args...>::as(o);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct StdTupleAs<> {
|
|
||||||
static std::tuple<> as (msgpack::object const&) {
|
|
||||||
return std::tuple<>();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Tuple, std::size_t N>
|
|
||||||
struct StdTupleConverter {
|
|
||||||
static void convert(
|
|
||||||
msgpack::object const& o,
|
|
||||||
Tuple& v) {
|
|
||||||
StdTupleConverter<Tuple, N-1>::convert(o, v);
|
|
||||||
o.via.array.ptr[N-1].convert<typename std::remove_reference<decltype(std::get<N-1>(v))>::type>(std::get<N-1>(v));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Tuple>
|
|
||||||
struct StdTupleConverter<Tuple, 0> {
|
|
||||||
static void convert (
|
|
||||||
msgpack::object const&,
|
|
||||||
Tuple&) {
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
namespace adaptor {
|
|
||||||
|
|
||||||
template <typename... Args>
|
|
||||||
struct as<std::tuple<Args...>, typename std::enable_if<msgpack::all_of<msgpack::has_as, Args...>::value>::type> {
|
|
||||||
std::tuple<Args...> operator()(
|
|
||||||
msgpack::object const& o) const {
|
|
||||||
if (o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
|
|
||||||
if (o.via.array.size < sizeof...(Args)) { throw msgpack::type_error(); }
|
|
||||||
return StdTupleAs<Args...>::as(o);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename... Args>
|
|
||||||
struct convert<std::tuple<Args...>> {
|
|
||||||
msgpack::object const& operator()(
|
|
||||||
msgpack::object const& o,
|
|
||||||
std::tuple<Args...>& v) const {
|
|
||||||
if(o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
|
|
||||||
if(o.via.array.size < sizeof...(Args)) { throw msgpack::type_error(); }
|
|
||||||
StdTupleConverter<decltype(v), sizeof...(Args)>::convert(o, v);
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace adaptor
|
|
||||||
|
|
||||||
// --- Convert from tuple to object with zone ---
|
|
||||||
template <typename Tuple, std::size_t N>
|
|
||||||
struct StdTupleToObjectWithZone {
|
|
||||||
static void convert(
|
|
||||||
msgpack::object::with_zone& o,
|
|
||||||
const Tuple& v) {
|
|
||||||
StdTupleToObjectWithZone<Tuple, N-1>::convert(o, v);
|
|
||||||
o.via.array.ptr[N-1] = msgpack::object(std::get<N-1>(v), o.zone);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Tuple>
|
|
||||||
struct StdTupleToObjectWithZone<Tuple, 0> {
|
|
||||||
static void convert (
|
|
||||||
msgpack::object::with_zone&,
|
|
||||||
const Tuple&) {
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
namespace adaptor {
|
|
||||||
|
|
||||||
template <typename... Args>
|
|
||||||
struct object_with_zone<std::tuple<Args...>> {
|
|
||||||
void operator()(
|
|
||||||
msgpack::object::with_zone& o,
|
|
||||||
std::tuple<Args...> const& v) const {
|
|
||||||
uint32_t size = checked_get_container_size(sizeof...(Args));
|
|
||||||
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;
|
|
||||||
StdTupleToObjectWithZone<decltype(v), sizeof...(Args)>::convert(o, v);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace adaptor
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
} // MSGPACK_API_VERSION_NAMESPACE(v1)
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
#endif // MSGPACK_CPP11_TUPLE_HPP
|
|
||||||
@@ -1,82 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2015 KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Distributed under the Boost Software License, Version 1.0.
|
|
||||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
|
||||||
// http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifndef MSGPACK_CPP11_UNIQUE_PTR_HPP
|
|
||||||
#define MSGPACK_CPP11_UNIQUE_PTR_HPP
|
|
||||||
|
|
||||||
#include "msgpack/versioning.hpp"
|
|
||||||
#include "msgpack/adaptor/adaptor_base.hpp"
|
|
||||||
#include "msgpack/adaptor/check_container_size.hpp"
|
|
||||||
|
|
||||||
#include <memory>
|
|
||||||
|
|
||||||
namespace msgpack {
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
MSGPACK_API_VERSION_NAMESPACE(v1) {
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
namespace adaptor {
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct as<std::unique_ptr<T>, typename std::enable_if<msgpack::has_as<T>::value>::type> {
|
|
||||||
std::unique_ptr<T> operator()(msgpack::object const& o) const {
|
|
||||||
if(o.is_nil()) return nullptr;
|
|
||||||
return std::unique_ptr<T>(new T(o.as<T>()));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct convert<std::unique_ptr<T>> {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, std::unique_ptr<T>& v) const {
|
|
||||||
if(o.is_nil()) v.reset();
|
|
||||||
else {
|
|
||||||
v.reset(new T);
|
|
||||||
msgpack::adaptor::convert<T>()(o, *v);
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct pack<std::unique_ptr<T>> {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::unique_ptr<T>& v) const {
|
|
||||||
if (v) o.pack(*v);
|
|
||||||
else o.pack_nil();
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct object<std::unique_ptr<T> > {
|
|
||||||
void operator()(msgpack::object& o, const std::unique_ptr<T>& v) const {
|
|
||||||
if (v) msgpack::adaptor::object<T>()(o, *v);
|
|
||||||
else o.type = msgpack::type::NIL;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct object_with_zone<std::unique_ptr<T>> {
|
|
||||||
void operator()(msgpack::object::with_zone& o, const std::unique_ptr<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_CPP11_UNIQUE_PTR_HPP
|
|
||||||
@@ -1,182 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// 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_UNORDERED_MAP_HPP
|
|
||||||
#define MSGPACK_TYPE_UNORDERED_MAP_HPP
|
|
||||||
|
|
||||||
#include "msgpack/versioning.hpp"
|
|
||||||
#include "msgpack/adaptor/adaptor_base.hpp"
|
|
||||||
#include "msgpack/adaptor/check_container_size.hpp"
|
|
||||||
|
|
||||||
#include <unordered_map>
|
|
||||||
|
|
||||||
namespace msgpack {
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
MSGPACK_API_VERSION_NAMESPACE(v1) {
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
namespace adaptor {
|
|
||||||
|
|
||||||
template <typename K, typename V, typename Hash, typename Compare, typename Alloc>
|
|
||||||
struct as<
|
|
||||||
std::unordered_map<K, V, Hash, Compare, Alloc>,
|
|
||||||
typename std::enable_if<msgpack::has_as<K>::value && msgpack::has_as<V>::value>::type> {
|
|
||||||
std::unordered_map<K, V, Hash, Compare, Alloc> operator()(msgpack::object const& o) const {
|
|
||||||
if (o.type != msgpack::type::MAP) { throw msgpack::type_error(); }
|
|
||||||
msgpack::object_kv* p(o.via.map.ptr);
|
|
||||||
msgpack::object_kv* const pend(o.via.map.ptr + o.via.map.size);
|
|
||||||
std::unordered_map<K, V, Hash, Compare, Alloc> v;
|
|
||||||
for (; p != pend; ++p) {
|
|
||||||
v.emplace(p->key.as<K>(), p->val.as<V>());
|
|
||||||
}
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename K, typename V, typename Hash, typename Compare, typename Alloc>
|
|
||||||
struct convert<std::unordered_map<K, V, Hash, Compare, Alloc>> {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, std::unordered_map<K, V, Hash, Compare, Alloc>& v) const {
|
|
||||||
if(o.type != msgpack::type::MAP) { throw msgpack::type_error(); }
|
|
||||||
msgpack::object_kv* p(o.via.map.ptr);
|
|
||||||
msgpack::object_kv* const pend(o.via.map.ptr + o.via.map.size);
|
|
||||||
std::unordered_map<K, V, Hash, Compare, Alloc> tmp;
|
|
||||||
for(; p != pend; ++p) {
|
|
||||||
K key;
|
|
||||||
p->key.convert(key);
|
|
||||||
p->val.convert(tmp[std::move(key)]);
|
|
||||||
}
|
|
||||||
v = std::move(tmp);
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename K, typename V, typename Hash, typename Compare, typename Alloc>
|
|
||||||
struct pack<std::unordered_map<K, V, Hash, Compare, Alloc>> {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::unordered_map<K, V, Hash, Compare, Alloc>& v) const {
|
|
||||||
uint32_t size = checked_get_container_size(v.size());
|
|
||||||
o.pack_map(size);
|
|
||||||
for(typename std::unordered_map<K, V, Hash, Compare, Alloc>::const_iterator it(v.begin()), it_end(v.end());
|
|
||||||
it != it_end; ++it) {
|
|
||||||
o.pack(it->first);
|
|
||||||
o.pack(it->second);
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename K, typename V, typename Hash, typename Compare, typename Alloc>
|
|
||||||
struct object_with_zone<std::unordered_map<K, V, Hash, Compare, Alloc>> {
|
|
||||||
void operator()(msgpack::object::with_zone& o, const std::unordered_map<K, V, Hash, Compare, Alloc>& v) const {
|
|
||||||
o.type = msgpack::type::MAP;
|
|
||||||
if(v.empty()) {
|
|
||||||
o.via.map.ptr = nullptr;
|
|
||||||
o.via.map.size = 0;
|
|
||||||
} else {
|
|
||||||
uint32_t size = checked_get_container_size(v.size());
|
|
||||||
msgpack::object_kv* p = static_cast<msgpack::object_kv*>(o.zone.allocate_align(sizeof(msgpack::object_kv)*size));
|
|
||||||
msgpack::object_kv* const pend = p + size;
|
|
||||||
o.via.map.ptr = p;
|
|
||||||
o.via.map.size = size;
|
|
||||||
typename std::unordered_map<K, V, Hash, Compare, Alloc>::const_iterator it(v.begin());
|
|
||||||
do {
|
|
||||||
p->key = msgpack::object(it->first, o.zone);
|
|
||||||
p->val = msgpack::object(it->second, o.zone);
|
|
||||||
++p;
|
|
||||||
++it;
|
|
||||||
} while(p < pend);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
template <typename K, typename V, typename Hash, typename Compare, typename Alloc>
|
|
||||||
struct as<
|
|
||||||
std::unordered_multimap<K, V, Hash, Compare, Alloc>,
|
|
||||||
typename std::enable_if<msgpack::has_as<K>::value && msgpack::has_as<V>::value>::type> {
|
|
||||||
std::unordered_multimap<K, V, Hash, Compare, Alloc> operator()(msgpack::object const& o) const {
|
|
||||||
if (o.type != msgpack::type::MAP) { throw msgpack::type_error(); }
|
|
||||||
msgpack::object_kv* p(o.via.map.ptr);
|
|
||||||
msgpack::object_kv* const pend(o.via.map.ptr + o.via.map.size);
|
|
||||||
std::unordered_multimap<K, V, Hash, Compare, Alloc> v;
|
|
||||||
for (; p != pend; ++p) {
|
|
||||||
v.emplace(p->key.as<K>(), p->val.as<V>());
|
|
||||||
}
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename K, typename V, typename Hash, typename Compare, typename Alloc>
|
|
||||||
struct convert<std::unordered_multimap<K, V, Hash, Compare, Alloc>> {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, std::unordered_multimap<K, V, Hash, Compare, Alloc>& v) const {
|
|
||||||
if(o.type != msgpack::type::MAP) { throw msgpack::type_error(); }
|
|
||||||
msgpack::object_kv* p(o.via.map.ptr);
|
|
||||||
msgpack::object_kv* const pend(o.via.map.ptr + o.via.map.size);
|
|
||||||
std::unordered_multimap<K, V, Hash, Compare, Alloc> tmp;
|
|
||||||
for(; p != pend; ++p) {
|
|
||||||
std::pair<K, V> value;
|
|
||||||
p->key.convert(value.first);
|
|
||||||
p->val.convert(value.second);
|
|
||||||
tmp.insert(std::move(value));
|
|
||||||
}
|
|
||||||
v = std::move(tmp);
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename K, typename V, typename Hash, typename Compare, typename Alloc>
|
|
||||||
struct pack<std::unordered_multimap<K, V, Hash, Compare, Alloc>> {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::unordered_multimap<K, V, Hash, Compare, Alloc>& v) const {
|
|
||||||
uint32_t size = checked_get_container_size(v.size());
|
|
||||||
o.pack_map(size);
|
|
||||||
for(typename std::unordered_multimap<K, V, Hash, Compare, Alloc>::const_iterator it(v.begin()), it_end(v.end());
|
|
||||||
it != it_end; ++it) {
|
|
||||||
o.pack(it->first);
|
|
||||||
o.pack(it->second);
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename K, typename V, typename Hash, typename Compare, typename Alloc>
|
|
||||||
struct object_with_zone<std::unordered_multimap<K, V, Hash, Compare, Alloc>> {
|
|
||||||
void operator()(msgpack::object::with_zone& o, const std::unordered_multimap<K, V, Hash, Compare, Alloc>& v) const {
|
|
||||||
o.type = msgpack::type::MAP;
|
|
||||||
if(v.empty()) {
|
|
||||||
o.via.map.ptr = nullptr;
|
|
||||||
o.via.map.size = 0;
|
|
||||||
} else {
|
|
||||||
uint32_t size = checked_get_container_size(v.size());
|
|
||||||
msgpack::object_kv* p = static_cast<msgpack::object_kv*>(o.zone.allocate_align(sizeof(msgpack::object_kv)*size));
|
|
||||||
msgpack::object_kv* const pend = p + size;
|
|
||||||
o.via.map.ptr = p;
|
|
||||||
o.via.map.size = size;
|
|
||||||
typename std::unordered_multimap<K, V, Hash, Compare, Alloc>::const_iterator it(v.begin());
|
|
||||||
do {
|
|
||||||
p->key = msgpack::object(it->first, o.zone);
|
|
||||||
p->val = msgpack::object(it->second, o.zone);
|
|
||||||
++p;
|
|
||||||
++it;
|
|
||||||
} while(p < pend);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace adaptor
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
} // MSGPACK_API_VERSION_NAMESPACE(v1)
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
|
|
||||||
#endif // MSGPACK_TYPE_UNORDERED_MAP_HPP
|
|
||||||
@@ -1,172 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// 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_UNORDERED_SET_HPP
|
|
||||||
#define MSGPACK_TYPE_UNORDERED_SET_HPP
|
|
||||||
|
|
||||||
#include "msgpack/versioning.hpp"
|
|
||||||
#include "msgpack/adaptor/adaptor_base.hpp"
|
|
||||||
#include "msgpack/adaptor/check_container_size.hpp"
|
|
||||||
|
|
||||||
#include <unordered_set>
|
|
||||||
|
|
||||||
namespace msgpack {
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
MSGPACK_API_VERSION_NAMESPACE(v1) {
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
namespace adaptor {
|
|
||||||
|
|
||||||
template <typename Key, typename Hash, typename Compare, typename Alloc>
|
|
||||||
struct as<std::unordered_set<Key, Hash, Compare, Alloc>, typename std::enable_if<msgpack::has_as<Key>::value>::type> {
|
|
||||||
std::unordered_set<Key, Hash, Compare, Alloc> operator()(msgpack::object const& o) const {
|
|
||||||
if (o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
|
|
||||||
msgpack::object* p = o.via.array.ptr + o.via.array.size;
|
|
||||||
msgpack::object* const pbegin = o.via.array.ptr;
|
|
||||||
std::unordered_set<Key, Hash, Compare, Alloc> v;
|
|
||||||
while (p > pbegin) {
|
|
||||||
--p;
|
|
||||||
v.insert(p->as<Key>());
|
|
||||||
}
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Key, typename Hash, typename Compare, typename Alloc>
|
|
||||||
struct convert<std::unordered_set<Key, Hash, Compare, Alloc>> {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, std::unordered_set<Key, Hash, Compare, Alloc>& v) const {
|
|
||||||
if(o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
|
|
||||||
msgpack::object* p = o.via.array.ptr + o.via.array.size;
|
|
||||||
msgpack::object* const pbegin = o.via.array.ptr;
|
|
||||||
std::unordered_set<Key, Hash, Compare, Alloc> tmp;
|
|
||||||
while(p > pbegin) {
|
|
||||||
--p;
|
|
||||||
tmp.insert(p->as<Key>());
|
|
||||||
}
|
|
||||||
v = std::move(tmp);
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Key, typename Hash, typename Compare, typename Alloc>
|
|
||||||
struct pack<std::unordered_set<Key, Hash, Compare, Alloc>> {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::unordered_set<Key, Hash, Compare, Alloc>& v) const {
|
|
||||||
uint32_t size = checked_get_container_size(v.size());
|
|
||||||
o.pack_array(size);
|
|
||||||
for(typename std::unordered_set<Key, Hash, Compare, Alloc>::const_iterator it(v.begin()), it_end(v.end());
|
|
||||||
it != it_end; ++it) {
|
|
||||||
o.pack(*it);
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Key, typename Hash, typename Compare, typename Alloc>
|
|
||||||
struct object_with_zone<std::unordered_set<Key, Hash, Compare, Alloc>> {
|
|
||||||
void operator()(msgpack::object::with_zone& o, const std::unordered_set<Key, Hash, Compare, 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(v.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 std::unordered_set<Key, Hash, Compare, Alloc>::const_iterator it(v.begin());
|
|
||||||
do {
|
|
||||||
*p = msgpack::object(*it, o.zone);
|
|
||||||
++p;
|
|
||||||
++it;
|
|
||||||
} while(p < pend);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
template <typename Key, typename Hash, typename Compare, typename Alloc>
|
|
||||||
struct as<std::unordered_multiset<Key, Hash, Compare, Alloc>, typename std::enable_if<msgpack::has_as<Key>::value>::type> {
|
|
||||||
std::unordered_multiset<Key, Hash, Compare, Alloc> operator()(msgpack::object const& o) const {
|
|
||||||
if (o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
|
|
||||||
msgpack::object* p = o.via.array.ptr + o.via.array.size;
|
|
||||||
msgpack::object* const pbegin = o.via.array.ptr;
|
|
||||||
std::unordered_multiset<Key, Hash, Compare, Alloc> v;
|
|
||||||
while (p > pbegin) {
|
|
||||||
--p;
|
|
||||||
v.insert(p->as<Key>());
|
|
||||||
}
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Key, typename Hash, typename Compare, typename Alloc>
|
|
||||||
struct convert<std::unordered_multiset<Key, Hash, Compare, Alloc>> {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, std::unordered_multiset<Key, Hash, Compare, Alloc>& v) const {
|
|
||||||
if(o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
|
|
||||||
msgpack::object* p = o.via.array.ptr + o.via.array.size;
|
|
||||||
msgpack::object* const pbegin = o.via.array.ptr;
|
|
||||||
std::unordered_multiset<Key, Hash, Compare, Alloc> tmp;
|
|
||||||
while(p > pbegin) {
|
|
||||||
--p;
|
|
||||||
tmp.insert(p->as<Key>());
|
|
||||||
}
|
|
||||||
v = std::move(tmp);
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Key, typename Hash, typename Compare, typename Alloc>
|
|
||||||
struct pack<std::unordered_multiset<Key, Hash, Compare, Alloc>> {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::unordered_multiset<Key, Hash, Compare, Alloc>& v) const {
|
|
||||||
uint32_t size = checked_get_container_size(v.size());
|
|
||||||
o.pack_array(size);
|
|
||||||
for(typename std::unordered_multiset<Key, Hash, Compare, Alloc>::const_iterator it(v.begin()), it_end(v.end());
|
|
||||||
it != it_end; ++it) {
|
|
||||||
o.pack(*it);
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Key, typename Hash, typename Compare, typename Alloc>
|
|
||||||
struct object_with_zone<std::unordered_multiset<Key, Hash, Compare, Alloc>> {
|
|
||||||
void operator()(msgpack::object::with_zone& o, const std::unordered_multiset<Key, Hash, Compare, 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(v.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 std::unordered_multiset<Key, Hash, Compare, Alloc>::const_iterator it(v.begin());
|
|
||||||
do {
|
|
||||||
*p = msgpack::object(*it, o.zone);
|
|
||||||
++p;
|
|
||||||
++it;
|
|
||||||
} while(p < pend);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace adaptor
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
} // MSGPACK_API_VERSION_NAMESPACE(v1)
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
#endif // MSGPACK_TYPE_UNORDERED_SET_HPP
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2014 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_DEFINE_HPP
|
|
||||||
#define MSGPACK_DEFINE_HPP
|
|
||||||
|
|
||||||
#include "msgpack/cpp_config.hpp"
|
|
||||||
|
|
||||||
#if defined(MSGPACK_USE_CPP03)
|
|
||||||
#include "detail/cpp03_define_array.hpp"
|
|
||||||
#include "detail/cpp03_define_map.hpp"
|
|
||||||
#else // MSGPACK_USE_CPP03
|
|
||||||
#include "detail/cpp11_define_array.hpp"
|
|
||||||
#include "detail/cpp11_define_map.hpp"
|
|
||||||
#endif // MSGPACK_USE_CPP03
|
|
||||||
|
|
||||||
#if defined(MSGPACK_USE_DEFINE_MAP)
|
|
||||||
#define MSGPACK_DEFINE MSGPACK_DEFINE_MAP
|
|
||||||
#define MSGPACK_BASE MSGPACK_BASE_MAP
|
|
||||||
#else // defined(MSGPACK_USE_DEFINE_MAP)
|
|
||||||
#define MSGPACK_DEFINE MSGPACK_DEFINE_ARRAY
|
|
||||||
#define MSGPACK_BASE MSGPACK_BASE_ARRAY
|
|
||||||
#endif // defined(MSGPACK_USE_DEFINE_MAP)
|
|
||||||
|
|
||||||
#endif // MSGPACK_DEFINE_HPP
|
|
||||||
@@ -1,108 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2015 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_TYPE_DEQUE_HPP
|
|
||||||
#define MSGPACK_TYPE_DEQUE_HPP
|
|
||||||
|
|
||||||
#include "msgpack/versioning.hpp"
|
|
||||||
#include "msgpack/adaptor/adaptor_base.hpp"
|
|
||||||
#include "msgpack/adaptor/check_container_size.hpp"
|
|
||||||
|
|
||||||
#include <deque>
|
|
||||||
|
|
||||||
namespace msgpack {
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
MSGPACK_API_VERSION_NAMESPACE(v1) {
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
namespace adaptor {
|
|
||||||
|
|
||||||
#if !defined(MSGPACK_USE_CPP03)
|
|
||||||
|
|
||||||
template <typename T, typename Alloc>
|
|
||||||
struct as<std::deque<T, Alloc>, typename std::enable_if<msgpack::has_as<T>::value>::type> {
|
|
||||||
std::deque<T, Alloc> operator()(const msgpack::object& o) const {
|
|
||||||
if (o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
|
|
||||||
std::deque<T, Alloc> v;
|
|
||||||
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;
|
|
||||||
do {
|
|
||||||
v.push_back(p->as<T>());
|
|
||||||
++p;
|
|
||||||
} while (p < pend);
|
|
||||||
}
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // !defined(MSGPACK_USE_CPP03)
|
|
||||||
|
|
||||||
template <typename T, typename Alloc>
|
|
||||||
struct convert<std::deque<T, Alloc> > {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, std::deque<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;
|
|
||||||
msgpack::object* const pend = o.via.array.ptr + o.via.array.size;
|
|
||||||
typename std::deque<T, Alloc>::iterator it = v.begin();
|
|
||||||
for(; p < pend; ++p, ++it) {
|
|
||||||
p->convert(*it);
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T, typename Alloc>
|
|
||||||
struct pack<std::deque<T, Alloc> > {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::deque<T, Alloc>& v) const {
|
|
||||||
uint32_t size = checked_get_container_size(v.size());
|
|
||||||
o.pack_array(size);
|
|
||||||
for(typename std::deque<T, Alloc>::const_iterator it(v.begin()), it_end(v.end());
|
|
||||||
it != it_end; ++it) {
|
|
||||||
o.pack(*it);
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T, typename Alloc>
|
|
||||||
struct object_with_zone<std::deque<T, Alloc> > {
|
|
||||||
void operator()(msgpack::object::with_zone& o, const std::deque<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(v.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 std::deque<T, Alloc>::const_iterator it(v.begin());
|
|
||||||
do {
|
|
||||||
*p = msgpack::object(*it, o.zone);
|
|
||||||
++p;
|
|
||||||
++it;
|
|
||||||
} while(p < pend);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace adaptor
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
} // MSGPACK_API_VERSION_NAMESPACE(v1)
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
#endif /* msgpack/type/deque.hpp */
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,193 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// 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_CPP11_DEFINE_ARRAY_HPP
|
|
||||||
#define MSGPACK_CPP11_DEFINE_ARRAY_HPP
|
|
||||||
|
|
||||||
#include "msgpack/versioning.hpp"
|
|
||||||
#include "msgpack/adaptor/adaptor_base.hpp"
|
|
||||||
|
|
||||||
// for MSGPACK_ADD_ENUM
|
|
||||||
#include "msgpack/adaptor/int.hpp"
|
|
||||||
|
|
||||||
#include <type_traits>
|
|
||||||
#include <tuple>
|
|
||||||
|
|
||||||
#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 { \
|
|
||||||
std::underlying_type<enum_name>::type 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 { \
|
|
||||||
auto tmp = static_cast<std::underlying_type<enum_name>::type>(v); \
|
|
||||||
o << tmp; \
|
|
||||||
} \
|
|
||||||
}; \
|
|
||||||
template<> \
|
|
||||||
struct object_with_zone<enum_name> { \
|
|
||||||
void operator()(msgpack::object::with_zone& o, const enum_name& v) const { \
|
|
||||||
auto tmp = static_cast<std::underlying_type<enum_name>::type>(v); \
|
|
||||||
o << tmp; \
|
|
||||||
} \
|
|
||||||
}; \
|
|
||||||
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<std::underlying_type<enum_name>::type>(v); \
|
|
||||||
} \
|
|
||||||
}; \
|
|
||||||
} \
|
|
||||||
/** @cond */ \
|
|
||||||
} \
|
|
||||||
/** @endcond */ \
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace msgpack {
|
|
||||||
/// @cond
|
|
||||||
MSGPACK_API_VERSION_NAMESPACE(v1) {
|
|
||||||
/// @endcond
|
|
||||||
namespace type {
|
|
||||||
|
|
||||||
template <typename Tuple, std::size_t N>
|
|
||||||
struct define_array_imp {
|
|
||||||
template <typename Packer>
|
|
||||||
static void pack(Packer& pk, Tuple const& t) {
|
|
||||||
define_array_imp<Tuple, N-1>::pack(pk, t);
|
|
||||||
pk.pack(std::get<N-1>(t));
|
|
||||||
}
|
|
||||||
static void unpack(msgpack::object const& o, Tuple& t) {
|
|
||||||
define_array_imp<Tuple, N-1>::unpack(o, t);
|
|
||||||
const size_t size = o.via.array.size;
|
|
||||||
if(size <= N-1) { return; }
|
|
||||||
o.via.array.ptr[N-1].convert(std::get<N-1>(t));
|
|
||||||
}
|
|
||||||
static void object(msgpack::object* o, msgpack::zone& z, Tuple const& t) {
|
|
||||||
define_array_imp<Tuple, N-1>::object(o, z, t);
|
|
||||||
o->via.array.ptr[N-1] = msgpack::object(std::get<N-1>(t), z);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Tuple>
|
|
||||||
struct define_array_imp<Tuple, 1> {
|
|
||||||
template <typename Packer>
|
|
||||||
static void pack(Packer& pk, Tuple const& t) {
|
|
||||||
pk.pack(std::get<0>(t));
|
|
||||||
}
|
|
||||||
static void unpack(msgpack::object const& o, Tuple& t) {
|
|
||||||
const size_t size = o.via.array.size;
|
|
||||||
if(size <= 0) { return; }
|
|
||||||
o.via.array.ptr[0].convert(std::get<0>(t));
|
|
||||||
}
|
|
||||||
static void object(msgpack::object* o, msgpack::zone& z, Tuple const& t) {
|
|
||||||
o->via.array.ptr[0] = msgpack::object(std::get<0>(t), z);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename... Args>
|
|
||||||
struct define_array {
|
|
||||||
typedef define_array<Args...> value_type;
|
|
||||||
typedef std::tuple<Args...> tuple_type;
|
|
||||||
define_array(Args&... args) :
|
|
||||||
a(args...) {}
|
|
||||||
template <typename Packer>
|
|
||||||
void msgpack_pack(Packer& pk) const
|
|
||||||
{
|
|
||||||
pk.pack_array(sizeof...(Args));
|
|
||||||
|
|
||||||
define_array_imp<std::tuple<Args&...>, sizeof...(Args)>::pack(pk, a);
|
|
||||||
}
|
|
||||||
void msgpack_unpack(msgpack::object const& o)
|
|
||||||
{
|
|
||||||
if(o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
|
|
||||||
|
|
||||||
define_array_imp<std::tuple<Args&...>, sizeof...(Args)>::unpack(o, a);
|
|
||||||
}
|
|
||||||
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)*sizeof...(Args)));
|
|
||||||
o->via.array.size = sizeof...(Args);
|
|
||||||
|
|
||||||
define_array_imp<std::tuple<Args&...>, sizeof...(Args)>::object(o, z, a);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::tuple<Args&...> a;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct define_array<> {
|
|
||||||
typedef define_array<> value_type;
|
|
||||||
typedef std::tuple<> tuple_type;
|
|
||||||
template <typename Packer>
|
|
||||||
void msgpack_pack(Packer& pk) const
|
|
||||||
{
|
|
||||||
pk.pack_array(0);
|
|
||||||
}
|
|
||||||
void msgpack_unpack(msgpack::object const& o)
|
|
||||||
{
|
|
||||||
if(o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
|
|
||||||
}
|
|
||||||
void msgpack_object(msgpack::object* o, msgpack::zone&) const
|
|
||||||
{
|
|
||||||
o->type = msgpack::type::ARRAY;
|
|
||||||
o->via.array.ptr = NULL;
|
|
||||||
o->via.array.size = 0;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
inline define_array<> make_define_array()
|
|
||||||
{
|
|
||||||
return define_array<>();
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename... Args>
|
|
||||||
inline define_array<Args...> make_define_array(Args&... args)
|
|
||||||
{
|
|
||||||
return define_array<Args...>(args...);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace type
|
|
||||||
/// @cond
|
|
||||||
} // MSGPACK_API_VERSION_NAMESPACE(v1)
|
|
||||||
/// @endcond
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
#endif // MSGPACK_CPP11_DEFINE_ARRAY_HPP
|
|
||||||
@@ -1,163 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// 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_CPP11_DEFINE_MAP_HPP
|
|
||||||
#define MSGPACK_CPP11_DEFINE_MAP_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/adaptor_base.hpp"
|
|
||||||
|
|
||||||
// for MSGPACK_ADD_ENUM
|
|
||||||
#include "msgpack/adaptor/int.hpp"
|
|
||||||
|
|
||||||
#include <type_traits>
|
|
||||||
#include <tuple>
|
|
||||||
|
|
||||||
#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
|
|
||||||
MSGPACK_API_VERSION_NAMESPACE(v1) {
|
|
||||||
/// @endcond
|
|
||||||
namespace type {
|
|
||||||
|
|
||||||
template <typename Tuple, std::size_t N>
|
|
||||||
struct define_map_imp {
|
|
||||||
template <typename Packer>
|
|
||||||
static void pack(Packer& pk, Tuple const& t) {
|
|
||||||
define_map_imp<Tuple, N-1>::pack(pk, t);
|
|
||||||
pk.pack(std::get<N-1>(t));
|
|
||||||
}
|
|
||||||
static void unpack(
|
|
||||||
msgpack::object const& o, Tuple const& t,
|
|
||||||
std::map<std::string, msgpack::object const*> const& kvmap) {
|
|
||||||
define_map_imp<Tuple, N-2>::unpack(o, t, kvmap);
|
|
||||||
auto it = kvmap.find(std::get<N-2>(t));
|
|
||||||
if (it != kvmap.end()) {
|
|
||||||
it->second->convert(std::get<N-1>(t));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
static void object(msgpack::object* o, msgpack::zone& z, Tuple const& t) {
|
|
||||||
define_map_imp<Tuple, N-2>::object(o, z, t);
|
|
||||||
o->via.map.ptr[(N-1)/2].key = msgpack::object(std::get<N-2>(t), z);
|
|
||||||
o->via.map.ptr[(N-1)/2].val = msgpack::object(std::get<N-1>(t), z);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Tuple>
|
|
||||||
struct define_map_imp<Tuple, 0> {
|
|
||||||
template <typename Packer>
|
|
||||||
static void pack(Packer&, Tuple const&) {}
|
|
||||||
static void unpack(
|
|
||||||
msgpack::object const&, Tuple const&,
|
|
||||||
std::map<std::string, msgpack::object const*> const&) {}
|
|
||||||
static void object(msgpack::object*, msgpack::zone&, Tuple const&) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename... Args>
|
|
||||||
struct define_map {
|
|
||||||
define_map(Args&... args) :
|
|
||||||
a(args...) {}
|
|
||||||
template <typename Packer>
|
|
||||||
void msgpack_pack(Packer& pk) const
|
|
||||||
{
|
|
||||||
static_assert(sizeof...(Args) % 2 == 0, "");
|
|
||||||
pk.pack_map(sizeof...(Args) / 2);
|
|
||||||
|
|
||||||
define_map_imp<std::tuple<Args&...>, sizeof...(Args)>::pack(pk, a);
|
|
||||||
}
|
|
||||||
void msgpack_unpack(msgpack::object const& o) const
|
|
||||||
{
|
|
||||||
if(o.type != msgpack::type::MAP) { throw msgpack::type_error(); }
|
|
||||||
std::map<std::string, msgpack::object const*> kvmap;
|
|
||||||
for (uint32_t i = 0; i < o.via.map.size; ++i) {
|
|
||||||
kvmap.emplace(
|
|
||||||
std::string(
|
|
||||||
o.via.map.ptr[i].key.via.str.ptr,
|
|
||||||
o.via.map.ptr[i].key.via.str.size),
|
|
||||||
&o.via.map.ptr[i].val);
|
|
||||||
}
|
|
||||||
define_map_imp<std::tuple<Args&...>, sizeof...(Args)>::unpack(o, a, kvmap);
|
|
||||||
}
|
|
||||||
void msgpack_object(msgpack::object* o, msgpack::zone& z) const
|
|
||||||
{
|
|
||||||
static_assert(sizeof...(Args) % 2 == 0, "");
|
|
||||||
o->type = msgpack::type::MAP;
|
|
||||||
o->via.map.ptr = static_cast<msgpack::object_kv*>(z.allocate_align(sizeof(msgpack::object_kv)*sizeof...(Args)/2));
|
|
||||||
o->via.map.size = sizeof...(Args) / 2;
|
|
||||||
|
|
||||||
define_map_imp<std::tuple<Args&...>, sizeof...(Args)>::object(o, z, a);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::tuple<Args&...> a;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
template <typename... Args>
|
|
||||||
define_map<Args...> make_define_map(Args&... args)
|
|
||||||
{
|
|
||||||
return define_map<Args...>(args...);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace type
|
|
||||||
/// @cond
|
|
||||||
} // MSGPACK_API_VERSION_NAMESPACE(v1)
|
|
||||||
/// @endcond
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
#endif // MSGPACK_CPP11_DEFINE_MAP_HPP
|
|
||||||
@@ -1,276 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2015 FURUHASHI Sadayuki and KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Distributed under the Boost Software License, Version 1.0.
|
|
||||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
|
||||||
// http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
//
|
|
||||||
#ifndef MSGPACK_CPP11_MSGPACK_TUPLE_HPP
|
|
||||||
#define MSGPACK_CPP11_MSGPACK_TUPLE_HPP
|
|
||||||
|
|
||||||
#include "msgpack/versioning.hpp"
|
|
||||||
#include "msgpack/object_fwd.hpp"
|
|
||||||
#include "msgpack/meta.hpp"
|
|
||||||
|
|
||||||
#include <tuple>
|
|
||||||
|
|
||||||
namespace msgpack {
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
MSGPACK_API_VERSION_NAMESPACE(v1) {
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
namespace type {
|
|
||||||
// tuple
|
|
||||||
using std::get;
|
|
||||||
using std::tuple_size;
|
|
||||||
using std::tuple_element;
|
|
||||||
using std::uses_allocator;
|
|
||||||
using std::ignore;
|
|
||||||
using std::swap;
|
|
||||||
|
|
||||||
template< class... Types >
|
|
||||||
class tuple : public std::tuple<Types...> {
|
|
||||||
public:
|
|
||||||
using base = std::tuple<Types...>;
|
|
||||||
|
|
||||||
|
|
||||||
tuple(tuple const&) = default;
|
|
||||||
tuple(tuple&&) = default;
|
|
||||||
|
|
||||||
template<typename... OtherTypes>
|
|
||||||
tuple(OtherTypes&&... other):base(std::forward<OtherTypes>(other)...) {}
|
|
||||||
|
|
||||||
template<typename... OtherTypes>
|
|
||||||
tuple(tuple<OtherTypes...> const& other):base(static_cast<std::tuple<OtherTypes...> const&>(other)) {}
|
|
||||||
template<typename... OtherTypes>
|
|
||||||
tuple(tuple<OtherTypes...> && other):base(static_cast<std::tuple<OtherTypes...> &&>(other)) {}
|
|
||||||
|
|
||||||
tuple& operator=(tuple const&) = default;
|
|
||||||
tuple& operator=(tuple&&) = default;
|
|
||||||
|
|
||||||
template<typename... OtherTypes>
|
|
||||||
tuple& operator=(tuple<OtherTypes...> const& other) {
|
|
||||||
*static_cast<base*>(this) = static_cast<std::tuple<OtherTypes...> const&>(other);
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
template<typename... OtherTypes>
|
|
||||||
tuple& operator=(tuple<OtherTypes...> && other) {
|
|
||||||
*static_cast<base*>(this) = static_cast<std::tuple<OtherTypes...> &&>(other);
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
template< std::size_t I>
|
|
||||||
typename tuple_element<I, base >::type&
|
|
||||||
get() & { return std::get<I>(*this); }
|
|
||||||
|
|
||||||
template< std::size_t I>
|
|
||||||
typename tuple_element<I, base >::type const&
|
|
||||||
get() const& { return std::get<I>(*this); }
|
|
||||||
|
|
||||||
template< std::size_t I>
|
|
||||||
typename tuple_element<I, base >::type&&
|
|
||||||
get() && { return std::get<I>(*this); }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class... Args>
|
|
||||||
inline tuple<Args...> make_tuple(Args&&... args) {
|
|
||||||
return tuple<Args...>(args...);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<class... Args>
|
|
||||||
inline tuple<Args&&...> forward_as_tuple (Args&&... args) noexcept {
|
|
||||||
return tuple<Args&&...>(std::forward<Args>(args)...);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class... Tuples>
|
|
||||||
inline auto tuple_cat(Tuples&&... args) ->
|
|
||||||
decltype(
|
|
||||||
std::tuple_cat(std::forward<typename std::remove_reference<Tuples>::type::base>(args)...)
|
|
||||||
) {
|
|
||||||
return std::tuple_cat(std::forward<typename std::remove_reference<Tuples>::type::base>(args)...);
|
|
||||||
}
|
|
||||||
template <class... Args>
|
|
||||||
inline tuple<Args&...> tie(Args&... args) {
|
|
||||||
return tuple<Args&...>(args...);
|
|
||||||
}
|
|
||||||
} // namespace type
|
|
||||||
|
|
||||||
// --- Pack from tuple to packer stream ---
|
|
||||||
template <typename Stream, typename Tuple, std::size_t N>
|
|
||||||
struct MsgpackTuplePacker {
|
|
||||||
static void pack(
|
|
||||||
msgpack::packer<Stream>& o,
|
|
||||||
const Tuple& v) {
|
|
||||||
MsgpackTuplePacker<Stream, Tuple, N-1>::pack(o, v);
|
|
||||||
o.pack(type::get<N-1>(v));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Stream, typename Tuple>
|
|
||||||
struct MsgpackTuplePacker<Stream, Tuple, 1> {
|
|
||||||
static void pack (
|
|
||||||
msgpack::packer<Stream>& o,
|
|
||||||
const Tuple& v) {
|
|
||||||
o.pack(type::get<0>(v));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Stream, typename Tuple>
|
|
||||||
struct MsgpackTuplePacker<Stream, Tuple, 0> {
|
|
||||||
static void pack (
|
|
||||||
msgpack::packer<Stream>&,
|
|
||||||
const Tuple&) {
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
namespace adaptor {
|
|
||||||
|
|
||||||
template <typename... Args>
|
|
||||||
struct pack<msgpack::type::tuple<Args...>> {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(
|
|
||||||
msgpack::packer<Stream>& o,
|
|
||||||
const msgpack::type::tuple<Args...>& v) const {
|
|
||||||
o.pack_array(sizeof...(Args));
|
|
||||||
MsgpackTuplePacker<Stream, decltype(v), sizeof...(Args)>::pack(o, v);
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace adaptor
|
|
||||||
|
|
||||||
// --- Convert from tuple to object ---
|
|
||||||
|
|
||||||
template <typename... Args>
|
|
||||||
struct MsgpackTupleAs;
|
|
||||||
|
|
||||||
template <typename T, typename... Args>
|
|
||||||
struct MsgpackTupleAsImpl {
|
|
||||||
static msgpack::type::tuple<T, Args...> as(msgpack::object const& o) {
|
|
||||||
return msgpack::type::tuple_cat(
|
|
||||||
msgpack::type::make_tuple(o.via.array.ptr[o.via.array.size - sizeof...(Args) - 1].as<T>()),
|
|
||||||
MsgpackTupleAs<Args...>::as(o));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename... Args>
|
|
||||||
struct MsgpackTupleAs {
|
|
||||||
static msgpack::type::tuple<Args...> as(msgpack::object const& o) {
|
|
||||||
return MsgpackTupleAsImpl<Args...>::as(o);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct MsgpackTupleAs<> {
|
|
||||||
static msgpack::type::tuple<> as (msgpack::object const&) {
|
|
||||||
return msgpack::type::tuple<>();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Tuple, std::size_t N>
|
|
||||||
struct MsgpackTupleConverter {
|
|
||||||
static void convert(
|
|
||||||
msgpack::object const& o,
|
|
||||||
Tuple& v) {
|
|
||||||
MsgpackTupleConverter<Tuple, N-1>::convert(o, v);
|
|
||||||
o.via.array.ptr[N-1].convert<typename std::remove_reference<decltype(type::get<N-1>(v))>::type>(type::get<N-1>(v));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Tuple>
|
|
||||||
struct MsgpackTupleConverter<Tuple, 1> {
|
|
||||||
static void convert (
|
|
||||||
msgpack::object const& o,
|
|
||||||
Tuple& v) {
|
|
||||||
o.via.array.ptr[0].convert<typename std::remove_reference<decltype(type::get<0>(v))>::type>(type::get<0>(v));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Tuple>
|
|
||||||
struct MsgpackTupleConverter<Tuple, 0> {
|
|
||||||
static void convert (
|
|
||||||
msgpack::object const&,
|
|
||||||
Tuple&) {
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
namespace adaptor {
|
|
||||||
|
|
||||||
template <typename... Args>
|
|
||||||
struct as<msgpack::type::tuple<Args...>, typename std::enable_if<msgpack::all_of<msgpack::has_as, Args...>::value>::type> {
|
|
||||||
msgpack::type::tuple<Args...> operator()(
|
|
||||||
msgpack::object const& o) const {
|
|
||||||
if (o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
|
|
||||||
if (o.via.array.size < sizeof...(Args)) { throw msgpack::type_error(); }
|
|
||||||
return MsgpackTupleAs<Args...>::as(o);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename... Args>
|
|
||||||
struct convert<msgpack::type::tuple<Args...>> {
|
|
||||||
msgpack::object const& operator()(
|
|
||||||
msgpack::object const& o,
|
|
||||||
msgpack::type::tuple<Args...>& v) const {
|
|
||||||
if(o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
|
|
||||||
if(o.via.array.size < sizeof...(Args)) { throw msgpack::type_error(); }
|
|
||||||
MsgpackTupleConverter<decltype(v), sizeof...(Args)>::convert(o, v);
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace adaptor
|
|
||||||
|
|
||||||
// --- Convert from tuple to object with zone ---
|
|
||||||
template <typename Tuple, std::size_t N>
|
|
||||||
struct MsgpackTupleToObjectWithZone {
|
|
||||||
static void convert(
|
|
||||||
msgpack::object::with_zone& o,
|
|
||||||
const Tuple& v) {
|
|
||||||
MsgpackTupleToObjectWithZone<Tuple, N-1>::convert(o, v);
|
|
||||||
o.via.array.ptr[N-1] = msgpack::object(type::get<N-1>(v), o.zone);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Tuple>
|
|
||||||
struct MsgpackTupleToObjectWithZone<Tuple, 1> {
|
|
||||||
static void convert (
|
|
||||||
msgpack::object::with_zone& o,
|
|
||||||
const Tuple& v) {
|
|
||||||
o.via.array.ptr[0] = msgpack::object(type::get<0>(v), o.zone);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Tuple>
|
|
||||||
struct MsgpackTupleToObjectWithZone<Tuple, 0> {
|
|
||||||
static void convert (
|
|
||||||
msgpack::object::with_zone&,
|
|
||||||
const Tuple&) {
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
namespace adaptor {
|
|
||||||
|
|
||||||
template <typename... Args>
|
|
||||||
struct object_with_zone<msgpack::type::tuple<Args...>> {
|
|
||||||
void operator()(
|
|
||||||
msgpack::object::with_zone& o,
|
|
||||||
msgpack::type::tuple<Args...> const& v) const {
|
|
||||||
o.type = msgpack::type::ARRAY;
|
|
||||||
o.via.array.ptr = static_cast<msgpack::object*>(o.zone.allocate_align(sizeof(msgpack::object)*sizeof...(Args)));
|
|
||||||
o.via.array.size = sizeof...(Args);
|
|
||||||
MsgpackTupleToObjectWithZone<decltype(v), sizeof...(Args)>::convert(o, v);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace adaptor
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
} // MSGPACK_API_VERSION_NAMESPACE(v1)
|
|
||||||
///@endcond
|
|
||||||
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
#endif // MSGPACK_CPP11_MSGPACK_TUPLE_HPP
|
|
||||||
@@ -1,237 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2015 KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Distributed under the Boost Software License, Version 1.0.
|
|
||||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
|
||||||
// http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
//
|
|
||||||
#ifndef MSGPACK_TYPE_EXT_HPP
|
|
||||||
#define MSGPACK_TYPE_EXT_HPP
|
|
||||||
|
|
||||||
#include "msgpack/versioning.hpp"
|
|
||||||
#include "msgpack/adaptor/adaptor_base.hpp"
|
|
||||||
#include <cstring>
|
|
||||||
#include <string>
|
|
||||||
#include <cassert>
|
|
||||||
|
|
||||||
namespace msgpack {
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
MSGPACK_API_VERSION_NAMESPACE(v1) {
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
namespace type {
|
|
||||||
class ext_ref;
|
|
||||||
|
|
||||||
class ext {
|
|
||||||
public:
|
|
||||||
ext() : m_data(1, 0) {}
|
|
||||||
ext(int8_t t, const char* p, uint32_t s) {
|
|
||||||
detail::check_container_size_for_ext<sizeof(std::size_t)>(s);
|
|
||||||
m_data.reserve(static_cast<std::size_t>(s) + 1);
|
|
||||||
m_data.push_back(static_cast<char>(t));
|
|
||||||
m_data.insert(m_data.end(), p, p + s);
|
|
||||||
}
|
|
||||||
ext(int8_t t, uint32_t s) {
|
|
||||||
detail::check_container_size_for_ext<sizeof(std::size_t)>(s);
|
|
||||||
m_data.resize(static_cast<std::size_t>(s) + 1);
|
|
||||||
m_data[0] = static_cast<char>(t);
|
|
||||||
}
|
|
||||||
ext(ext_ref const&);
|
|
||||||
int8_t type() const {
|
|
||||||
return static_cast<int8_t>(m_data[0]);
|
|
||||||
}
|
|
||||||
const char* data() const {
|
|
||||||
return &m_data[1];
|
|
||||||
}
|
|
||||||
char* data() {
|
|
||||||
return &m_data[1];
|
|
||||||
}
|
|
||||||
uint32_t size() const {
|
|
||||||
return static_cast<uint32_t>(m_data.size()) - 1;
|
|
||||||
}
|
|
||||||
bool operator== (const ext& x) const {
|
|
||||||
return m_data == x.m_data;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator!= (const ext& x) const {
|
|
||||||
return !(*this == x);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator< (const ext& x) const {
|
|
||||||
return m_data < x.m_data;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator> (const ext& x) const {
|
|
||||||
return m_data > x.m_data;
|
|
||||||
}
|
|
||||||
private:
|
|
||||||
std::vector<char> m_data;
|
|
||||||
friend class ext_ref;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace type
|
|
||||||
|
|
||||||
namespace adaptor {
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct convert<msgpack::type::ext> {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, msgpack::type::ext& v) const {
|
|
||||||
if(o.type != msgpack::type::EXT) {
|
|
||||||
throw msgpack::type_error();
|
|
||||||
}
|
|
||||||
v = msgpack::type::ext(o.via.ext.type(), o.via.ext.data(), o.via.ext.size);
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct pack<msgpack::type::ext> {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const msgpack::type::ext& v) const {
|
|
||||||
// size limit has already been checked at ext's constructor
|
|
||||||
uint32_t size = v.size();
|
|
||||||
o.pack_ext(size, v.type());
|
|
||||||
o.pack_ext_body(v.data(), size);
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object_with_zone<msgpack::type::ext> {
|
|
||||||
void operator()(msgpack::object::with_zone& o, const msgpack::type::ext& v) const {
|
|
||||||
// size limit has already been checked at ext's constructor
|
|
||||||
uint32_t size = v.size();
|
|
||||||
o.type = msgpack::type::EXT;
|
|
||||||
char* ptr = static_cast<char*>(o.zone.allocate_align(size + 1));
|
|
||||||
o.via.ext.ptr = ptr;
|
|
||||||
o.via.ext.size = size;
|
|
||||||
ptr[0] = static_cast<char>(v.type());
|
|
||||||
std::memcpy(ptr + 1, v.data(), size);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace adaptor
|
|
||||||
|
|
||||||
namespace type {
|
|
||||||
|
|
||||||
class ext_ref {
|
|
||||||
public:
|
|
||||||
// ext_ref should be default constructible to support 'convert'.
|
|
||||||
// A default constructed ext_ref object::m_ptr doesn't have the buffer to point to.
|
|
||||||
// In order to avoid nullptr checking branches, m_ptr points to m_size.
|
|
||||||
// So type() returns unspecified but valid value. It might be a zero because m_size
|
|
||||||
// is initialized as zero, but shouldn't assume that.
|
|
||||||
ext_ref() : m_ptr(static_cast<char*>(static_cast<void*>(&m_size))), m_size(0) {}
|
|
||||||
ext_ref(const char* p, uint32_t s) :
|
|
||||||
m_ptr(s == 0 ? static_cast<char*>(static_cast<void*>(&m_size)) : p),
|
|
||||||
m_size(s == 0 ? 0 : s - 1) {
|
|
||||||
detail::check_container_size_for_ext<sizeof(std::size_t)>(s);
|
|
||||||
}
|
|
||||||
|
|
||||||
// size limit has already been checked at ext's constructor
|
|
||||||
ext_ref(ext const& x) : m_ptr(&x.m_data[0]), m_size(x.size()) {}
|
|
||||||
|
|
||||||
const char* data() const {
|
|
||||||
return m_ptr + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t size() const {
|
|
||||||
return m_size;
|
|
||||||
}
|
|
||||||
|
|
||||||
int8_t type() const {
|
|
||||||
return static_cast<int8_t>(m_ptr[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string str() const {
|
|
||||||
return std::string(m_ptr + 1, m_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator== (const ext_ref& x) const {
|
|
||||||
return m_size == x.m_size && std::memcmp(m_ptr, x.m_ptr, m_size) == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator!= (const ext_ref& x) const {
|
|
||||||
return !(*this == x);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator< (const ext_ref& x) const {
|
|
||||||
if (m_size < x.m_size) return true;
|
|
||||||
if (m_size > x.m_size) return false;
|
|
||||||
return std::memcmp(m_ptr, x.m_ptr, m_size) < 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator> (const ext_ref& x) const {
|
|
||||||
if (m_size > x.m_size) return true;
|
|
||||||
if (m_size < x.m_size) return false;
|
|
||||||
return std::memcmp(m_ptr, x.m_ptr, m_size) > 0;
|
|
||||||
}
|
|
||||||
private:
|
|
||||||
const char* m_ptr;
|
|
||||||
uint32_t m_size;
|
|
||||||
friend struct msgpack::adaptor::object<msgpack::type::ext_ref>;
|
|
||||||
};
|
|
||||||
|
|
||||||
inline ext::ext(ext_ref const& x) {
|
|
||||||
// size limit has already been checked at ext_ref's constructor
|
|
||||||
m_data.reserve(x.size() + 1);
|
|
||||||
|
|
||||||
m_data.push_back(x.type());
|
|
||||||
m_data.insert(m_data.end(), x.data(), x.data() + x.size());
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace type
|
|
||||||
|
|
||||||
namespace adaptor {
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct convert<msgpack::type::ext_ref> {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, msgpack::type::ext_ref& v) const {
|
|
||||||
if(o.type != msgpack::type::EXT) { throw msgpack::type_error(); }
|
|
||||||
v = msgpack::type::ext_ref(o.via.ext.ptr, o.via.ext.size + 1);
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct pack<msgpack::type::ext_ref> {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const msgpack::type::ext_ref& v) const {
|
|
||||||
// size limit has already been checked at ext_ref's constructor
|
|
||||||
uint32_t size = v.size();
|
|
||||||
o.pack_ext(size, v.type());
|
|
||||||
o.pack_ext_body(v.data(), size);
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object<msgpack::type::ext_ref> {
|
|
||||||
void operator()(msgpack::object& o, const msgpack::type::ext_ref& v) const {
|
|
||||||
// size limit has already been checked at ext_ref's constructor
|
|
||||||
uint32_t size = v.size();
|
|
||||||
o.type = msgpack::type::EXT;
|
|
||||||
o.via.ext.ptr = v.m_ptr;
|
|
||||||
o.via.ext.size = size;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object_with_zone<msgpack::type::ext_ref> {
|
|
||||||
void operator()(msgpack::object::with_zone& o, const msgpack::type::ext_ref& v) const {
|
|
||||||
static_cast<msgpack::object&>(o) << v;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace adaptor
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
} // MSGPACK_API_VERSION_NAMESPACE(v1)
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
#endif // MSGPACK_TYPE_EXT_HPP
|
|
||||||
@@ -1,298 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2020 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_TYPE_FIXINT_HPP
|
|
||||||
#define MSGPACK_TYPE_FIXINT_HPP
|
|
||||||
|
|
||||||
#include "msgpack/versioning.hpp"
|
|
||||||
#include "msgpack/adaptor/adaptor_base.hpp"
|
|
||||||
#include "msgpack/adaptor/int.hpp"
|
|
||||||
|
|
||||||
namespace msgpack {
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
MSGPACK_API_VERSION_NAMESPACE(v1) {
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
namespace type {
|
|
||||||
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct fix_int {
|
|
||||||
fix_int() : value(0) { }
|
|
||||||
fix_int(T value) : value(value) { }
|
|
||||||
|
|
||||||
operator T() const { return value; }
|
|
||||||
|
|
||||||
T get() const { return value; }
|
|
||||||
|
|
||||||
private:
|
|
||||||
T value;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
typedef fix_int<uint8_t> fix_uint8;
|
|
||||||
typedef fix_int<uint16_t> fix_uint16;
|
|
||||||
typedef fix_int<uint32_t> fix_uint32;
|
|
||||||
typedef fix_int<uint64_t> fix_uint64;
|
|
||||||
|
|
||||||
typedef fix_int<int8_t> fix_int8;
|
|
||||||
typedef fix_int<int16_t> fix_int16;
|
|
||||||
typedef fix_int<int32_t> fix_int32;
|
|
||||||
typedef fix_int<int64_t> fix_int64;
|
|
||||||
|
|
||||||
|
|
||||||
} // namespace type
|
|
||||||
|
|
||||||
namespace adaptor {
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct convert<type::fix_int8> {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, type::fix_int8& v) const
|
|
||||||
{ v = type::detail::convert_integer<int8_t>(o); return o; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct convert<type::fix_int16> {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, type::fix_int16& v) const
|
|
||||||
{ v = type::detail::convert_integer<int16_t>(o); return o; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct convert<type::fix_int32> {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, type::fix_int32& v) const
|
|
||||||
{ v = type::detail::convert_integer<int32_t>(o); return o; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct convert<type::fix_int64> {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, type::fix_int64& v) const
|
|
||||||
{ v = type::detail::convert_integer<int64_t>(o); return o; }
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct convert<type::fix_uint8> {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, type::fix_uint8& v) const
|
|
||||||
{ v = type::detail::convert_integer<uint8_t>(o); return o; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct convert<type::fix_uint16> {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, type::fix_uint16& v) const
|
|
||||||
{ v = type::detail::convert_integer<uint16_t>(o); return o; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct convert<type::fix_uint32> {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, type::fix_uint32& v) const
|
|
||||||
{ v = type::detail::convert_integer<uint32_t>(o); return o; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct convert<type::fix_uint64> {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, type::fix_uint64& v) const
|
|
||||||
{ v = type::detail::convert_integer<uint64_t>(o); return o; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct pack<type::fix_int8> {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const type::fix_int8& v) const
|
|
||||||
{ o.pack_fix_int8(v); return o; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct pack<type::fix_int16> {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const type::fix_int16& v) const
|
|
||||||
{ o.pack_fix_int16(v); return o; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct pack<type::fix_int32> {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const type::fix_int32& v) const
|
|
||||||
{ o.pack_fix_int32(v); return o; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct pack<type::fix_int64> {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const type::fix_int64& v) const
|
|
||||||
{ o.pack_fix_int64(v); return o; }
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct pack<type::fix_uint8> {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const type::fix_uint8& v) const
|
|
||||||
{ o.pack_fix_uint8(v); return o; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct pack<type::fix_uint16> {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const type::fix_uint16& v) const
|
|
||||||
{ o.pack_fix_uint16(v); return o; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct pack<type::fix_uint32> {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const type::fix_uint32& v) const
|
|
||||||
{ o.pack_fix_uint32(v); return o; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct pack<type::fix_uint64> {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const type::fix_uint64& v) const
|
|
||||||
{ o.pack_fix_uint64(v); return o; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object<type::fix_int8> {
|
|
||||||
void operator()(msgpack::object& o, type::fix_int8 v) const {
|
|
||||||
if (v.get() < 0) {
|
|
||||||
o.type = msgpack::type::NEGATIVE_INTEGER;
|
|
||||||
o.via.i64 = v.get();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
o.type = msgpack::type::POSITIVE_INTEGER;
|
|
||||||
o.via.u64 = v.get();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object<type::fix_int16> {
|
|
||||||
void operator()(msgpack::object& o, type::fix_int16 v) const {
|
|
||||||
if(v.get() < 0) {
|
|
||||||
o.type = msgpack::type::NEGATIVE_INTEGER;
|
|
||||||
o.via.i64 = v.get();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
o.type = msgpack::type::POSITIVE_INTEGER;
|
|
||||||
o.via.u64 = v.get();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object<type::fix_int32> {
|
|
||||||
void operator()(msgpack::object& o, type::fix_int32 v) const {
|
|
||||||
if (v.get() < 0) {
|
|
||||||
o.type = msgpack::type::NEGATIVE_INTEGER;
|
|
||||||
o.via.i64 = v.get();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
o.type = msgpack::type::POSITIVE_INTEGER;
|
|
||||||
o.via.u64 = v.get();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object<type::fix_int64> {
|
|
||||||
void operator()(msgpack::object& o, type::fix_int64 v) const {
|
|
||||||
if (v.get() < 0) {
|
|
||||||
o.type = msgpack::type::NEGATIVE_INTEGER;
|
|
||||||
o.via.i64 = v.get();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
o.type = msgpack::type::POSITIVE_INTEGER;
|
|
||||||
o.via.u64 = v.get();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object<type::fix_uint8> {
|
|
||||||
void operator()(msgpack::object& o, type::fix_uint8 v) const
|
|
||||||
{ o.type = msgpack::type::POSITIVE_INTEGER, o.via.u64 = v.get(); }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object<type::fix_uint16> {
|
|
||||||
void operator()(msgpack::object& o, type::fix_uint16 v) const
|
|
||||||
{ o.type = msgpack::type::POSITIVE_INTEGER, o.via.u64 = v.get(); }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object<type::fix_uint32> {
|
|
||||||
void operator()(msgpack::object& o, type::fix_uint32 v) const
|
|
||||||
{ o.type = msgpack::type::POSITIVE_INTEGER, o.via.u64 = v.get(); }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object<type::fix_uint64> {
|
|
||||||
void operator()(msgpack::object& o, type::fix_uint64 v) const
|
|
||||||
{ o.type = msgpack::type::POSITIVE_INTEGER, o.via.u64 = v.get(); }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object_with_zone<type::fix_int8> {
|
|
||||||
void operator()(msgpack::object::with_zone& o, type::fix_int8 v) const
|
|
||||||
{ static_cast<msgpack::object&>(o) << v; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object_with_zone<type::fix_int16> {
|
|
||||||
void operator()(msgpack::object::with_zone& o, type::fix_int16 v) const
|
|
||||||
{ static_cast<msgpack::object&>(o) << v; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object_with_zone<type::fix_int32> {
|
|
||||||
void operator()(msgpack::object::with_zone& o, type::fix_int32 v) const
|
|
||||||
{ static_cast<msgpack::object&>(o) << v; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object_with_zone<type::fix_int64> {
|
|
||||||
void operator()(msgpack::object::with_zone& o, type::fix_int64 v) const
|
|
||||||
{ static_cast<msgpack::object&>(o) << v; }
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object_with_zone<type::fix_uint8> {
|
|
||||||
void operator()(msgpack::object::with_zone& o, type::fix_uint8 v) const
|
|
||||||
{ static_cast<msgpack::object&>(o) << v; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object_with_zone<type::fix_uint16> {
|
|
||||||
void operator()(msgpack::object::with_zone& o, type::fix_uint16 v) const
|
|
||||||
{ static_cast<msgpack::object&>(o) << v; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object_with_zone<type::fix_uint32> {
|
|
||||||
void operator()(msgpack::object::with_zone& o, type::fix_uint32 v) const
|
|
||||||
{ static_cast<msgpack::object&>(o) << v; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object_with_zone<type::fix_uint64> {
|
|
||||||
void operator()(msgpack::object::with_zone& o, type::fix_uint64 v) const
|
|
||||||
{ static_cast<msgpack::object&>(o) << v; }
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace adaptor
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
} // MSGPACK_API_VERSION_NAMESPACE(v1)
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
#endif /* msgpack/type/fixint.hpp */
|
|
||||||
@@ -1,123 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// 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_TYPE_FLOAT_HPP
|
|
||||||
#define MSGPACK_TYPE_FLOAT_HPP
|
|
||||||
|
|
||||||
#include "msgpack/versioning.hpp"
|
|
||||||
#include "msgpack/object_fwd.hpp"
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
namespace msgpack {
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
MSGPACK_API_VERSION_NAMESPACE(v1) {
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
// FIXME check overflow, underflow
|
|
||||||
|
|
||||||
namespace adaptor {
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct convert<float> {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, float& v) const {
|
|
||||||
if(o.type == msgpack::type::FLOAT) {
|
|
||||||
v = static_cast<float>(o.via.f64);
|
|
||||||
}
|
|
||||||
else if (o.type == msgpack::type::POSITIVE_INTEGER) {
|
|
||||||
v = static_cast<float>(o.via.u64);
|
|
||||||
}
|
|
||||||
else if (o.type == msgpack::type::NEGATIVE_INTEGER) {
|
|
||||||
v = static_cast<float>(o.via.i64);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
throw msgpack::type_error();
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct pack<float> {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const float& v) const {
|
|
||||||
o.pack_float(v);
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct convert<double> {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, double& v) const {
|
|
||||||
if(o.type == msgpack::type::FLOAT) {
|
|
||||||
v = o.via.f64;
|
|
||||||
}
|
|
||||||
else if (o.type == msgpack::type::POSITIVE_INTEGER) {
|
|
||||||
v = static_cast<double>(o.via.u64);
|
|
||||||
}
|
|
||||||
else if (o.type == msgpack::type::NEGATIVE_INTEGER) {
|
|
||||||
v = static_cast<double>(o.via.i64);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
throw msgpack::type_error();
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct pack<double> {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const double& v) const {
|
|
||||||
o.pack_double(v);
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object<float> {
|
|
||||||
void operator()(msgpack::object& o, float v) const {
|
|
||||||
o.type = msgpack::type::FLOAT;
|
|
||||||
o.via.f64 = static_cast<double>(v);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object<double> {
|
|
||||||
void operator()(msgpack::object& o, double v) const {
|
|
||||||
o.type = msgpack::type::FLOAT;
|
|
||||||
o.via.f64 = v;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object_with_zone<float> {
|
|
||||||
void operator()(msgpack::object::with_zone& o, float v) const {
|
|
||||||
static_cast<msgpack::object&>(o) << v;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object_with_zone<double> {
|
|
||||||
void operator()(msgpack::object::with_zone& o, double v) const {
|
|
||||||
static_cast<msgpack::object&>(o) << v;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace adaptor
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
} // MSGPACK_API_VERSION_NAMESPACE(v1)
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
#endif // MSGPACK_TYPE_FLOAT_HPP
|
|
||||||
@@ -1,430 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// 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_TYPE_INT_HPP
|
|
||||||
#define MSGPACK_TYPE_INT_HPP
|
|
||||||
|
|
||||||
#include "msgpack/versioning.hpp"
|
|
||||||
#include "msgpack/adaptor/adaptor_base.hpp"
|
|
||||||
#include <limits>
|
|
||||||
|
|
||||||
namespace msgpack {
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
MSGPACK_API_VERSION_NAMESPACE(v1){
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
namespace type {
|
|
||||||
namespace detail {
|
|
||||||
template <typename T, bool Signed>
|
|
||||||
struct convert_integer_sign;
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct convert_integer_sign<T, true> {
|
|
||||||
static T convert(msgpack::object const& o) {
|
|
||||||
if(o.type == msgpack::type::POSITIVE_INTEGER) {
|
|
||||||
if(o.via.u64 > static_cast<uint64_t>(std::numeric_limits<T>::max()))
|
|
||||||
{ throw msgpack::type_error(); }
|
|
||||||
return static_cast<T>(o.via.u64);
|
|
||||||
} else if(o.type == msgpack::type::NEGATIVE_INTEGER) {
|
|
||||||
if(o.via.i64 < static_cast<int64_t>(std::numeric_limits<T>::min()))
|
|
||||||
{ throw msgpack::type_error(); }
|
|
||||||
return static_cast<T>(o.via.i64);
|
|
||||||
}
|
|
||||||
throw msgpack::type_error();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct convert_integer_sign<T, false> {
|
|
||||||
static T convert(msgpack::object const& o) {
|
|
||||||
if(o.type == msgpack::type::POSITIVE_INTEGER) {
|
|
||||||
if(o.via.u64 > static_cast<uint64_t>(std::numeric_limits<T>::max()))
|
|
||||||
{ throw msgpack::type_error(); }
|
|
||||||
return static_cast<T>(o.via.u64);
|
|
||||||
}
|
|
||||||
throw msgpack::type_error();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct is_signed {
|
|
||||||
static const bool value = std::numeric_limits<T>::is_signed;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
static inline T convert_integer(msgpack::object const& o)
|
|
||||||
{
|
|
||||||
return detail::convert_integer_sign<T, is_signed<T>::value>::convert(o);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <bool Signed>
|
|
||||||
struct object_char_sign;
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object_char_sign<true> {
|
|
||||||
template <typename T>
|
|
||||||
static typename msgpack::enable_if<msgpack::is_same<T, char>::value>::type
|
|
||||||
make(msgpack::object& o, T v) {
|
|
||||||
if (v < 0) {
|
|
||||||
o.type = msgpack::type::NEGATIVE_INTEGER;
|
|
||||||
o.via.i64 = v;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
o.type = msgpack::type::POSITIVE_INTEGER;
|
|
||||||
o.via.u64 = v;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object_char_sign<false> {
|
|
||||||
static void make(msgpack::object& o, char v) {
|
|
||||||
o.type = msgpack::type::POSITIVE_INTEGER, o.via.u64 = v;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
static inline void object_char(msgpack::object& o, char v) {
|
|
||||||
return object_char_sign<is_signed<char>::value>::make(o, v);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace detail
|
|
||||||
} // namespace type
|
|
||||||
|
|
||||||
namespace adaptor {
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct convert<char> {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, char& v) const
|
|
||||||
{ v = type::detail::convert_integer<char>(o); return o; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct convert<signed char> {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, signed char& v) const
|
|
||||||
{ v = type::detail::convert_integer<signed char>(o); return o; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct convert<signed short> {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, signed short& v) const
|
|
||||||
{ v = type::detail::convert_integer<signed short>(o); return o; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct convert<signed int> {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, signed int& v) const
|
|
||||||
{ v = type::detail::convert_integer<signed int>(o); return o; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct convert<signed long> {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, signed long& v) const
|
|
||||||
{ v = type::detail::convert_integer<signed long>(o); return o; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct convert<signed long long> {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, signed long long& v) const
|
|
||||||
{ v = type::detail::convert_integer<signed long long>(o); return o; }
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct convert<unsigned char> {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, unsigned char& v) const
|
|
||||||
{ v = type::detail::convert_integer<unsigned char>(o); return o; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct convert<unsigned short> {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, unsigned short& v) const
|
|
||||||
{ v = type::detail::convert_integer<unsigned short>(o); return o; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct convert<unsigned int> {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, unsigned int& v) const
|
|
||||||
{ v = type::detail::convert_integer<unsigned int>(o); return o; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct convert<unsigned long> {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, unsigned long& v) const
|
|
||||||
{ v = type::detail::convert_integer<unsigned long>(o); return o; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct convert<unsigned long long> {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, unsigned long long& v) const
|
|
||||||
{ v = type::detail::convert_integer<unsigned long long>(o); return o; }
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct pack<char> {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, char v) const
|
|
||||||
{ o.pack_char(v); return o; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct pack<signed char> {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, signed char v) const
|
|
||||||
{ o.pack_signed_char(v); return o; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct pack<signed short> {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, signed short v) const
|
|
||||||
{ o.pack_short(v); return o; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct pack<signed int> {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, signed int v) const
|
|
||||||
{ o.pack_int(v); return o; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct pack<signed long> {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, signed long v) const
|
|
||||||
{ o.pack_long(v); return o; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct pack<signed long long> {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, signed long long v) const
|
|
||||||
{ o.pack_long_long(v); return o; }
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct pack<unsigned char> {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, unsigned char v) const
|
|
||||||
{ o.pack_unsigned_char(v); return o; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct pack<unsigned short> {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, unsigned short v) const
|
|
||||||
{ o.pack_unsigned_short(v); return o; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct pack<unsigned int> {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, unsigned int v) const
|
|
||||||
{ o.pack_unsigned_int(v); return o; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct pack<unsigned long> {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, unsigned long v) const
|
|
||||||
{ o.pack_unsigned_long(v); return o; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct pack<unsigned long long> {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, unsigned long long v) const
|
|
||||||
{ o.pack_unsigned_long_long(v); return o; }
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object<char> {
|
|
||||||
void operator()(msgpack::object& o, char v) const
|
|
||||||
{ type::detail::object_char(o, v); }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object<signed char> {
|
|
||||||
void operator()(msgpack::object& o, signed char v) const {
|
|
||||||
if (v < 0) {
|
|
||||||
o.type = msgpack::type::NEGATIVE_INTEGER;
|
|
||||||
o.via.i64 = v;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
o.type = msgpack::type::POSITIVE_INTEGER;
|
|
||||||
o.via.u64 = v;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object<signed short> {
|
|
||||||
void operator()(msgpack::object& o, signed short v) const {
|
|
||||||
if (v < 0) {
|
|
||||||
o.type = msgpack::type::NEGATIVE_INTEGER;
|
|
||||||
o.via.i64 = v;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
o.type = msgpack::type::POSITIVE_INTEGER;
|
|
||||||
o.via.u64 = v;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object<signed int> {
|
|
||||||
void operator()(msgpack::object& o, signed int v) const {
|
|
||||||
if (v < 0) {
|
|
||||||
o.type = msgpack::type::NEGATIVE_INTEGER;
|
|
||||||
o.via.i64 = v;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
o.type = msgpack::type::POSITIVE_INTEGER;
|
|
||||||
o.via.u64 = v;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object<signed long> {
|
|
||||||
void operator()(msgpack::object& o, signed long v) const {
|
|
||||||
if (v < 0) {
|
|
||||||
o.type = msgpack::type::NEGATIVE_INTEGER;
|
|
||||||
o.via.i64 = v;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
o.type = msgpack::type::POSITIVE_INTEGER;
|
|
||||||
o.via.u64 = v;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object<signed long long> {
|
|
||||||
void operator()(msgpack::object& o, signed long long v) const {
|
|
||||||
if (v < 0) {
|
|
||||||
o.type = msgpack::type::NEGATIVE_INTEGER;
|
|
||||||
o.via.i64 = v;
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
o.type = msgpack::type::POSITIVE_INTEGER;
|
|
||||||
o.via.u64 = v;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object<unsigned char> {
|
|
||||||
void operator()(msgpack::object& o, unsigned char v) const
|
|
||||||
{ o.type = msgpack::type::POSITIVE_INTEGER, o.via.u64 = v; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object<unsigned short> {
|
|
||||||
void operator()(msgpack::object& o, unsigned short v) const
|
|
||||||
{ o.type = msgpack::type::POSITIVE_INTEGER, o.via.u64 = v; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object<unsigned int> {
|
|
||||||
void operator()(msgpack::object& o, unsigned int v) const
|
|
||||||
{ o.type = msgpack::type::POSITIVE_INTEGER, o.via.u64 = v; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object<unsigned long> {
|
|
||||||
void operator()(msgpack::object& o, unsigned long v) const
|
|
||||||
{ o.type = msgpack::type::POSITIVE_INTEGER, o.via.u64 = v; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object<unsigned long long> {
|
|
||||||
void operator()(msgpack::object& o, unsigned long long v) const
|
|
||||||
{ o.type = msgpack::type::POSITIVE_INTEGER, o.via.u64 = v; }
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object_with_zone<char> {
|
|
||||||
void operator()(msgpack::object::with_zone& o, char v) const
|
|
||||||
{ static_cast<msgpack::object&>(o) << v; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object_with_zone<signed char> {
|
|
||||||
void operator()(msgpack::object::with_zone& o, signed char v) const
|
|
||||||
{ static_cast<msgpack::object&>(o) << v; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object_with_zone<signed short> {
|
|
||||||
void operator()(msgpack::object::with_zone& o, signed short v) const
|
|
||||||
{ static_cast<msgpack::object&>(o) << v; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object_with_zone<signed int> {
|
|
||||||
void operator()(msgpack::object::with_zone& o, signed int v) const
|
|
||||||
{ static_cast<msgpack::object&>(o) << v; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object_with_zone<signed long> {
|
|
||||||
void operator()(msgpack::object::with_zone& o, signed long v) const
|
|
||||||
{ static_cast<msgpack::object&>(o) << v; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object_with_zone<signed long long> {
|
|
||||||
void operator()(msgpack::object::with_zone& o, const signed long long& v) const
|
|
||||||
{ static_cast<msgpack::object&>(o) << v; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object_with_zone<unsigned char> {
|
|
||||||
void operator()(msgpack::object::with_zone& o, unsigned char v) const
|
|
||||||
{ static_cast<msgpack::object&>(o) << v; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object_with_zone<unsigned short> {
|
|
||||||
void operator()(msgpack::object::with_zone& o, unsigned short v) const
|
|
||||||
{ static_cast<msgpack::object&>(o) << v; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object_with_zone<unsigned int> {
|
|
||||||
void operator()(msgpack::object::with_zone& o, unsigned int v) const
|
|
||||||
{ static_cast<msgpack::object&>(o) << v; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object_with_zone<unsigned long> {
|
|
||||||
void operator()(msgpack::object::with_zone& o, unsigned long v) const
|
|
||||||
{ static_cast<msgpack::object&>(o) << v; }
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object_with_zone<unsigned long long> {
|
|
||||||
void operator()(msgpack::object::with_zone& o, const unsigned long long& v) const
|
|
||||||
{ static_cast<msgpack::object&>(o) << v; }
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace adaptor
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
} // MSGPACK_API_VERSION_NAMESPACE(v1)
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
#endif /* msgpack/type/int.hpp */
|
|
||||||
@@ -1,106 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2015 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_TYPE_LIST_HPP
|
|
||||||
#define MSGPACK_TYPE_LIST_HPP
|
|
||||||
|
|
||||||
#include "msgpack/versioning.hpp"
|
|
||||||
#include "msgpack/adaptor/adaptor_base.hpp"
|
|
||||||
#include "msgpack/adaptor/check_container_size.hpp"
|
|
||||||
|
|
||||||
#include <list>
|
|
||||||
|
|
||||||
namespace msgpack {
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
MSGPACK_API_VERSION_NAMESPACE(v1) {
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
namespace adaptor {
|
|
||||||
|
|
||||||
#if !defined(MSGPACK_USE_CPP03)
|
|
||||||
|
|
||||||
template <typename T, typename Alloc>
|
|
||||||
struct as<std::list<T, Alloc>, typename std::enable_if<msgpack::has_as<T>::value>::type> {
|
|
||||||
std::list<T, Alloc> operator()(msgpack::object const& o) const {
|
|
||||||
if (o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
|
|
||||||
std::list<T, Alloc> v;
|
|
||||||
msgpack::object* p = o.via.array.ptr;
|
|
||||||
msgpack::object* const pend = o.via.array.ptr + o.via.array.size;
|
|
||||||
for (; p < pend; ++p) {
|
|
||||||
v.push_back(p->as<T>());
|
|
||||||
}
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // !defined(MSGPACK_USE_CPP03)
|
|
||||||
|
|
||||||
template <typename T, typename Alloc>
|
|
||||||
struct convert<std::list<T, Alloc> > {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, std::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;
|
|
||||||
msgpack::object* const pend = o.via.array.ptr + o.via.array.size;
|
|
||||||
typename std::list<T, Alloc>::iterator it = v.begin();
|
|
||||||
for (; p < pend; ++p, ++it) {
|
|
||||||
p->convert(*it);
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T, typename Alloc>
|
|
||||||
struct pack<std::list<T, Alloc> > {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::list<T, Alloc>& v) const {
|
|
||||||
uint32_t size = checked_get_container_size(v.size());
|
|
||||||
o.pack_array(size);
|
|
||||||
for (typename std::list<T, Alloc>::const_iterator it(v.begin()), it_end(v.end());
|
|
||||||
it != it_end; ++it) {
|
|
||||||
o.pack(*it);
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T, typename Alloc>
|
|
||||||
struct object_with_zone<std::list<T, Alloc> > {
|
|
||||||
void operator()(msgpack::object::with_zone& o, const std::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(v.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 std::list<T, Alloc>::const_iterator it(v.begin());
|
|
||||||
do {
|
|
||||||
*p = msgpack::object(*it, o.zone);
|
|
||||||
++p;
|
|
||||||
++it;
|
|
||||||
} while(p < pend);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace adaptor
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
} // MSGPACK_API_VERSION_NAMESPACE(v1)
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
#endif // MSGPACK_TYPE_LIST_HPP
|
|
||||||
@@ -1,316 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2015 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_TYPE_MAP_HPP
|
|
||||||
#define MSGPACK_TYPE_MAP_HPP
|
|
||||||
|
|
||||||
#include "msgpack/versioning.hpp"
|
|
||||||
#include "msgpack/object_fwd.hpp"
|
|
||||||
#include "msgpack/adaptor/check_container_size.hpp"
|
|
||||||
|
|
||||||
#include <map>
|
|
||||||
#include <vector>
|
|
||||||
#include <algorithm>
|
|
||||||
|
|
||||||
namespace msgpack {
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
MSGPACK_API_VERSION_NAMESPACE(v1) {
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
namespace type {
|
|
||||||
|
|
||||||
template <typename K, typename V, typename Compare = std::less<K>, typename Alloc = std::allocator<std::pair<K, V> > >
|
|
||||||
class assoc_vector : public std::vector< std::pair<K, V>, Alloc > {
|
|
||||||
#if !defined(MSGPACK_USE_CPP03)
|
|
||||||
using std::vector<std::pair<K, V>, Alloc>::vector;
|
|
||||||
#endif // !defined(MSGPACK_USE_CPP03)
|
|
||||||
};
|
|
||||||
|
|
||||||
namespace detail {
|
|
||||||
template <typename K, typename V, typename Compare, typename Alloc>
|
|
||||||
struct pair_first_less {
|
|
||||||
bool operator() (const std::pair<K, V>& x, const std::pair<K, V>& y) const
|
|
||||||
{ return Compare()(x.first, y.first); }
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
} //namespace type
|
|
||||||
|
|
||||||
namespace adaptor {
|
|
||||||
|
|
||||||
#if !defined(MSGPACK_USE_CPP03)
|
|
||||||
|
|
||||||
template <typename K, typename V, typename Compare, typename Alloc>
|
|
||||||
struct as<
|
|
||||||
type::assoc_vector<K, V, Compare, Alloc>,
|
|
||||||
typename std::enable_if<msgpack::has_as<K>::value && msgpack::has_as<V>::value>::type> {
|
|
||||||
type::assoc_vector<K, V, Compare, Alloc> operator()(msgpack::object const& o) const {
|
|
||||||
if (o.type != msgpack::type::MAP) { throw msgpack::type_error(); }
|
|
||||||
type::assoc_vector<K, V, Compare, Alloc> v;
|
|
||||||
v.reserve(o.via.map.size);
|
|
||||||
msgpack::object_kv* p = o.via.map.ptr;
|
|
||||||
msgpack::object_kv* const pend = o.via.map.ptr + o.via.map.size;
|
|
||||||
for (; p < pend; ++p) {
|
|
||||||
v.emplace_back(p->key.as<K>(), p->val.as<V>());
|
|
||||||
}
|
|
||||||
std::sort(v.begin(), v.end(), type::detail::pair_first_less<K, V, Compare, Alloc>());
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // !defined(MSGPACK_USE_CPP03)
|
|
||||||
|
|
||||||
template <typename K, typename V, typename Compare, typename Alloc>
|
|
||||||
struct convert<type::assoc_vector<K, V, Compare, Alloc> > {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, type::assoc_vector<K, V, Compare, Alloc>& v) const {
|
|
||||||
if (o.type != msgpack::type::MAP) { throw msgpack::type_error(); }
|
|
||||||
v.resize(o.via.map.size);
|
|
||||||
if (o.via.map.size != 0) {
|
|
||||||
msgpack::object_kv* p = o.via.map.ptr;
|
|
||||||
msgpack::object_kv* const pend = o.via.map.ptr + o.via.map.size;
|
|
||||||
std::pair<K, V>* it(&v.front());
|
|
||||||
for (; p < pend; ++p, ++it) {
|
|
||||||
p->key.convert(it->first);
|
|
||||||
p->val.convert(it->second);
|
|
||||||
}
|
|
||||||
std::sort(v.begin(), v.end(), type::detail::pair_first_less<K, V, Compare, Alloc>());
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename K, typename V, typename Compare, typename Alloc>
|
|
||||||
struct pack<type::assoc_vector<K, V, Compare, Alloc> > {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const type::assoc_vector<K, V, Compare, Alloc>& v) const {
|
|
||||||
uint32_t size = checked_get_container_size(v.size());
|
|
||||||
o.pack_map(size);
|
|
||||||
for (typename type::assoc_vector<K, V, Compare, Alloc>::const_iterator it(v.begin()), it_end(v.end());
|
|
||||||
it != it_end; ++it) {
|
|
||||||
o.pack(it->first);
|
|
||||||
o.pack(it->second);
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename K, typename V, typename Compare, typename Alloc>
|
|
||||||
struct object_with_zone<type::assoc_vector<K, V, Compare, Alloc> > {
|
|
||||||
void operator()(msgpack::object::with_zone& o, const type::assoc_vector<K, V, Compare, Alloc>& v) const {
|
|
||||||
o.type = msgpack::type::MAP;
|
|
||||||
if (v.empty()) {
|
|
||||||
o.via.map.ptr = nullptr;
|
|
||||||
o.via.map.size = 0;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
uint32_t size = checked_get_container_size(v.size());
|
|
||||||
msgpack::object_kv* p = static_cast<msgpack::object_kv*>(o.zone.allocate_align(sizeof(msgpack::object_kv)*size));
|
|
||||||
msgpack::object_kv* const pend = p + size;
|
|
||||||
o.via.map.ptr = p;
|
|
||||||
o.via.map.size = size;
|
|
||||||
typename type::assoc_vector<K, V, Compare, Alloc>::const_iterator it(v.begin());
|
|
||||||
do {
|
|
||||||
p->key = msgpack::object(it->first, o.zone);
|
|
||||||
p->val = msgpack::object(it->second, o.zone);
|
|
||||||
++p;
|
|
||||||
++it;
|
|
||||||
} while(p < pend);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
#if !defined(MSGPACK_USE_CPP03)
|
|
||||||
|
|
||||||
template <typename K, typename V, typename Compare, typename Alloc>
|
|
||||||
struct as<
|
|
||||||
std::map<K, V, Compare, Alloc>,
|
|
||||||
typename std::enable_if<msgpack::has_as<K>::value && msgpack::has_as<V>::value>::type> {
|
|
||||||
std::map<K, V, Compare, Alloc> operator()(msgpack::object const& o) const {
|
|
||||||
if (o.type != msgpack::type::MAP) { throw msgpack::type_error(); }
|
|
||||||
msgpack::object_kv* p(o.via.map.ptr);
|
|
||||||
msgpack::object_kv* const pend(o.via.map.ptr + o.via.map.size);
|
|
||||||
std::map<K, V, Compare, Alloc> v;
|
|
||||||
for (; p != pend; ++p) {
|
|
||||||
v.emplace(p->key.as<K>(), p->val.as<V>());
|
|
||||||
}
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // !defined(MSGPACK_USE_CPP03)
|
|
||||||
|
|
||||||
template <typename K, typename V, typename Compare, typename Alloc>
|
|
||||||
struct convert<std::map<K, V, Compare, Alloc> > {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, std::map<K, V, Compare, Alloc>& v) const {
|
|
||||||
if (o.type != msgpack::type::MAP) { throw msgpack::type_error(); }
|
|
||||||
msgpack::object_kv* p(o.via.map.ptr);
|
|
||||||
msgpack::object_kv* const pend(o.via.map.ptr + o.via.map.size);
|
|
||||||
std::map<K, V, Compare, Alloc> tmp;
|
|
||||||
for (; p != pend; ++p) {
|
|
||||||
K key;
|
|
||||||
p->key.convert(key);
|
|
||||||
#if __cplusplus >= 201103L
|
|
||||||
p->val.convert(tmp[std::move(key)]);
|
|
||||||
#else
|
|
||||||
p->val.convert(tmp[key]);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
#if __cplusplus >= 201103L
|
|
||||||
v = std::move(tmp);
|
|
||||||
#else
|
|
||||||
tmp.swap(v);
|
|
||||||
#endif
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename K, typename V, typename Compare, typename Alloc>
|
|
||||||
struct pack<std::map<K, V, Compare, Alloc> > {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::map<K, V, Compare, Alloc>& v) const {
|
|
||||||
uint32_t size = checked_get_container_size(v.size());
|
|
||||||
o.pack_map(size);
|
|
||||||
for (typename std::map<K, V, Compare, Alloc>::const_iterator it(v.begin()), it_end(v.end());
|
|
||||||
it != it_end; ++it) {
|
|
||||||
o.pack(it->first);
|
|
||||||
o.pack(it->second);
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename K, typename V, typename Compare, typename Alloc>
|
|
||||||
struct object_with_zone<std::map<K, V, Compare, Alloc> > {
|
|
||||||
void operator()(msgpack::object::with_zone& o, const std::map<K, V, Compare, Alloc>& v) const {
|
|
||||||
o.type = msgpack::type::MAP;
|
|
||||||
if (v.empty()) {
|
|
||||||
o.via.map.ptr = nullptr;
|
|
||||||
o.via.map.size = 0;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
uint32_t size = checked_get_container_size(v.size());
|
|
||||||
|
|
||||||
msgpack::object_kv* p = static_cast<msgpack::object_kv*>(o.zone.allocate_align(sizeof(msgpack::object_kv)*size));
|
|
||||||
msgpack::object_kv* const pend = p + size;
|
|
||||||
o.via.map.ptr = p;
|
|
||||||
o.via.map.size = size;
|
|
||||||
typename std::map<K, V, Compare, Alloc>::const_iterator it(v.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->key = msgpack::object(it->first, o.zone);
|
|
||||||
p->val = msgpack::object(it->second, 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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
#if !defined(MSGPACK_USE_CPP03)
|
|
||||||
|
|
||||||
template <typename K, typename V, typename Compare, typename Alloc>
|
|
||||||
struct as<
|
|
||||||
std::multimap<K, V, Compare, Alloc>,
|
|
||||||
typename std::enable_if<msgpack::has_as<K>::value && msgpack::has_as<V>::value>::type> {
|
|
||||||
std::multimap<K, V, Compare, Alloc> operator()(msgpack::object const& o) const {
|
|
||||||
if (o.type != msgpack::type::MAP) { throw msgpack::type_error(); }
|
|
||||||
msgpack::object_kv* p(o.via.map.ptr);
|
|
||||||
msgpack::object_kv* const pend(o.via.map.ptr + o.via.map.size);
|
|
||||||
std::multimap<K, V, Compare, Alloc> v;
|
|
||||||
for (; p != pend; ++p) {
|
|
||||||
v.emplace(p->key.as<K>(), p->val.as<V>());
|
|
||||||
}
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // !defined(MSGPACK_USE_CPP03)
|
|
||||||
|
|
||||||
template <typename K, typename V, typename Compare, typename Alloc>
|
|
||||||
struct convert<std::multimap<K, V, Compare, Alloc> > {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, std::multimap<K, V, Compare, Alloc>& v) const {
|
|
||||||
if (o.type != msgpack::type::MAP) { throw msgpack::type_error(); }
|
|
||||||
msgpack::object_kv* p(o.via.map.ptr);
|
|
||||||
msgpack::object_kv* const pend(o.via.map.ptr + o.via.map.size);
|
|
||||||
std::multimap<K, V, Compare, Alloc> tmp;
|
|
||||||
for (; p != pend; ++p) {
|
|
||||||
std::pair<K, V> value;
|
|
||||||
p->key.convert(value.first);
|
|
||||||
p->val.convert(value.second);
|
|
||||||
#if __cplusplus >= 201103L
|
|
||||||
tmp.insert(std::move(value));
|
|
||||||
#else
|
|
||||||
tmp.insert(value);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
#if __cplusplus >= 201103L
|
|
||||||
v = std::move(tmp);
|
|
||||||
#else
|
|
||||||
tmp.swap(v);
|
|
||||||
#endif
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename K, typename V, typename Compare, typename Alloc>
|
|
||||||
struct pack<std::multimap<K, V, Compare, Alloc> > {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::multimap<K, V, Compare, Alloc>& v) const {
|
|
||||||
uint32_t size = checked_get_container_size(v.size());
|
|
||||||
o.pack_map(size);
|
|
||||||
for (typename std::multimap<K, V, Compare, Alloc>::const_iterator it(v.begin()), it_end(v.end());
|
|
||||||
it != it_end; ++it) {
|
|
||||||
o.pack(it->first);
|
|
||||||
o.pack(it->second);
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename K, typename V, typename Compare, typename Alloc>
|
|
||||||
struct object_with_zone<std::multimap<K, V, Compare, Alloc> > {
|
|
||||||
void operator()(msgpack::object::with_zone& o, const std::multimap<K, V, Compare, Alloc>& v) const {
|
|
||||||
o.type = msgpack::type::MAP;
|
|
||||||
if (v.empty()) {
|
|
||||||
o.via.map.ptr = nullptr;
|
|
||||||
o.via.map.size = 0;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
uint32_t size = checked_get_container_size(v.size());
|
|
||||||
msgpack::object_kv* p = static_cast<msgpack::object_kv*>(o.zone.allocate_align(sizeof(msgpack::object_kv)*size));
|
|
||||||
msgpack::object_kv* const pend = p + size;
|
|
||||||
o.via.map.ptr = p;
|
|
||||||
o.via.map.size = size;
|
|
||||||
typename std::multimap<K, V, Compare, Alloc>::const_iterator it(v.begin());
|
|
||||||
do {
|
|
||||||
p->key = msgpack::object(it->first, o.zone);
|
|
||||||
p->val = msgpack::object(it->second, o.zone);
|
|
||||||
++p;
|
|
||||||
++it;
|
|
||||||
} while(p < pend);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace adaptor
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
} // MSGPACK_API_VERSION_NAMESPACE(v1)
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
#endif // MSGPACK_TYPE_MAP_HPP
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2014 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_MSGPACK_TUPLE_HPP
|
|
||||||
#define MSGPACK_MSGPACK_TUPLE_HPP
|
|
||||||
|
|
||||||
#include "msgpack/cpp_config.hpp"
|
|
||||||
|
|
||||||
#if defined(MSGPACK_USE_CPP03)
|
|
||||||
#include "detail/cpp03_msgpack_tuple.hpp"
|
|
||||||
#else // MSGPACK_USE_CPP03
|
|
||||||
#include "detail/cpp11_msgpack_tuple.hpp"
|
|
||||||
#endif // MSGPACK_USE_CPP03
|
|
||||||
|
|
||||||
#endif // MSGPACK_MSGPACK_TUPLE_HPP
|
|
||||||
@@ -1,90 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// 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_TYPE_NIL_HPP
|
|
||||||
#define MSGPACK_TYPE_NIL_HPP
|
|
||||||
|
|
||||||
#include "msgpack/versioning.hpp"
|
|
||||||
#include "msgpack/adaptor/adaptor_base.hpp"
|
|
||||||
|
|
||||||
namespace msgpack {
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
MSGPACK_API_VERSION_NAMESPACE(v1) {
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
namespace type {
|
|
||||||
|
|
||||||
struct nil_t { };
|
|
||||||
|
|
||||||
#if !defined(MSGPACK_DISABLE_LEGACY_NIL)
|
|
||||||
|
|
||||||
typedef nil_t nil;
|
|
||||||
|
|
||||||
#endif // !defined(MSGPACK_DISABLE_LEGACY_NIL)
|
|
||||||
|
|
||||||
inline bool operator<(nil_t const& lhs, nil_t const& rhs) {
|
|
||||||
return &lhs < &rhs;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool operator==(nil_t const& lhs, nil_t const& rhs) {
|
|
||||||
return &lhs == &rhs;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace type
|
|
||||||
|
|
||||||
namespace adaptor {
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct convert<type::nil_t> {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, type::nil_t&) const {
|
|
||||||
if(o.type != msgpack::type::NIL) { throw msgpack::type_error(); }
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct pack<type::nil_t> {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const type::nil_t&) const {
|
|
||||||
o.pack_nil();
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object<type::nil_t> {
|
|
||||||
void operator()(msgpack::object& o, type::nil_t) const {
|
|
||||||
o.type = msgpack::type::NIL;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object_with_zone<type::nil_t> {
|
|
||||||
void operator()(msgpack::object::with_zone& o, type::nil_t v) const {
|
|
||||||
static_cast<msgpack::object&>(o) << v;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace adaptor
|
|
||||||
|
|
||||||
template <>
|
|
||||||
inline void msgpack::object::as<void>() const
|
|
||||||
{
|
|
||||||
msgpack::type::nil_t v;
|
|
||||||
convert(v);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
} // MSGPACK_API_VERSION_NAMESPACE(v1)
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
#endif // MSGPACK_TYPE_NIL_HPP
|
|
||||||
@@ -1,83 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// 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_TYPE_PAIR_HPP
|
|
||||||
#define MSGPACK_TYPE_PAIR_HPP
|
|
||||||
|
|
||||||
#include "msgpack/versioning.hpp"
|
|
||||||
#include "msgpack/adaptor/adaptor_base.hpp"
|
|
||||||
#include "msgpack/meta.hpp"
|
|
||||||
|
|
||||||
#include <utility>
|
|
||||||
|
|
||||||
namespace msgpack {
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
MSGPACK_API_VERSION_NAMESPACE(v1) {
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
namespace adaptor {
|
|
||||||
|
|
||||||
#if !defined(MSGPACK_USE_CPP03)
|
|
||||||
|
|
||||||
template <typename T1, typename T2>
|
|
||||||
struct as<std::pair<T1, T2>,
|
|
||||||
typename std::enable_if<msgpack::all_of<msgpack::has_as, T1, T2>::value>::type> {
|
|
||||||
std::pair<T1, T2> operator()(msgpack::object const& o) const {
|
|
||||||
if (o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
|
|
||||||
if (o.via.array.size != 2) { throw msgpack::type_error(); }
|
|
||||||
return std::make_pair(o.via.array.ptr[0].as<T1>(), o.via.array.ptr[1].as<T2>());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // !defined(MSGPACK_USE_CPP03)
|
|
||||||
|
|
||||||
template <typename T1, typename T2>
|
|
||||||
struct convert<std::pair<T1, T2> > {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, std::pair<T1, T2>& v) const {
|
|
||||||
if(o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
|
|
||||||
if(o.via.array.size != 2) { throw msgpack::type_error(); }
|
|
||||||
o.via.array.ptr[0].convert(v.first);
|
|
||||||
o.via.array.ptr[1].convert(v.second);
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T1, typename T2>
|
|
||||||
struct pack<std::pair<T1, T2> > {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::pair<T1, T2>& v) const {
|
|
||||||
o.pack_array(2);
|
|
||||||
o.pack(v.first);
|
|
||||||
o.pack(v.second);
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T1, typename T2>
|
|
||||||
struct object_with_zone<std::pair<T1, T2> > {
|
|
||||||
void operator()(msgpack::object::with_zone& o, const std::pair<T1, T2>& v) const {
|
|
||||||
o.type = msgpack::type::ARRAY;
|
|
||||||
msgpack::object* p = static_cast<msgpack::object*>(o.zone.allocate_align(sizeof(msgpack::object)*2));
|
|
||||||
o.via.array.ptr = p;
|
|
||||||
o.via.array.size = 2;
|
|
||||||
p[0] = msgpack::object(v.first, o.zone);
|
|
||||||
p[1] = msgpack::object(v.second, o.zone);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace adaptor
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
} // MSGPACK_API_VERSION_NAMESPACE(v1)
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
#endif // MSGPACK_TYPE_PAIR_HPP
|
|
||||||
@@ -1,106 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// 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_TYPE_RAW_HPP
|
|
||||||
#define MSGPACK_TYPE_RAW_HPP
|
|
||||||
|
|
||||||
#include "msgpack/versioning.hpp"
|
|
||||||
#include "msgpack/adaptor/adaptor_base.hpp"
|
|
||||||
#include <cstring>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
namespace msgpack {
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
MSGPACK_API_VERSION_NAMESPACE(v1) {
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
namespace type {
|
|
||||||
|
|
||||||
struct raw_ref {
|
|
||||||
raw_ref() : size(0), ptr(nullptr) {}
|
|
||||||
raw_ref(const char* p, uint32_t s) : size(s), ptr(p) {}
|
|
||||||
|
|
||||||
uint32_t size;
|
|
||||||
const char* ptr;
|
|
||||||
|
|
||||||
std::string str() const { return std::string(ptr, size); }
|
|
||||||
|
|
||||||
bool operator== (const raw_ref& x) const
|
|
||||||
{
|
|
||||||
return size == x.size && std::memcmp(ptr, x.ptr, size) == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator!= (const raw_ref& x) const
|
|
||||||
{
|
|
||||||
return !(*this == x);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator< (const raw_ref& x) const
|
|
||||||
{
|
|
||||||
if(size == x.size) { return std::memcmp(ptr, x.ptr, size) < 0; }
|
|
||||||
else { return size < x.size; }
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator> (const raw_ref& x) const
|
|
||||||
{
|
|
||||||
if(size == x.size) { return std::memcmp(ptr, x.ptr, size) > 0; }
|
|
||||||
else { return size > x.size; }
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace type
|
|
||||||
|
|
||||||
namespace adaptor {
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct convert<msgpack::type::raw_ref> {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, msgpack::type::raw_ref& v) const {
|
|
||||||
if(o.type != msgpack::type::BIN) { throw msgpack::type_error(); }
|
|
||||||
v.ptr = o.via.bin.ptr;
|
|
||||||
v.size = o.via.bin.size;
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct pack<msgpack::type::raw_ref> {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const msgpack::type::raw_ref& v) const {
|
|
||||||
o.pack_bin(v.size);
|
|
||||||
o.pack_bin_body(v.ptr, v.size);
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object<msgpack::type::raw_ref> {
|
|
||||||
void operator()(msgpack::object& o, const msgpack::type::raw_ref& v) const {
|
|
||||||
o.type = msgpack::type::BIN;
|
|
||||||
o.via.bin.ptr = v.ptr;
|
|
||||||
o.via.bin.size = v.size;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object_with_zone<msgpack::type::raw_ref> {
|
|
||||||
void operator()(msgpack::object::with_zone& o, const msgpack::type::raw_ref& v) const {
|
|
||||||
static_cast<msgpack::object&>(o) << v;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace adaptor
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
} // MSGPACK_API_VERSION_NAMESPACE(v1)
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
#endif // MSGPACK_TYPE_RAW_HPP
|
|
||||||
@@ -1,188 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2015 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_TYPE_SET_HPP
|
|
||||||
#define MSGPACK_TYPE_SET_HPP
|
|
||||||
|
|
||||||
#include "msgpack/versioning.hpp"
|
|
||||||
#include "msgpack/adaptor/adaptor_base.hpp"
|
|
||||||
#include "msgpack/adaptor/check_container_size.hpp"
|
|
||||||
|
|
||||||
#include <set>
|
|
||||||
|
|
||||||
namespace msgpack {
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
MSGPACK_API_VERSION_NAMESPACE(v1) {
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
namespace adaptor {
|
|
||||||
|
|
||||||
#if !defined(MSGPACK_USE_CPP03)
|
|
||||||
|
|
||||||
template <typename T, typename Compare, typename Alloc>
|
|
||||||
struct as<std::set<T, Compare, Alloc>, typename std::enable_if<msgpack::has_as<T>::value>::type> {
|
|
||||||
std::set<T, Compare, Alloc> operator()(msgpack::object const& o) const {
|
|
||||||
if (o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
|
|
||||||
msgpack::object* p = o.via.array.ptr + o.via.array.size;
|
|
||||||
msgpack::object* const pbegin = o.via.array.ptr;
|
|
||||||
std::set<T, Compare, Alloc> v;
|
|
||||||
while (p > pbegin) {
|
|
||||||
--p;
|
|
||||||
v.insert(p->as<T>());
|
|
||||||
}
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // !defined(MSGPACK_USE_CPP03)
|
|
||||||
|
|
||||||
template <typename T, typename Compare, typename Alloc>
|
|
||||||
struct convert<std::set<T, Compare, Alloc> > {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, std::set<T, Compare, Alloc>& v) const {
|
|
||||||
if (o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
|
|
||||||
msgpack::object* p = o.via.array.ptr + o.via.array.size;
|
|
||||||
msgpack::object* const pbegin = o.via.array.ptr;
|
|
||||||
std::set<T, Compare, Alloc> tmp;
|
|
||||||
while (p > pbegin) {
|
|
||||||
--p;
|
|
||||||
tmp.insert(p->as<T>());
|
|
||||||
}
|
|
||||||
#if __cplusplus >= 201103L
|
|
||||||
v = std::move(tmp);
|
|
||||||
#else
|
|
||||||
tmp.swap(v);
|
|
||||||
#endif
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T, typename Compare, typename Alloc>
|
|
||||||
struct pack<std::set<T, Compare, Alloc> > {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::set<T, Compare, Alloc>& v) const {
|
|
||||||
uint32_t size = checked_get_container_size(v.size());
|
|
||||||
o.pack_array(size);
|
|
||||||
for (typename std::set<T, Compare, Alloc>::const_iterator it(v.begin()), it_end(v.end());
|
|
||||||
it != it_end; ++it) {
|
|
||||||
o.pack(*it);
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T, typename Compare, typename Alloc>
|
|
||||||
struct object_with_zone<std::set<T, Compare, Alloc> > {
|
|
||||||
void operator()(msgpack::object::with_zone& o, const std::set<T, Compare, 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(v.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 std::set<T, Compare, Alloc>::const_iterator it(v.begin());
|
|
||||||
do {
|
|
||||||
*p = msgpack::object(*it, o.zone);
|
|
||||||
++p;
|
|
||||||
++it;
|
|
||||||
} while(p < pend);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
#if !defined(MSGPACK_USE_CPP03)
|
|
||||||
|
|
||||||
template <typename T, typename Compare, typename Alloc>
|
|
||||||
struct as<std::multiset<T, Compare, Alloc>, typename std::enable_if<msgpack::has_as<T>::value>::type> {
|
|
||||||
std::multiset<T, Compare, Alloc> operator()(msgpack::object const& o) const {
|
|
||||||
if (o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
|
|
||||||
msgpack::object* p = o.via.array.ptr + o.via.array.size;
|
|
||||||
msgpack::object* const pbegin = o.via.array.ptr;
|
|
||||||
std::multiset<T, Compare, Alloc> v;
|
|
||||||
while (p > pbegin) {
|
|
||||||
--p;
|
|
||||||
v.insert(p->as<T>());
|
|
||||||
}
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // !defined(MSGPACK_USE_CPP03)
|
|
||||||
|
|
||||||
template <typename T, typename Compare, typename Alloc>
|
|
||||||
struct convert<std::multiset<T, Compare, Alloc> > {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, std::multiset<T, Compare, Alloc>& v) const {
|
|
||||||
if (o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
|
|
||||||
msgpack::object* p = o.via.array.ptr + o.via.array.size;
|
|
||||||
msgpack::object* const pbegin = o.via.array.ptr;
|
|
||||||
std::multiset<T, Compare, Alloc> tmp;
|
|
||||||
while (p > pbegin) {
|
|
||||||
--p;
|
|
||||||
tmp.insert(p->as<T>());
|
|
||||||
}
|
|
||||||
#if __cplusplus >= 201103L
|
|
||||||
v = std::move(tmp);
|
|
||||||
#else
|
|
||||||
tmp.swap(v);
|
|
||||||
#endif
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T, typename Compare, typename Alloc>
|
|
||||||
struct pack<std::multiset<T, Compare, Alloc> > {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::multiset<T, Compare, Alloc>& v) const {
|
|
||||||
uint32_t size = checked_get_container_size(v.size());
|
|
||||||
o.pack_array(size);
|
|
||||||
for (typename std::multiset<T, Compare, Alloc>::const_iterator it(v.begin()), it_end(v.end());
|
|
||||||
it != it_end; ++it) {
|
|
||||||
o.pack(*it);
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T, typename Compare, typename Alloc>
|
|
||||||
struct object_with_zone<std::multiset<T, Compare, Alloc> > {
|
|
||||||
void operator()(msgpack::object::with_zone& o, const std::multiset<T, Compare, 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(v.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 std::multiset<T, Compare, Alloc>::const_iterator it(v.begin());
|
|
||||||
do {
|
|
||||||
*p = msgpack::object(*it, o.zone);
|
|
||||||
++p;
|
|
||||||
++it;
|
|
||||||
} while(p < pend);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace adaptor
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
} // MSGPACK_API_VERSION_NAMESPACE(v1)
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
#endif // MSGPACK_TYPE_SET_HPP
|
|
||||||
@@ -1,86 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2015 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_TYPE_STRING_HPP
|
|
||||||
#define MSGPACK_TYPE_STRING_HPP
|
|
||||||
|
|
||||||
#include "msgpack/versioning.hpp"
|
|
||||||
#include "msgpack/adaptor/adaptor_base.hpp"
|
|
||||||
#include "msgpack/adaptor/check_container_size.hpp"
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
namespace msgpack {
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
MSGPACK_API_VERSION_NAMESPACE(v1) {
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
namespace adaptor {
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct convert<std::string> {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, std::string& v) const {
|
|
||||||
switch (o.type) {
|
|
||||||
case msgpack::type::BIN:
|
|
||||||
v.assign(o.via.bin.ptr, o.via.bin.size);
|
|
||||||
break;
|
|
||||||
case msgpack::type::STR:
|
|
||||||
v.assign(o.via.str.ptr, o.via.str.size);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
throw msgpack::type_error();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct pack<std::string> {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::string& 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<std::string> {
|
|
||||||
void operator()(msgpack::object& o, const std::string& 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<std::string> {
|
|
||||||
void operator()(msgpack::object::with_zone& o, const std::string& v) const {
|
|
||||||
uint32_t size = checked_get_container_size(v.size());
|
|
||||||
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.data(), v.size());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace adaptor
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
} // MSGPACK_API_VERSION_NAMESPACE(v1)
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
#endif // MSGPACK_TYPE_STRING_HPP
|
|
||||||
@@ -1,171 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2015 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_TYPE_TR1_UNORDERED_MAP_HPP
|
|
||||||
#define MSGPACK_TYPE_TR1_UNORDERED_MAP_HPP
|
|
||||||
|
|
||||||
#include "msgpack/versioning.hpp"
|
|
||||||
#include "msgpack/adaptor/adaptor_base.hpp"
|
|
||||||
#include "msgpack/adaptor/check_container_size.hpp"
|
|
||||||
|
|
||||||
#if defined(_LIBCPP_VERSION) || (_MSC_VER >= 1700)
|
|
||||||
|
|
||||||
#define MSGPACK_HAS_STD_UNORDERED_MAP
|
|
||||||
#include <unordered_map>
|
|
||||||
#define MSGPACK_STD_TR1 std
|
|
||||||
|
|
||||||
#else // defined(_LIBCPP_VERSION) || (_MSC_VER >= 1700)
|
|
||||||
|
|
||||||
#if __GNUC__ >= 4
|
|
||||||
|
|
||||||
#define MSGPACK_HAS_STD_TR1_UNORDERED_MAP
|
|
||||||
|
|
||||||
#include <tr1/unordered_map>
|
|
||||||
#define MSGPACK_STD_TR1 std::tr1
|
|
||||||
|
|
||||||
#endif // __GNUC__ >= 4
|
|
||||||
|
|
||||||
#endif // defined(_LIBCPP_VERSION) || (_MSC_VER >= 1700)
|
|
||||||
|
|
||||||
#if defined(MSGPACK_STD_TR1)
|
|
||||||
|
|
||||||
namespace msgpack {
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
MSGPACK_API_VERSION_NAMESPACE(v1) {
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
namespace adaptor {
|
|
||||||
|
|
||||||
template <typename K, typename V, typename Hash, typename Pred, typename Alloc>
|
|
||||||
struct convert<MSGPACK_STD_TR1::unordered_map<K, V, Hash, Pred, Alloc> > {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, MSGPACK_STD_TR1::unordered_map<K, V, Hash, Pred, Alloc>& v) const {
|
|
||||||
if(o.type != msgpack::type::MAP) { throw msgpack::type_error(); }
|
|
||||||
msgpack::object_kv* p(o.via.map.ptr);
|
|
||||||
msgpack::object_kv* const pend(o.via.map.ptr + o.via.map.size);
|
|
||||||
MSGPACK_STD_TR1::unordered_map<K, V, Hash, Pred, Alloc> tmp;
|
|
||||||
for(; p != pend; ++p) {
|
|
||||||
K key;
|
|
||||||
p->key.convert(key);
|
|
||||||
p->val.convert(tmp[key]);
|
|
||||||
}
|
|
||||||
tmp.swap(v);
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename K, typename V, typename Hash, typename Pred, typename Alloc>
|
|
||||||
struct pack<MSGPACK_STD_TR1::unordered_map<K, V, Hash, Pred, Alloc> > {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const MSGPACK_STD_TR1::unordered_map<K, V, Hash, Pred, Alloc>& v) const {
|
|
||||||
uint32_t size = checked_get_container_size(v.size());
|
|
||||||
o.pack_map(size);
|
|
||||||
for(typename MSGPACK_STD_TR1::unordered_map<K, V, Hash, Pred, Alloc>::const_iterator it(v.begin()), it_end(v.end());
|
|
||||||
it != it_end; ++it) {
|
|
||||||
o.pack(it->first);
|
|
||||||
o.pack(it->second);
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename K, typename V, typename Hash, typename Pred, typename Alloc>
|
|
||||||
struct object_with_zone<MSGPACK_STD_TR1::unordered_map<K, V, Hash, Pred, Alloc> > {
|
|
||||||
void operator()(msgpack::object::with_zone& o, const MSGPACK_STD_TR1::unordered_map<K, V, Hash, Pred, Alloc>& v) const {
|
|
||||||
o.type = msgpack::type::MAP;
|
|
||||||
if(v.empty()) {
|
|
||||||
o.via.map.ptr = nullptr;
|
|
||||||
o.via.map.size = 0;
|
|
||||||
} else {
|
|
||||||
uint32_t size = checked_get_container_size(v.size());
|
|
||||||
msgpack::object_kv* p = static_cast<msgpack::object_kv*>(o.zone.allocate_align(sizeof(msgpack::object_kv)*size));
|
|
||||||
msgpack::object_kv* const pend = p + size;
|
|
||||||
o.via.map.ptr = p;
|
|
||||||
o.via.map.size = size;
|
|
||||||
typename MSGPACK_STD_TR1::unordered_map<K, V, Hash, Pred, Alloc>::const_iterator it(v.begin());
|
|
||||||
do {
|
|
||||||
p->key = msgpack::object(it->first, o.zone);
|
|
||||||
p->val = msgpack::object(it->second, o.zone);
|
|
||||||
++p;
|
|
||||||
++it;
|
|
||||||
} while(p < pend);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename K, typename V, typename Hash, typename Pred, typename Alloc>
|
|
||||||
struct convert<MSGPACK_STD_TR1::unordered_multimap<K, V, Hash, Pred, Alloc> > {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, MSGPACK_STD_TR1::unordered_multimap<K, V, Hash, Pred, Alloc>& v) const {
|
|
||||||
if(o.type != msgpack::type::MAP) { throw msgpack::type_error(); }
|
|
||||||
msgpack::object_kv* p(o.via.map.ptr);
|
|
||||||
msgpack::object_kv* const pend(o.via.map.ptr + o.via.map.size);
|
|
||||||
MSGPACK_STD_TR1::unordered_multimap<K, V, Hash, Pred, Alloc> tmp;
|
|
||||||
for(; p != pend; ++p) {
|
|
||||||
std::pair<K, V> value;
|
|
||||||
p->key.convert(value.first);
|
|
||||||
p->val.convert(value.second);
|
|
||||||
tmp.insert(value);
|
|
||||||
}
|
|
||||||
tmp.swap(v);
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename K, typename V, typename Hash, typename Pred, typename Alloc>
|
|
||||||
struct pack<MSGPACK_STD_TR1::unordered_multimap<K, V, Hash, Pred, Alloc> > {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const MSGPACK_STD_TR1::unordered_multimap<K, V, Hash, Pred, Alloc>& v) const {
|
|
||||||
uint32_t size = checked_get_container_size(v.size());
|
|
||||||
o.pack_map(size);
|
|
||||||
for(typename MSGPACK_STD_TR1::unordered_multimap<K, V, Hash, Pred, Alloc>::const_iterator it(v.begin()), it_end(v.end());
|
|
||||||
it != it_end; ++it) {
|
|
||||||
o.pack(it->first);
|
|
||||||
o.pack(it->second);
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename K, typename V, typename Hash, typename Pred, typename Alloc>
|
|
||||||
struct object_with_zone<MSGPACK_STD_TR1::unordered_multimap<K, V, Hash, Pred, Alloc> > {
|
|
||||||
void operator()(msgpack::object::with_zone& o, const MSGPACK_STD_TR1::unordered_multimap<K, V, Hash, Pred, Alloc>& v) const {
|
|
||||||
o.type = msgpack::type::MAP;
|
|
||||||
if(v.empty()) {
|
|
||||||
o.via.map.ptr = nullptr;
|
|
||||||
o.via.map.size = 0;
|
|
||||||
} else {
|
|
||||||
uint32_t size = checked_get_container_size(v.size());
|
|
||||||
msgpack::object_kv* p = static_cast<msgpack::object_kv*>(o.zone.allocate_align(sizeof(msgpack::object_kv)*size));
|
|
||||||
msgpack::object_kv* const pend = p + size;
|
|
||||||
o.via.map.ptr = p;
|
|
||||||
o.via.map.size = size;
|
|
||||||
typename MSGPACK_STD_TR1::unordered_multimap<K, V, Hash, Pred, Alloc>::const_iterator it(v.begin());
|
|
||||||
do {
|
|
||||||
p->key = msgpack::object(it->first, o.zone);
|
|
||||||
p->val = msgpack::object(it->second, o.zone);
|
|
||||||
++p;
|
|
||||||
++it;
|
|
||||||
} while(p < pend);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace adaptor
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
} // MSGPACK_API_VERSION_NAMESPACE(v1)
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
#undef MSGPACK_STD_TR1
|
|
||||||
|
|
||||||
#endif // MSGPACK_STD_TR1
|
|
||||||
|
|
||||||
#endif // MSGPACK_TYPE_TR1_UNORDERED_MAP_HPP
|
|
||||||
@@ -1,165 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2015 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_TYPE_TR1_UNORDERED_SET_HPP
|
|
||||||
#define MSGPACK_TYPE_TR1_UNORDERED_SET_HPP
|
|
||||||
|
|
||||||
#include "msgpack/versioning.hpp"
|
|
||||||
#include "msgpack/adaptor/adaptor_base.hpp"
|
|
||||||
#include "msgpack/adaptor/check_container_size.hpp"
|
|
||||||
|
|
||||||
#if defined(_LIBCPP_VERSION) || (_MSC_VER >= 1700)
|
|
||||||
|
|
||||||
#define MSGPACK_HAS_STD_UNORDERED_SET
|
|
||||||
#include <unordered_set>
|
|
||||||
#define MSGPACK_STD_TR1 std
|
|
||||||
|
|
||||||
#else // defined(_LIBCPP_VERSION) || (_MSC_VER >= 1700)
|
|
||||||
|
|
||||||
#if __GNUC__ >= 4
|
|
||||||
|
|
||||||
#define MSGPACK_HAS_STD_TR1_UNORDERED_SET
|
|
||||||
|
|
||||||
#include <tr1/unordered_set>
|
|
||||||
#define MSGPACK_STD_TR1 std::tr1
|
|
||||||
|
|
||||||
#endif // __GNUC__ >= 4
|
|
||||||
|
|
||||||
#endif // defined(_LIBCPP_VERSION) || (_MSC_VER >= 1700)
|
|
||||||
|
|
||||||
#if defined(MSGPACK_STD_TR1)
|
|
||||||
|
|
||||||
namespace msgpack {
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
MSGPACK_API_VERSION_NAMESPACE(v1) {
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
namespace adaptor {
|
|
||||||
|
|
||||||
template <typename T, typename Hash, typename Compare, typename Alloc>
|
|
||||||
struct convert<MSGPACK_STD_TR1::unordered_set<T, Hash, Compare, Alloc> > {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, MSGPACK_STD_TR1::unordered_set<T, Hash, Compare, Alloc>& v) const {
|
|
||||||
if(o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
|
|
||||||
msgpack::object* p = o.via.array.ptr + o.via.array.size;
|
|
||||||
msgpack::object* const pbegin = o.via.array.ptr;
|
|
||||||
MSGPACK_STD_TR1::unordered_set<T, Hash, Compare, Alloc> tmp;
|
|
||||||
while(p > pbegin) {
|
|
||||||
--p;
|
|
||||||
tmp.insert(p->as<T>());
|
|
||||||
}
|
|
||||||
tmp.swap(v);
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T, typename Hash, typename Compare, typename Alloc>
|
|
||||||
struct pack<MSGPACK_STD_TR1::unordered_set<T, Hash, Compare, Alloc> > {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const MSGPACK_STD_TR1::unordered_set<T, Hash, Compare, Alloc>& v) const {
|
|
||||||
uint32_t size = checked_get_container_size(v.size());
|
|
||||||
o.pack_array(size);
|
|
||||||
for(typename MSGPACK_STD_TR1::unordered_set<T, Hash, Compare, Alloc>::const_iterator it(v.begin()), it_end(v.end());
|
|
||||||
it != it_end; ++it) {
|
|
||||||
o.pack(*it);
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T, typename Hash, typename Compare, typename Alloc>
|
|
||||||
struct object_with_zone<MSGPACK_STD_TR1::unordered_set<T, Hash, Compare, Alloc> > {
|
|
||||||
void operator()(msgpack::object::with_zone& o, const MSGPACK_STD_TR1::unordered_set<T, Hash, Compare, 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(v.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 MSGPACK_STD_TR1::unordered_set<T, Hash, Compare, Alloc>::const_iterator it(v.begin());
|
|
||||||
do {
|
|
||||||
*p = msgpack::object(*it, o.zone);
|
|
||||||
++p;
|
|
||||||
++it;
|
|
||||||
} while(p < pend);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
template <typename T, typename Hash, typename Compare, typename Alloc>
|
|
||||||
struct convert<MSGPACK_STD_TR1::unordered_multiset<T, Hash, Compare, Alloc> > {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, MSGPACK_STD_TR1::unordered_multiset<T, Hash, Compare, Alloc>& v) const {
|
|
||||||
if(o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
|
|
||||||
msgpack::object* p = o.via.array.ptr + o.via.array.size;
|
|
||||||
msgpack::object* const pbegin = o.via.array.ptr;
|
|
||||||
MSGPACK_STD_TR1::unordered_multiset<T, Hash, Compare, Alloc> tmp;
|
|
||||||
while(p > pbegin) {
|
|
||||||
--p;
|
|
||||||
tmp.insert(p->as<T>());
|
|
||||||
}
|
|
||||||
tmp.swap(v);
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T, typename Hash, typename Compare, typename Alloc>
|
|
||||||
struct pack<MSGPACK_STD_TR1::unordered_multiset<T, Hash, Compare, Alloc> > {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const MSGPACK_STD_TR1::unordered_multiset<T, Hash, Compare, Alloc>& v) const {
|
|
||||||
uint32_t size = checked_get_container_size(v.size());
|
|
||||||
o.pack_array(size);
|
|
||||||
for(typename MSGPACK_STD_TR1::unordered_multiset<T, Hash, Compare, Alloc>::const_iterator it(v.begin()), it_end(v.end());
|
|
||||||
it != it_end; ++it) {
|
|
||||||
o.pack(*it);
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T, typename Hash, typename Compare, typename Alloc>
|
|
||||||
struct object_with_zone<MSGPACK_STD_TR1::unordered_multiset<T, Hash, Compare, Alloc> > {
|
|
||||||
void operator()(msgpack::object::with_zone& o, const MSGPACK_STD_TR1::unordered_multiset<T, Hash, Compare, 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(v.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 MSGPACK_STD_TR1::unordered_multiset<T, Hash, Compare, Alloc>::const_iterator it(v.begin());
|
|
||||||
do {
|
|
||||||
*p = msgpack::object(*it, o.zone);
|
|
||||||
++p;
|
|
||||||
++it;
|
|
||||||
} while(p < pend);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace adaptor
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
} // MSGPACK_API_VERSION_NAMESPACE(v1)
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
#undef MSGPACK_STD_TR1
|
|
||||||
|
|
||||||
#endif // MSGPACK_STD_TR1
|
|
||||||
|
|
||||||
#endif // MSGPACK_TYPE_TR1_UNORDERED_SET_HPP
|
|
||||||
@@ -1,106 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2015 FURUHASHI Sadayuki and KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Distributed under the Boost Software License, Version 1.0.
|
|
||||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
|
||||||
// http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
//
|
|
||||||
#ifndef MSGPACK_TYPE_V4RAW_HPP
|
|
||||||
#define MSGPACK_TYPE_V4RAW_HPP
|
|
||||||
|
|
||||||
#include "msgpack/versioning.hpp"
|
|
||||||
#include "msgpack/adaptor/adaptor_base.hpp"
|
|
||||||
#include <cstring>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
namespace msgpack {
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
MSGPACK_API_VERSION_NAMESPACE(v1) {
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
namespace type {
|
|
||||||
|
|
||||||
struct v4raw_ref {
|
|
||||||
v4raw_ref() : size(0), ptr(nullptr) {}
|
|
||||||
v4raw_ref(const char* p, uint32_t s) : size(s), ptr(p) {}
|
|
||||||
|
|
||||||
uint32_t size;
|
|
||||||
const char* ptr;
|
|
||||||
|
|
||||||
std::string str() const { return std::string(ptr, size); }
|
|
||||||
|
|
||||||
bool operator== (const v4raw_ref& x) const
|
|
||||||
{
|
|
||||||
return size == x.size && std::memcmp(ptr, x.ptr, size) == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator!= (const v4raw_ref& x) const
|
|
||||||
{
|
|
||||||
return !(*this == x);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator< (const v4raw_ref& x) const
|
|
||||||
{
|
|
||||||
if(size == x.size) { return std::memcmp(ptr, x.ptr, size) < 0; }
|
|
||||||
else { return size < x.size; }
|
|
||||||
}
|
|
||||||
|
|
||||||
bool operator> (const v4raw_ref& x) const
|
|
||||||
{
|
|
||||||
if(size == x.size) { return std::memcmp(ptr, x.ptr, size) > 0; }
|
|
||||||
else { return size > x.size; }
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace type
|
|
||||||
|
|
||||||
namespace adaptor {
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct convert<msgpack::type::v4raw_ref> {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, msgpack::type::v4raw_ref& v) const {
|
|
||||||
if(o.type != msgpack::type::STR) { throw msgpack::type_error(); }
|
|
||||||
v.ptr = o.via.str.ptr;
|
|
||||||
v.size = o.via.str.size;
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct pack<msgpack::type::v4raw_ref> {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const msgpack::type::v4raw_ref& v) const {
|
|
||||||
o.pack_v4raw(v.size);
|
|
||||||
o.pack_v4raw_body(v.ptr, v.size);
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object<msgpack::type::v4raw_ref> {
|
|
||||||
void operator()(msgpack::object& o, const msgpack::type::v4raw_ref& v) const {
|
|
||||||
o.type = msgpack::type::STR;
|
|
||||||
o.via.str.ptr = v.ptr;
|
|
||||||
o.via.str.size = v.size;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object_with_zone<msgpack::type::v4raw_ref> {
|
|
||||||
void operator()(msgpack::object::with_zone& o, const msgpack::type::v4raw_ref& v) const {
|
|
||||||
static_cast<msgpack::object&>(o) << v;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace adaptor
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
} // MSGPACK_API_VERSION_NAMESPACE(v1)
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
#endif // MSGPACK_TYPE_V4RAW_HPP
|
|
||||||
@@ -1,121 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2015 FURUHASHI Sadayuki and KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Distributed under the Boost Software License, Version 1.0.
|
|
||||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
|
||||||
// http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
//
|
|
||||||
#ifndef MSGPACK_TYPE_VECTOR_HPP
|
|
||||||
#define MSGPACK_TYPE_VECTOR_HPP
|
|
||||||
|
|
||||||
#include "msgpack/versioning.hpp"
|
|
||||||
#include "msgpack/adaptor/adaptor_base.hpp"
|
|
||||||
#include "msgpack/adaptor/check_container_size.hpp"
|
|
||||||
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
namespace msgpack {
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
MSGPACK_API_VERSION_NAMESPACE(v1) {
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
namespace adaptor {
|
|
||||||
|
|
||||||
#if !defined(MSGPACK_USE_CPP03)
|
|
||||||
|
|
||||||
template <typename T, typename Alloc>
|
|
||||||
struct as<std::vector<T, Alloc>, typename std::enable_if<msgpack::has_as<T>::value>::type> {
|
|
||||||
std::vector<T, Alloc> operator()(const msgpack::object& o) const {
|
|
||||||
if (o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
|
|
||||||
std::vector<T, Alloc> v;
|
|
||||||
v.reserve(o.via.array.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;
|
|
||||||
do {
|
|
||||||
v.push_back(p->as<T>());
|
|
||||||
++p;
|
|
||||||
} while (p < pend);
|
|
||||||
}
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // !defined(MSGPACK_USE_CPP03)
|
|
||||||
|
|
||||||
template <typename T, typename Alloc>
|
|
||||||
struct convert<std::vector<T, Alloc> > {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, std::vector<T, Alloc>& v) const {
|
|
||||||
if (o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
|
|
||||||
v.resize(o.via.array.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, Alloc>::iterator it = v.begin();
|
|
||||||
do {
|
|
||||||
p->convert(*it);
|
|
||||||
++p;
|
|
||||||
++it;
|
|
||||||
} while(p < pend);
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T, typename Alloc>
|
|
||||||
struct pack<std::vector<T, Alloc> > {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::vector<T, Alloc>& v) const {
|
|
||||||
uint32_t size = checked_get_container_size(v.size());
|
|
||||||
o.pack_array(size);
|
|
||||||
for (typename std::vector<T, Alloc>::const_iterator it(v.begin()), it_end(v.end());
|
|
||||||
it != it_end; ++it) {
|
|
||||||
o.pack(*it);
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T, typename Alloc>
|
|
||||||
struct object_with_zone<std::vector<T, Alloc> > {
|
|
||||||
void operator()(msgpack::object::with_zone& o, const std::vector<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(v.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 std::vector<T, Alloc>::const_iterator it(v.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_VECTOR_HPP
|
|
||||||
@@ -1,88 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2015 KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Distributed under the Boost Software License, Version 1.0.
|
|
||||||
// (See accompanying file LICENSE_1_0.txt or copy at
|
|
||||||
// http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
//
|
|
||||||
#ifndef MSGPACK_TYPE_VECTOR_BOOL_HPP
|
|
||||||
#define MSGPACK_TYPE_VECTOR_BOOL_HPP
|
|
||||||
|
|
||||||
#include "msgpack/versioning.hpp"
|
|
||||||
#include "msgpack/object_fwd.hpp"
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
namespace msgpack {
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
MSGPACK_API_VERSION_NAMESPACE(v1) {
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
namespace adaptor {
|
|
||||||
|
|
||||||
template <typename Alloc>
|
|
||||||
struct convert<std::vector<bool, Alloc> > {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, std::vector<bool, Alloc>& v) const {
|
|
||||||
if (o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
|
|
||||||
if (o.via.array.size > 0) {
|
|
||||||
v.resize(o.via.array.size);
|
|
||||||
msgpack::object* p = o.via.array.ptr;
|
|
||||||
for (typename std::vector<bool, Alloc>::iterator it = v.begin(), end = v.end();
|
|
||||||
it != end;
|
|
||||||
++it) {
|
|
||||||
*it = p->as<bool>();
|
|
||||||
++p;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Alloc>
|
|
||||||
struct pack<std::vector<bool, Alloc> > {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::vector<bool, Alloc>& v) const {
|
|
||||||
uint32_t size = checked_get_container_size(v.size());
|
|
||||||
o.pack_array(size);
|
|
||||||
for(typename std::vector<bool, Alloc>::const_iterator it(v.begin()), it_end(v.end());
|
|
||||||
it != it_end; ++it) {
|
|
||||||
o.pack(static_cast<bool>(*it));
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Alloc>
|
|
||||||
struct object_with_zone<std::vector<bool, Alloc> > {
|
|
||||||
void operator()(msgpack::object::with_zone& o, const std::vector<bool, 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(v.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 std::vector<bool, Alloc>::const_iterator it(v.begin());
|
|
||||||
do {
|
|
||||||
*p = msgpack::object(static_cast<bool>(*it), o.zone);
|
|
||||||
++p;
|
|
||||||
++it;
|
|
||||||
} while(p < pend);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace adaptor
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
} // MSGPACK_API_VERSION_NAMESPACE(v1)
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
#endif // MSGPACK_TYPE_VECTOR_BOOL_HPP
|
|
||||||
@@ -1,113 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// 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_VECTOR_CHAR_HPP
|
|
||||||
#define MSGPACK_TYPE_VECTOR_CHAR_HPP
|
|
||||||
|
|
||||||
#include "msgpack/versioning.hpp"
|
|
||||||
#include "msgpack/adaptor/adaptor_base.hpp"
|
|
||||||
#include "msgpack/adaptor/check_container_size.hpp"
|
|
||||||
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
namespace msgpack {
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
MSGPACK_API_VERSION_NAMESPACE(v1) {
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
namespace adaptor {
|
|
||||||
|
|
||||||
template <typename Alloc>
|
|
||||||
struct convert<std::vector<char, Alloc> > {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, std::vector<char, Alloc>& v) const {
|
|
||||||
switch (o.type) {
|
|
||||||
case msgpack::type::BIN:
|
|
||||||
v.resize(o.via.bin.size);
|
|
||||||
if (o.via.bin.size != 0) {
|
|
||||||
#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__)
|
|
||||||
std::memcpy(&v.front(), o.via.bin.ptr, o.via.bin.size);
|
|
||||||
#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && !defined(__clang__)
|
|
||||||
#pragma GCC diagnostic pop
|
|
||||||
#endif // (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && !defined(__clang__)
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case msgpack::type::STR:
|
|
||||||
v.resize(o.via.str.size);
|
|
||||||
if (o.via.str.size != 0) {
|
|
||||||
#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__)
|
|
||||||
std::memcpy(&v.front(), o.via.str.ptr, o.via.str.size);
|
|
||||||
#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && !defined(__clang__)
|
|
||||||
#pragma GCC diagnostic pop
|
|
||||||
#endif // (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && !defined(__clang__)
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
throw msgpack::type_error();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Alloc>
|
|
||||||
struct pack<std::vector<char, Alloc> > {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::vector<char, Alloc>& v) const {
|
|
||||||
uint32_t size = checked_get_container_size(v.size());
|
|
||||||
o.pack_bin(size);
|
|
||||||
if (size != 0) {
|
|
||||||
o.pack_bin_body(&v.front(), size);
|
|
||||||
}
|
|
||||||
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Alloc>
|
|
||||||
struct object<std::vector<char, Alloc> > {
|
|
||||||
void operator()(msgpack::object& o, const std::vector<char, Alloc>& v) const {
|
|
||||||
uint32_t size = checked_get_container_size(v.size());
|
|
||||||
o.type = msgpack::type::BIN;
|
|
||||||
if (size != 0) {
|
|
||||||
o.via.bin.ptr = &v.front();
|
|
||||||
}
|
|
||||||
o.via.bin.size = size;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Alloc>
|
|
||||||
struct object_with_zone<std::vector<char, Alloc> > {
|
|
||||||
void operator()(msgpack::object::with_zone& o, const std::vector<char, Alloc>& v) const {
|
|
||||||
uint32_t size = checked_get_container_size(v.size());
|
|
||||||
o.type = msgpack::type::BIN;
|
|
||||||
o.via.bin.size = size;
|
|
||||||
if (size != 0) {
|
|
||||||
char* ptr = static_cast<char*>(o.zone.allocate_align(size));
|
|
||||||
o.via.bin.ptr = ptr;
|
|
||||||
std::memcpy(ptr, &v.front(), size);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace adaptor
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
} // MSGPACK_API_VERSION_NAMESPACE(v1)
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
#endif // MSGPACK_TYPE_VECTOR_CHAR_HPP
|
|
||||||
@@ -1,113 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// 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_VECTOR_UNSIGNED_CHAR_HPP
|
|
||||||
#define MSGPACK_TYPE_VECTOR_UNSIGNED_CHAR_HPP
|
|
||||||
|
|
||||||
#include "msgpack/versioning.hpp"
|
|
||||||
#include "msgpack/adaptor/adaptor_base.hpp"
|
|
||||||
#include "msgpack/adaptor/check_container_size.hpp"
|
|
||||||
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
namespace msgpack {
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
MSGPACK_API_VERSION_NAMESPACE(v1) {
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
namespace adaptor {
|
|
||||||
|
|
||||||
template <typename Alloc>
|
|
||||||
struct convert<std::vector<unsigned char, Alloc> > {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, std::vector<unsigned char, Alloc>& v) const {
|
|
||||||
switch (o.type) {
|
|
||||||
case msgpack::type::BIN:
|
|
||||||
v.resize(o.via.bin.size);
|
|
||||||
if (o.via.bin.size != 0) {
|
|
||||||
#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__)
|
|
||||||
std::memcpy(&v.front(), o.via.bin.ptr, o.via.bin.size);
|
|
||||||
#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && !defined(__clang__)
|
|
||||||
#pragma GCC diagnostic pop
|
|
||||||
#endif // (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && !defined(__clang__)
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case msgpack::type::STR:
|
|
||||||
v.resize(o.via.str.size);
|
|
||||||
if (o.via.str.size != 0) {
|
|
||||||
#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__)
|
|
||||||
std::memcpy(&v.front(), o.via.str.ptr, o.via.str.size);
|
|
||||||
#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && !defined(__clang__)
|
|
||||||
#pragma GCC diagnostic pop
|
|
||||||
#endif // (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && !defined(__clang__)
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
throw msgpack::type_error();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Alloc>
|
|
||||||
struct pack<std::vector<unsigned char, Alloc> > {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::vector<unsigned char, Alloc>& v) const {
|
|
||||||
uint32_t size = checked_get_container_size(v.size());
|
|
||||||
o.pack_bin(size);
|
|
||||||
if (size != 0) {
|
|
||||||
o.pack_bin_body(reinterpret_cast<char const*>(&v.front()), size);
|
|
||||||
}
|
|
||||||
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Alloc>
|
|
||||||
struct object<std::vector<unsigned char, Alloc> > {
|
|
||||||
void operator()(msgpack::object& o, const std::vector<unsigned char, Alloc>& v) const {
|
|
||||||
uint32_t size = checked_get_container_size(v.size());
|
|
||||||
o.type = msgpack::type::BIN;
|
|
||||||
if (size != 0) {
|
|
||||||
o.via.bin.ptr = reinterpret_cast<char const*>(&v.front());
|
|
||||||
}
|
|
||||||
o.via.bin.size = size;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Alloc>
|
|
||||||
struct object_with_zone<std::vector<unsigned char, Alloc> > {
|
|
||||||
void operator()(msgpack::object::with_zone& o, const std::vector<unsigned char, Alloc>& v) const {
|
|
||||||
uint32_t size = checked_get_container_size(v.size());
|
|
||||||
o.type = msgpack::type::BIN;
|
|
||||||
o.via.bin.size = size;
|
|
||||||
if (size != 0) {
|
|
||||||
char* ptr = static_cast<char*>(o.zone.allocate_align(size));
|
|
||||||
o.via.bin.ptr = ptr;
|
|
||||||
std::memcpy(ptr, &v.front(), size);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace adaptor
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
} // MSGPACK_API_VERSION_NAMESPACE(v1)
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
#endif // MSGPACK_TYPE_VECTOR_UNSIGNED_CHAR_HPP
|
|
||||||
@@ -1,124 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ C++03/C++11 Adaptation
|
|
||||||
//
|
|
||||||
// Copyright (C) 2013 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_CPP_CONFIG_HPP
|
|
||||||
#define MSGPACK_CPP_CONFIG_HPP
|
|
||||||
|
|
||||||
#include "msgpack/versioning.hpp"
|
|
||||||
|
|
||||||
#if !defined(MSGPACK_USE_CPP03)
|
|
||||||
# if defined(_MSC_VER)
|
|
||||||
# if _MSC_VER < 1900
|
|
||||||
# define MSGPACK_USE_CPP03
|
|
||||||
# endif
|
|
||||||
# elif (__cplusplus < 201103L)
|
|
||||||
# define MSGPACK_USE_CPP03
|
|
||||||
# endif
|
|
||||||
#endif // MSGPACK_USE_CPP03
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#if defined(MSGPACK_USE_CPP03)
|
|
||||||
|
|
||||||
#if !defined(nullptr)
|
|
||||||
# if _MSC_VER < 1600
|
|
||||||
# define nullptr (0)
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <memory>
|
|
||||||
|
|
||||||
namespace msgpack {
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
MSGPACK_API_VERSION_NAMESPACE(v1) {
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct unique_ptr : std::auto_ptr<T> {
|
|
||||||
explicit unique_ptr(T* p = 0) throw() : std::auto_ptr<T>(p) {}
|
|
||||||
unique_ptr(unique_ptr& a) throw() : std::auto_ptr<T>(a) {}
|
|
||||||
template<class Y>
|
|
||||||
unique_ptr (unique_ptr<Y>& a) throw() : std::auto_ptr<T>(a) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
T& move(T& t)
|
|
||||||
{
|
|
||||||
return t;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
T const& move(T const& t)
|
|
||||||
{
|
|
||||||
return t;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <bool P, typename T = void>
|
|
||||||
struct enable_if {
|
|
||||||
typedef T type;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct enable_if<false, T> {
|
|
||||||
};
|
|
||||||
|
|
||||||
template<typename T, T val>
|
|
||||||
struct integral_constant {
|
|
||||||
static T const value = val;
|
|
||||||
typedef T value_type;
|
|
||||||
typedef integral_constant<T, val> type;
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef integral_constant<bool, true> true_type;
|
|
||||||
typedef integral_constant<bool, false> false_type;
|
|
||||||
|
|
||||||
template<class T, class U>
|
|
||||||
struct is_same : false_type {};
|
|
||||||
|
|
||||||
template<class T>
|
|
||||||
struct is_same<T, T> : true_type {};
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
} // MSGPACK_API_VERSION_NAMESPACE(v1)
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
|
|
||||||
#else // MSGPACK_USE_CPP03
|
|
||||||
|
|
||||||
#include <memory>
|
|
||||||
#include <tuple>
|
|
||||||
|
|
||||||
namespace msgpack {
|
|
||||||
/// @cond
|
|
||||||
MSGPACK_API_VERSION_NAMESPACE(v1) {
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
// unique_ptr
|
|
||||||
using std::unique_ptr;
|
|
||||||
// using std::make_unique; // since C++14
|
|
||||||
using std::hash;
|
|
||||||
|
|
||||||
// utility
|
|
||||||
using std::move;
|
|
||||||
using std::swap;
|
|
||||||
using std::enable_if;
|
|
||||||
using std::is_same;
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
} // MSGPACK_API_VERSION_NAMESPACE(v1)
|
|
||||||
/// @endcond
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
|
|
||||||
#endif // MSGPACK_USE_CPP03
|
|
||||||
|
|
||||||
#endif /* msgpack/cpp_config.hpp */
|
|
||||||
@@ -1,669 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ memory pool
|
|
||||||
//
|
|
||||||
// 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_CPP03_ZONE_HPP
|
|
||||||
#define MSGPACK_CPP03_ZONE_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
|
|
||||||
|
|
||||||
|
|
||||||
namespace msgpack {
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
MSGPACK_API_VERSION_NAMESPACE(v1) {
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
class zone {
|
|
||||||
struct finalizer {
|
|
||||||
finalizer(void (*func)(void*), void* data):m_func(func), m_data(data) {}
|
|
||||||
void operator()() { m_func(m_data); }
|
|
||||||
void (*m_func)(void*);
|
|
||||||
void* m_data;
|
|
||||||
};
|
|
||||||
struct finalizer_array {
|
|
||||||
finalizer_array():m_tail(nullptr), m_end(nullptr), m_array(nullptr) {}
|
|
||||||
void call() {
|
|
||||||
finalizer* fin = m_tail;
|
|
||||||
for(; fin != m_array; --fin) (*(fin-1))();
|
|
||||||
}
|
|
||||||
~finalizer_array() {
|
|
||||||
call();
|
|
||||||
::free(m_array);
|
|
||||||
}
|
|
||||||
void clear() {
|
|
||||||
call();
|
|
||||||
m_tail = m_array;
|
|
||||||
}
|
|
||||||
void push(void (*func)(void* data), void* data)
|
|
||||||
{
|
|
||||||
finalizer* fin = m_tail;
|
|
||||||
|
|
||||||
if(fin == m_end) {
|
|
||||||
push_expand(func, data);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
fin->m_func = func;
|
|
||||||
fin->m_data = data;
|
|
||||||
|
|
||||||
++m_tail;
|
|
||||||
}
|
|
||||||
void push_expand(void (*func)(void*), void* data) {
|
|
||||||
const size_t nused = m_end - m_array;
|
|
||||||
size_t nnext;
|
|
||||||
if(nused == 0) {
|
|
||||||
nnext = (sizeof(finalizer) < 72/2) ?
|
|
||||||
72 / sizeof(finalizer) : 8;
|
|
||||||
} else {
|
|
||||||
nnext = nused * 2;
|
|
||||||
}
|
|
||||||
finalizer* tmp =
|
|
||||||
static_cast<finalizer*>(::realloc(m_array, sizeof(finalizer) * nnext));
|
|
||||||
if(!tmp) {
|
|
||||||
throw std::bad_alloc();
|
|
||||||
}
|
|
||||||
m_array = tmp;
|
|
||||||
m_end = tmp + nnext;
|
|
||||||
m_tail = tmp + nused;
|
|
||||||
new (m_tail) finalizer(func, data);
|
|
||||||
|
|
||||||
++m_tail;
|
|
||||||
}
|
|
||||||
finalizer* m_tail;
|
|
||||||
finalizer* m_end;
|
|
||||||
finalizer* m_array;
|
|
||||||
};
|
|
||||||
struct chunk {
|
|
||||||
chunk* m_next;
|
|
||||||
};
|
|
||||||
struct chunk_list {
|
|
||||||
chunk_list(size_t chunk_size)
|
|
||||||
{
|
|
||||||
chunk* c = static_cast<chunk*>(::malloc(sizeof(chunk) + chunk_size));
|
|
||||||
if(!c) {
|
|
||||||
throw std::bad_alloc();
|
|
||||||
}
|
|
||||||
|
|
||||||
m_head = c;
|
|
||||||
m_free = chunk_size;
|
|
||||||
m_ptr = reinterpret_cast<char*>(c) + sizeof(chunk);
|
|
||||||
c->m_next = nullptr;
|
|
||||||
}
|
|
||||||
~chunk_list()
|
|
||||||
{
|
|
||||||
chunk* c = m_head;
|
|
||||||
while(c) {
|
|
||||||
chunk* n = c->m_next;
|
|
||||||
::free(c);
|
|
||||||
c = n;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
void clear(size_t chunk_size)
|
|
||||||
{
|
|
||||||
chunk* c = m_head;
|
|
||||||
while(true) {
|
|
||||||
chunk* n = c->m_next;
|
|
||||||
if(n) {
|
|
||||||
::free(c);
|
|
||||||
c = n;
|
|
||||||
} else {
|
|
||||||
m_head = c;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
m_head->m_next = nullptr;
|
|
||||||
m_free = chunk_size;
|
|
||||||
m_ptr = reinterpret_cast<char*>(m_head) + sizeof(chunk);
|
|
||||||
}
|
|
||||||
size_t m_free;
|
|
||||||
char* m_ptr;
|
|
||||||
chunk* m_head;
|
|
||||||
};
|
|
||||||
size_t m_chunk_size;
|
|
||||||
chunk_list m_chunk_list;
|
|
||||||
finalizer_array m_finalizer_array;
|
|
||||||
|
|
||||||
public:
|
|
||||||
zone(size_t chunk_size = MSGPACK_ZONE_CHUNK_SIZE) /* throw() */;
|
|
||||||
|
|
||||||
public:
|
|
||||||
void* allocate_align(size_t size, size_t align = MSGPACK_ZONE_ALIGN);
|
|
||||||
void* allocate_no_align(size_t size);
|
|
||||||
|
|
||||||
void push_finalizer(void (*func)(void*), void* data);
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
void push_finalizer(msgpack::unique_ptr<T> obj);
|
|
||||||
|
|
||||||
void clear();
|
|
||||||
|
|
||||||
void swap(zone& o);
|
|
||||||
static void* operator new(std::size_t size)
|
|
||||||
{
|
|
||||||
void* p = ::malloc(size);
|
|
||||||
if (!p) throw std::bad_alloc();
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
static void operator delete(void *p) /* throw() */
|
|
||||||
{
|
|
||||||
::free(p);
|
|
||||||
}
|
|
||||||
static void* operator new(std::size_t size, void* place) /* throw() */
|
|
||||||
{
|
|
||||||
return ::operator new(size, place);
|
|
||||||
}
|
|
||||||
static void operator delete(void* p, void* place) /* throw() */
|
|
||||||
{
|
|
||||||
::operator delete(p, place);
|
|
||||||
}
|
|
||||||
/// @cond
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
T* allocate();
|
|
||||||
|
|
||||||
template <typename T, typename A1>
|
|
||||||
T* allocate(A1 a1);
|
|
||||||
|
|
||||||
template <typename T, typename A1, typename A2>
|
|
||||||
T* allocate(A1 a1, A2 a2);
|
|
||||||
|
|
||||||
template <typename T, typename A1, typename A2, typename A3>
|
|
||||||
T* allocate(A1 a1, A2 a2, A3 a3);
|
|
||||||
|
|
||||||
template <typename T, typename A1, typename A2, typename A3, typename A4>
|
|
||||||
T* allocate(A1 a1, A2 a2, A3 a3, A4 a4);
|
|
||||||
|
|
||||||
template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5>
|
|
||||||
T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5);
|
|
||||||
|
|
||||||
template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
|
|
||||||
T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6);
|
|
||||||
|
|
||||||
template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7>
|
|
||||||
T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7);
|
|
||||||
|
|
||||||
template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8>
|
|
||||||
T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8);
|
|
||||||
|
|
||||||
template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9>
|
|
||||||
T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9);
|
|
||||||
|
|
||||||
template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10>
|
|
||||||
T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10);
|
|
||||||
|
|
||||||
template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11>
|
|
||||||
T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11);
|
|
||||||
|
|
||||||
template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12>
|
|
||||||
T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12);
|
|
||||||
|
|
||||||
template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename A13>
|
|
||||||
T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12, A13 a13);
|
|
||||||
|
|
||||||
template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename A13, typename A14>
|
|
||||||
T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12, A13 a13, A14 a14);
|
|
||||||
|
|
||||||
template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename A13, typename A14, typename A15>
|
|
||||||
T* allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12, A13 a13, A14 a14, A15 a15);
|
|
||||||
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
private:
|
|
||||||
void undo_allocate(size_t size);
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
static void object_destruct(void* obj);
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
static void object_delete(void* obj);
|
|
||||||
|
|
||||||
void* allocate_expand(size_t size);
|
|
||||||
private:
|
|
||||||
zone(const zone&);
|
|
||||||
zone& operator=(const zone&);
|
|
||||||
};
|
|
||||||
|
|
||||||
inline zone::zone(size_t chunk_size) /* throw() */ :m_chunk_size(chunk_size), m_chunk_list(m_chunk_size)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void* zone::allocate_align(size_t size, size_t align)
|
|
||||||
{
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
return reinterpret_cast<char*>(
|
|
||||||
reinterpret_cast<size_t>(
|
|
||||||
allocate_expand(size + (align - 1))) / align * align);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void* zone::allocate_no_align(size_t size)
|
|
||||||
{
|
|
||||||
if(m_chunk_list.m_free < 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 void* zone::allocate_expand(size_t size)
|
|
||||||
{
|
|
||||||
chunk_list* const cl = &m_chunk_list;
|
|
||||||
|
|
||||||
size_t sz = m_chunk_size;
|
|
||||||
|
|
||||||
while(sz < size) {
|
|
||||||
size_t tmp_sz = sz * 2;
|
|
||||||
if (tmp_sz <= sz) {
|
|
||||||
sz = size;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
sz = tmp_sz;
|
|
||||||
}
|
|
||||||
|
|
||||||
chunk* c = static_cast<chunk*>(::malloc(sizeof(chunk) + sz));
|
|
||||||
if (!c) throw std::bad_alloc();
|
|
||||||
|
|
||||||
char* ptr = reinterpret_cast<char*>(c) + sizeof(chunk);
|
|
||||||
|
|
||||||
c->m_next = cl->m_head;
|
|
||||||
cl->m_head = c;
|
|
||||||
cl->m_free = sz - size;
|
|
||||||
cl->m_ptr = ptr + size;
|
|
||||||
|
|
||||||
return ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void zone::push_finalizer(void (*func)(void*), void* data)
|
|
||||||
{
|
|
||||||
m_finalizer_array.push(func, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
inline void zone::push_finalizer(msgpack::unique_ptr<T> obj)
|
|
||||||
{
|
|
||||||
m_finalizer_array.push(&zone::object_delete<T>, obj.release());
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void zone::clear()
|
|
||||||
{
|
|
||||||
m_finalizer_array.clear();
|
|
||||||
m_chunk_list.clear(m_chunk_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void zone::swap(zone& o)
|
|
||||||
{
|
|
||||||
using std::swap;
|
|
||||||
swap(m_chunk_size, o.m_chunk_size);
|
|
||||||
swap(m_chunk_list, o.m_chunk_list);
|
|
||||||
swap(m_finalizer_array, o.m_finalizer_array);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
void zone::object_destruct(void* obj)
|
|
||||||
{
|
|
||||||
static_cast<T*>(obj)->~T();
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
void zone::object_delete(void* obj)
|
|
||||||
{
|
|
||||||
delete static_cast<T*>(obj);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void zone::undo_allocate(size_t size)
|
|
||||||
{
|
|
||||||
m_chunk_list.m_ptr -= size;
|
|
||||||
m_chunk_list.m_free += size;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline std::size_t aligned_size(
|
|
||||||
std::size_t size,
|
|
||||||
std::size_t align = MSGPACK_ZONE_ALIGN) {
|
|
||||||
return (size + align - 1) / align * align;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
T* zone::allocate()
|
|
||||||
{
|
|
||||||
void* x = allocate_align(sizeof(T));
|
|
||||||
try {
|
|
||||||
m_finalizer_array.push(&zone::object_destruct<T>, x);
|
|
||||||
} catch (...) {
|
|
||||||
undo_allocate(sizeof(T));
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
return new (x) T();
|
|
||||||
} catch (...) {
|
|
||||||
--m_finalizer_array.m_tail;
|
|
||||||
undo_allocate(sizeof(T));
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T, typename A1>
|
|
||||||
T* zone::allocate(A1 a1)
|
|
||||||
{
|
|
||||||
void* x = allocate_align(sizeof(T));
|
|
||||||
try {
|
|
||||||
m_finalizer_array.push(&zone::object_destruct<T>, x);
|
|
||||||
} catch (...) {
|
|
||||||
undo_allocate(sizeof(T));
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
return new (x) T(a1);
|
|
||||||
} catch (...) {
|
|
||||||
--m_finalizer_array.m_tail;
|
|
||||||
undo_allocate(sizeof(T));
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T, typename A1, typename A2>
|
|
||||||
T* zone::allocate(A1 a1, A2 a2)
|
|
||||||
{
|
|
||||||
void* x = allocate_align(sizeof(T));
|
|
||||||
try {
|
|
||||||
m_finalizer_array.push(&zone::object_destruct<T>, x);
|
|
||||||
} catch (...) {
|
|
||||||
undo_allocate(sizeof(T));
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
return new (x) T(a1, a2);
|
|
||||||
} catch (...) {
|
|
||||||
--m_finalizer_array.m_tail;
|
|
||||||
undo_allocate(sizeof(T));
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T, typename A1, typename A2, typename A3>
|
|
||||||
T* zone::allocate(A1 a1, A2 a2, A3 a3)
|
|
||||||
{
|
|
||||||
void* x = allocate_align(sizeof(T));
|
|
||||||
try {
|
|
||||||
m_finalizer_array.push(&zone::object_destruct<T>, x);
|
|
||||||
} catch (...) {
|
|
||||||
undo_allocate(sizeof(T));
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
return new (x) T(a1, a2, a3);
|
|
||||||
} catch (...) {
|
|
||||||
--m_finalizer_array.m_tail;
|
|
||||||
undo_allocate(sizeof(T));
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T, typename A1, typename A2, typename A3, typename A4>
|
|
||||||
T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4)
|
|
||||||
{
|
|
||||||
void* x = allocate_align(sizeof(T));
|
|
||||||
try {
|
|
||||||
m_finalizer_array.push(&zone::object_destruct<T>, x);
|
|
||||||
} catch (...) {
|
|
||||||
undo_allocate(sizeof(T));
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
return new (x) T(a1, a2, a3, a4);
|
|
||||||
} catch (...) {
|
|
||||||
--m_finalizer_array.m_tail;
|
|
||||||
undo_allocate(sizeof(T));
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5>
|
|
||||||
T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5)
|
|
||||||
{
|
|
||||||
void* x = allocate_align(sizeof(T));
|
|
||||||
try {
|
|
||||||
m_finalizer_array.push(&zone::object_destruct<T>, x);
|
|
||||||
} catch (...) {
|
|
||||||
undo_allocate(sizeof(T));
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
return new (x) T(a1, a2, a3, a4, a5);
|
|
||||||
} catch (...) {
|
|
||||||
--m_finalizer_array.m_tail;
|
|
||||||
undo_allocate(sizeof(T));
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
|
|
||||||
T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6)
|
|
||||||
{
|
|
||||||
void* x = allocate_align(sizeof(T));
|
|
||||||
try {
|
|
||||||
m_finalizer_array.push(&zone::object_destruct<T>, x);
|
|
||||||
} catch (...) {
|
|
||||||
undo_allocate(sizeof(T));
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
return new (x) T(a1, a2, a3, a4, a5, a6);
|
|
||||||
} catch (...) {
|
|
||||||
--m_finalizer_array.m_tail;
|
|
||||||
undo_allocate(sizeof(T));
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7>
|
|
||||||
T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7)
|
|
||||||
{
|
|
||||||
void* x = allocate_align(sizeof(T));
|
|
||||||
try {
|
|
||||||
m_finalizer_array.push(&zone::object_destruct<T>, x);
|
|
||||||
} catch (...) {
|
|
||||||
undo_allocate(sizeof(T));
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
return new (x) T(a1, a2, a3, a4, a5, a6, a7);
|
|
||||||
} catch (...) {
|
|
||||||
--m_finalizer_array.m_tail;
|
|
||||||
undo_allocate(sizeof(T));
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8>
|
|
||||||
T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8)
|
|
||||||
{
|
|
||||||
void* x = allocate_align(sizeof(T));
|
|
||||||
try {
|
|
||||||
m_finalizer_array.push(&zone::object_destruct<T>, x);
|
|
||||||
} catch (...) {
|
|
||||||
undo_allocate(sizeof(T));
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8);
|
|
||||||
} catch (...) {
|
|
||||||
--m_finalizer_array.m_tail;
|
|
||||||
undo_allocate(sizeof(T));
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9>
|
|
||||||
T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9)
|
|
||||||
{
|
|
||||||
void* x = allocate_align(sizeof(T));
|
|
||||||
try {
|
|
||||||
m_finalizer_array.push(&zone::object_destruct<T>, x);
|
|
||||||
} catch (...) {
|
|
||||||
undo_allocate(sizeof(T));
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9);
|
|
||||||
} catch (...) {
|
|
||||||
--m_finalizer_array.m_tail;
|
|
||||||
undo_allocate(sizeof(T));
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10>
|
|
||||||
T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10)
|
|
||||||
{
|
|
||||||
void* x = allocate_align(sizeof(T));
|
|
||||||
try {
|
|
||||||
m_finalizer_array.push(&zone::object_destruct<T>, x);
|
|
||||||
} catch (...) {
|
|
||||||
undo_allocate(sizeof(T));
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
|
|
||||||
} catch (...) {
|
|
||||||
--m_finalizer_array.m_tail;
|
|
||||||
undo_allocate(sizeof(T));
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11>
|
|
||||||
T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11)
|
|
||||||
{
|
|
||||||
void* x = allocate_align(sizeof(T));
|
|
||||||
try {
|
|
||||||
m_finalizer_array.push(&zone::object_destruct<T>, x);
|
|
||||||
} catch (...) {
|
|
||||||
undo_allocate(sizeof(T));
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);
|
|
||||||
} catch (...) {
|
|
||||||
--m_finalizer_array.m_tail;
|
|
||||||
undo_allocate(sizeof(T));
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12>
|
|
||||||
T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12)
|
|
||||||
{
|
|
||||||
void* x = allocate_align(sizeof(T));
|
|
||||||
try {
|
|
||||||
m_finalizer_array.push(&zone::object_destruct<T>, x);
|
|
||||||
} catch (...) {
|
|
||||||
undo_allocate(sizeof(T));
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12);
|
|
||||||
} catch (...) {
|
|
||||||
--m_finalizer_array.m_tail;
|
|
||||||
undo_allocate(sizeof(T));
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename A13>
|
|
||||||
T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12, A13 a13)
|
|
||||||
{
|
|
||||||
void* x = allocate_align(sizeof(T));
|
|
||||||
try {
|
|
||||||
m_finalizer_array.push(&zone::object_destruct<T>, x);
|
|
||||||
} catch (...) {
|
|
||||||
undo_allocate(sizeof(T));
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13);
|
|
||||||
} catch (...) {
|
|
||||||
--m_finalizer_array.m_tail;
|
|
||||||
undo_allocate(sizeof(T));
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename A13, typename A14>
|
|
||||||
T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12, A13 a13, A14 a14)
|
|
||||||
{
|
|
||||||
void* x = allocate_align(sizeof(T));
|
|
||||||
try {
|
|
||||||
m_finalizer_array.push(&zone::object_destruct<T>, x);
|
|
||||||
} catch (...) {
|
|
||||||
undo_allocate(sizeof(T));
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14);
|
|
||||||
} catch (...) {
|
|
||||||
--m_finalizer_array.m_tail;
|
|
||||||
undo_allocate(sizeof(T));
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename A13, typename A14, typename A15>
|
|
||||||
T* zone::allocate(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9, A10 a10, A11 a11, A12 a12, A13 a13, A14 a14, A15 a15)
|
|
||||||
{
|
|
||||||
void* x = allocate_align(sizeof(T));
|
|
||||||
try {
|
|
||||||
m_finalizer_array.push(&zone::object_destruct<T>, x);
|
|
||||||
} catch (...) {
|
|
||||||
undo_allocate(sizeof(T));
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
return new (x) T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15);
|
|
||||||
} catch (...) {
|
|
||||||
--m_finalizer_array.m_tail;
|
|
||||||
undo_allocate(sizeof(T));
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
} // MSGPACK_API_VERSION_NAMESPACE(v1)
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
#endif // MSGPACK_CPP03_ZONE_HPP
|
|
||||||
@@ -1,368 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ memory pool
|
|
||||||
//
|
|
||||||
// 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_CPP11_ZONE_HPP
|
|
||||||
#define MSGPACK_CPP11_ZONE_HPP
|
|
||||||
|
|
||||||
#include "msgpack/versioning.hpp"
|
|
||||||
|
|
||||||
#include <cstdlib>
|
|
||||||
#include <memory>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include "msgpack/cpp_config.hpp"
|
|
||||||
|
|
||||||
#ifndef MSGPACK_ZONE_CHUNK_SIZE
|
|
||||||
#define MSGPACK_ZONE_CHUNK_SIZE 8192
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef MSGPACK_ZONE_ALIGN
|
|
||||||
#define MSGPACK_ZONE_ALIGN sizeof(void*)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace msgpack {
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
MSGPACK_API_VERSION_NAMESPACE(v1) {
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
class zone {
|
|
||||||
private:
|
|
||||||
struct finalizer {
|
|
||||||
finalizer(void (*func)(void*), void* data):m_func(func), m_data(data) {}
|
|
||||||
void operator()() { m_func(m_data); }
|
|
||||||
void (*m_func)(void*);
|
|
||||||
void* m_data;
|
|
||||||
};
|
|
||||||
struct finalizer_array {
|
|
||||||
finalizer_array():m_tail(nullptr), m_end(nullptr), m_array(nullptr) {}
|
|
||||||
void call() {
|
|
||||||
finalizer* fin = m_tail;
|
|
||||||
for(; fin != m_array; --fin) (*(fin-1))();
|
|
||||||
}
|
|
||||||
~finalizer_array() {
|
|
||||||
call();
|
|
||||||
::free(m_array);
|
|
||||||
}
|
|
||||||
void clear() {
|
|
||||||
call();
|
|
||||||
m_tail = m_array;
|
|
||||||
}
|
|
||||||
void push(void (*func)(void* data), void* data)
|
|
||||||
{
|
|
||||||
finalizer* fin = m_tail;
|
|
||||||
|
|
||||||
if(fin == m_end) {
|
|
||||||
push_expand(func, data);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
fin->m_func = func;
|
|
||||||
fin->m_data = data;
|
|
||||||
|
|
||||||
++m_tail;
|
|
||||||
}
|
|
||||||
void push_expand(void (*func)(void*), void* data) {
|
|
||||||
const size_t nused = m_end - m_array;
|
|
||||||
size_t nnext;
|
|
||||||
if(nused == 0) {
|
|
||||||
nnext = (sizeof(finalizer) < 72/2) ?
|
|
||||||
72 / sizeof(finalizer) : 8;
|
|
||||||
} else {
|
|
||||||
nnext = nused * 2;
|
|
||||||
}
|
|
||||||
finalizer* tmp =
|
|
||||||
static_cast<finalizer*>(::realloc(m_array, sizeof(finalizer) * nnext));
|
|
||||||
if(!tmp) {
|
|
||||||
throw std::bad_alloc();
|
|
||||||
}
|
|
||||||
m_array = tmp;
|
|
||||||
m_end = tmp + nnext;
|
|
||||||
m_tail = tmp + nused;
|
|
||||||
new (m_tail) finalizer(func, data);
|
|
||||||
|
|
||||||
++m_tail;
|
|
||||||
}
|
|
||||||
finalizer_array(finalizer_array&& other) noexcept
|
|
||||||
:m_tail(other.m_tail), m_end(other.m_end), m_array(other.m_array)
|
|
||||||
{
|
|
||||||
other.m_tail = nullptr;
|
|
||||||
other.m_end = nullptr;
|
|
||||||
other.m_array = nullptr;
|
|
||||||
}
|
|
||||||
finalizer_array& operator=(finalizer_array&& other) noexcept
|
|
||||||
{
|
|
||||||
this->~finalizer_array();
|
|
||||||
new (this) finalizer_array(std::move(other));
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
finalizer* m_tail;
|
|
||||||
finalizer* m_end;
|
|
||||||
finalizer* m_array;
|
|
||||||
|
|
||||||
private:
|
|
||||||
finalizer_array(const finalizer_array&);
|
|
||||||
finalizer_array& operator=(const finalizer_array&);
|
|
||||||
};
|
|
||||||
struct chunk {
|
|
||||||
chunk* m_next;
|
|
||||||
};
|
|
||||||
struct chunk_list {
|
|
||||||
chunk_list(size_t chunk_size)
|
|
||||||
{
|
|
||||||
chunk* c = static_cast<chunk*>(::malloc(sizeof(chunk) + chunk_size));
|
|
||||||
if(!c) {
|
|
||||||
throw std::bad_alloc();
|
|
||||||
}
|
|
||||||
|
|
||||||
m_head = c;
|
|
||||||
m_free = chunk_size;
|
|
||||||
m_ptr = reinterpret_cast<char*>(c) + sizeof(chunk);
|
|
||||||
c->m_next = nullptr;
|
|
||||||
}
|
|
||||||
~chunk_list()
|
|
||||||
{
|
|
||||||
chunk* c = m_head;
|
|
||||||
while(c) {
|
|
||||||
chunk* n = c->m_next;
|
|
||||||
::free(c);
|
|
||||||
c = n;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
void clear(size_t chunk_size)
|
|
||||||
{
|
|
||||||
chunk* c = m_head;
|
|
||||||
while(true) {
|
|
||||||
chunk* n = c->m_next;
|
|
||||||
if(n) {
|
|
||||||
::free(c);
|
|
||||||
c = n;
|
|
||||||
} else {
|
|
||||||
m_head = c;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
m_head->m_next = nullptr;
|
|
||||||
m_free = chunk_size;
|
|
||||||
m_ptr = reinterpret_cast<char*>(m_head) + sizeof(chunk);
|
|
||||||
}
|
|
||||||
chunk_list(chunk_list&& other) noexcept
|
|
||||||
:m_free(other.m_free), m_ptr(other.m_ptr), m_head(other.m_head)
|
|
||||||
{
|
|
||||||
other.m_head = nullptr;
|
|
||||||
}
|
|
||||||
chunk_list& operator=(chunk_list&& other) noexcept
|
|
||||||
{
|
|
||||||
this->~chunk_list();
|
|
||||||
new (this) chunk_list(std::move(other));
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t m_free;
|
|
||||||
char* m_ptr;
|
|
||||||
chunk* m_head;
|
|
||||||
private:
|
|
||||||
chunk_list(const chunk_list&);
|
|
||||||
chunk_list& operator=(const chunk_list&);
|
|
||||||
};
|
|
||||||
size_t m_chunk_size;
|
|
||||||
chunk_list m_chunk_list;
|
|
||||||
finalizer_array m_finalizer_array;
|
|
||||||
|
|
||||||
public:
|
|
||||||
zone(size_t chunk_size = MSGPACK_ZONE_CHUNK_SIZE) noexcept;
|
|
||||||
|
|
||||||
public:
|
|
||||||
void* allocate_align(size_t size, size_t align = MSGPACK_ZONE_ALIGN);
|
|
||||||
void* allocate_no_align(size_t size);
|
|
||||||
|
|
||||||
void push_finalizer(void (*func)(void*), void* data);
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
void push_finalizer(msgpack::unique_ptr<T> obj);
|
|
||||||
|
|
||||||
void clear();
|
|
||||||
|
|
||||||
void swap(zone& o);
|
|
||||||
|
|
||||||
|
|
||||||
static void* operator new(std::size_t size)
|
|
||||||
{
|
|
||||||
void* p = ::malloc(size);
|
|
||||||
if (!p) throw std::bad_alloc();
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
static void operator delete(void *p) noexcept
|
|
||||||
{
|
|
||||||
::free(p);
|
|
||||||
}
|
|
||||||
static void* operator new(std::size_t /*size*/, void* mem) noexcept
|
|
||||||
{
|
|
||||||
return mem;
|
|
||||||
}
|
|
||||||
static void operator delete(void * /*p*/, void* /*mem*/) noexcept
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T, typename... Args>
|
|
||||||
T* allocate(Args... args);
|
|
||||||
|
|
||||||
zone(zone&&) = default;
|
|
||||||
zone& operator=(zone&&) = default;
|
|
||||||
zone(const zone&) = delete;
|
|
||||||
zone& operator=(const zone&) = delete;
|
|
||||||
|
|
||||||
private:
|
|
||||||
void undo_allocate(size_t size);
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
static void object_destruct(void* obj);
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
static void object_delete(void* obj);
|
|
||||||
|
|
||||||
void* allocate_expand(size_t size);
|
|
||||||
};
|
|
||||||
|
|
||||||
inline zone::zone(size_t chunk_size) noexcept:m_chunk_size(chunk_size), m_chunk_list(m_chunk_size)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void* zone::allocate_align(size_t size, size_t align)
|
|
||||||
{
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
return reinterpret_cast<char*>(
|
|
||||||
reinterpret_cast<size_t>(
|
|
||||||
allocate_expand(size + (align - 1))) / align * align);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void* zone::allocate_no_align(size_t size)
|
|
||||||
{
|
|
||||||
if(m_chunk_list.m_free < 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 void* zone::allocate_expand(size_t size)
|
|
||||||
{
|
|
||||||
chunk_list* const cl = &m_chunk_list;
|
|
||||||
|
|
||||||
size_t sz = m_chunk_size;
|
|
||||||
|
|
||||||
while(sz < size) {
|
|
||||||
size_t tmp_sz = sz * 2;
|
|
||||||
if (tmp_sz <= sz) {
|
|
||||||
sz = size;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
sz = tmp_sz;
|
|
||||||
}
|
|
||||||
|
|
||||||
chunk* c = static_cast<chunk*>(::malloc(sizeof(chunk) + sz));
|
|
||||||
if (!c) throw std::bad_alloc();
|
|
||||||
|
|
||||||
char* ptr = reinterpret_cast<char*>(c) + sizeof(chunk);
|
|
||||||
|
|
||||||
c->m_next = cl->m_head;
|
|
||||||
cl->m_head = c;
|
|
||||||
cl->m_free = sz - size;
|
|
||||||
cl->m_ptr = ptr + size;
|
|
||||||
|
|
||||||
return ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void zone::push_finalizer(void (*func)(void*), void* data)
|
|
||||||
{
|
|
||||||
m_finalizer_array.push(func, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
inline void zone::push_finalizer(msgpack::unique_ptr<T> obj)
|
|
||||||
{
|
|
||||||
m_finalizer_array.push(&zone::object_delete<T>, obj.release());
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void zone::clear()
|
|
||||||
{
|
|
||||||
m_finalizer_array.clear();
|
|
||||||
m_chunk_list.clear(m_chunk_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void zone::swap(zone& o)
|
|
||||||
{
|
|
||||||
std::swap(*this, o);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
void zone::object_delete(void* obj)
|
|
||||||
{
|
|
||||||
delete static_cast<T*>(obj);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
void zone::object_destruct(void* obj)
|
|
||||||
{
|
|
||||||
static_cast<T*>(obj)->~T();
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void zone::undo_allocate(size_t size)
|
|
||||||
{
|
|
||||||
m_chunk_list.m_ptr -= size;
|
|
||||||
m_chunk_list.m_free += size;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template <typename T, typename... Args>
|
|
||||||
T* zone::allocate(Args... args)
|
|
||||||
{
|
|
||||||
void* x = allocate_align(sizeof(T));
|
|
||||||
try {
|
|
||||||
m_finalizer_array.push(&zone::object_destruct<T>, x);
|
|
||||||
} catch (...) {
|
|
||||||
undo_allocate(sizeof(T));
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
return new (x) T(args...);
|
|
||||||
} catch (...) {
|
|
||||||
--m_finalizer_array.m_tail;
|
|
||||||
undo_allocate(sizeof(T));
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
inline std::size_t aligned_size(
|
|
||||||
std::size_t size,
|
|
||||||
std::size_t align = MSGPACK_ZONE_ALIGN) {
|
|
||||||
return (size + align - 1) / align * align;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
} // MSGPACK_API_VERSION_NAMESPACE(v1)
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
#endif // MSGPACK_CPP11_ZONE_HPP
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user