mirror of
https://github.com/msgpack/msgpack-c
synced 2026-06-08 16:11:40 +00:00
Compare commits
781 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 | |||
| cabd8a8a03 | |||
| 8640754417 | |||
| 7d1be40e10 | |||
| 3c271892e3 | |||
| 83ab53ecd4 | |||
| ba73841240 | |||
| 13afc54ccc | |||
| 2865a96ba5 | |||
| 79222b65a3 | |||
| 83f0429db8 | |||
| 6c035f7d2b | |||
| ed5a4123b5 | |||
| b8530e30df | |||
| 8bf2f33782 | |||
| 356fbcf187 | |||
| 1adf90e9df | |||
| c2f523e463 | |||
| 1e8f5d0d67 | |||
| 0a8d25cd35 | |||
| 72e0d1a424 | |||
| c06d4d70ef | |||
| 69f588dd36 | |||
| 65b47fa032 | |||
| 22fd249b12 | |||
| 96831350b8 | |||
| 5da3c031fd | |||
| 71eba2406d | |||
| 892fa8c2bd | |||
| 42e332bb8c | |||
| 40604c3d40 | |||
| e183efcce2 | |||
| 772e4e01a3 | |||
| 3660b495c3 | |||
| 7a02f03a82 | |||
| 953077b73f | |||
| ba15089d86 | |||
| b8ee27c672 | |||
| ee65a319ba | |||
| 46502480e9 | |||
| 50e1c23941 | |||
| b76c8aeb83 | |||
| b5599ef3fc | |||
| 39e7856c48 | |||
| 1a7aa5e5ec | |||
| aad5b96083 | |||
| dea3190d36 | |||
| c001a52582 | |||
| f58eb11fd5 | |||
| 134beee0cd | |||
| 434dae8424 | |||
| d8dd77884b | |||
| ea991d5a01 | |||
| 6a127eb24f | |||
| 5e57dc5da7 | |||
| d23a649427 | |||
| 12ae60fd77 | |||
| 282b0b5927 | |||
| 0a261fca42 | |||
| 20104301f3 | |||
| 428780db53 | |||
| 6bf5160bf2 | |||
| ef45359d81 | |||
| 3202bb6a2e | |||
| 63971da5a4 | |||
| 8a17e7f647 | |||
| 69607f4117 | |||
| e5948a3450 | |||
| 3fc061b5fd | |||
| 2b38389f68 | |||
| 9e4dfb2484 | |||
| 356a5ea42d | |||
| 93142323f0 | |||
| 3352b2f029 | |||
| 364658ea99 | |||
| 50088365df | |||
| d640395765 | |||
| be0f8c280a | |||
| 9b156823ff | |||
| dc2e1a4ead | |||
| 96f145812f | |||
| 33de24239a | |||
| d17c70cbb0 | |||
| 88ab7b6349 | |||
| df5f84d49d | |||
| 0609347d82 | |||
| 61eb4b1f6e | |||
| 9ee1168cc4 | |||
| 95e0fc5cef | |||
| a0b7e7cc27 | |||
| 92822996e2 | |||
| e9eac32238 | |||
| c61446b988 | |||
| 294aa52c3a | |||
| 90f7b9c732 | |||
| 720c18bcf8 | |||
| 23a040f2e5 | |||
| cd9d6c5940 | |||
| 8cae20ffc4 | |||
| 1788d6ce01 | |||
| 722143c0de | |||
| 57b030a6dd | |||
| 9c0f629c68 | |||
| 018c6c819e | |||
| 8d3673e7ee | |||
| 871a796037 | |||
| 4e65bc35ed | |||
| 062864a6b7 | |||
| 767099a0eb | |||
| 1c810bcb74 | |||
| 0fafa7a4b3 | |||
| c75009d513 | |||
| a1ca382b2d | |||
| 8eadc04d37 | |||
| 849ba867d6 | |||
| 11f2f333c6 | |||
| 94ddf1ac5d | |||
| 5da1abb1ce | |||
| efc27e8eb4 | |||
| 51dd7cbf22 | |||
| 866e73acc3 | |||
| a1fc7863e9 | |||
| 12b5a6235a | |||
| e50cc5d79f | |||
| 4501551267 | |||
| e719cbbb7a | |||
| 5adea26044 | |||
| 4b2b3a18df | |||
| 8f8d1800bd | |||
| 091715671c | |||
| 41bff7b96d | |||
| b13cb13efc | |||
| 38f946d2cf | |||
| 6007f4ea05 | |||
| 078eb3a436 | |||
| 22b6bb9f78 | |||
| 4dcd162879 | |||
| cd54ba99fc | |||
| d437961546 | |||
| f1679a17a2 | |||
| afc9666760 | |||
| d4199b59f9 | |||
| 7e2076b799 | |||
| 41f27b5d62 | |||
| d91c510d8c | |||
| ebb7c05bdc | |||
| 78b3e8adad | |||
| 3dc0e83513 | |||
| 298c97ec08 | |||
| 0f0598a6b9 | |||
| fee4faa82f | |||
| e182b06816 | |||
| f9a16ad690 | |||
| 2034427cfd | |||
| f986370634 | |||
| db588909b9 | |||
| 7e6a498c14 | |||
| 9650def29a | |||
| 2a7d9977b1 | |||
| a746afa7cc | |||
| 87f0da1ff1 | |||
| 14ec30038b | |||
| 09722fe540 | |||
| 85b01d28da | |||
| 763c2613df | |||
| 98c285c679 | |||
| 2164723c86 | |||
| 5cc712ceeb | |||
| 840101640b | |||
| 60e737f622 | |||
| 4cc1087124 | |||
| b750b17598 | |||
| 5f1d5e8722 | |||
| 1b13523c7f | |||
| a35fe57737 | |||
| b8d357c2ad | |||
| 4f1e47aa78 | |||
| 7a131db2a0 | |||
| 756d02f8c0 | |||
| d3450c1fce | |||
| fa7f840427 | |||
| e25ecc5287 | |||
| f1504d851a | |||
| 1a97e761fb | |||
| 6771302f62 | |||
| 188c0a9a6b | |||
| 62537967fe | |||
| 42df06dd3d | |||
| ab438ac9b9 | |||
| 2216fda5ce | |||
| 9b655faa64 | |||
| a37e7232c7 | |||
| b559187a7e | |||
| 9e7564c9d7 | |||
| 584bd8575f | |||
| 777e5f13f3 | |||
| 6131e3d747 | |||
| e0a2c2a4bf | |||
| d26e68e3bb | |||
| 57ba93a2b2 | |||
| 34a42415be | |||
| 1a6f826f0f | |||
| 22e428b104 | |||
| 89f117fcd9 | |||
| 9a50cc4345 | |||
| addf52e9f0 | |||
| 45b57c292c | |||
| 860a5ae06e | |||
| 55d09e6c30 | |||
| 32c42d2f4c | |||
| 1cfee8c347 | |||
| 2893c799bf | |||
| b4e50d54a0 | |||
| d6c5682ef5 | |||
| de721af166 | |||
| 5f73d3f19f | |||
| 846016b8b7 | |||
| b225f15f29 | |||
| b1481b33f8 | |||
| c230ff7ab8 | |||
| 6edf10cecd | |||
| d88d6c34b9 | |||
| ff14be8fdb | |||
| f75da23e1d | |||
| 17900625d0 | |||
| 5722ab6b51 | |||
| 072f0cd183 | |||
| 4af6d4ddc8 | |||
| 7359720403 | |||
| 9cb2c91d58 | |||
| 9e18ac5d2d | |||
| e18f5b2d52 | |||
| e979f04d75 | |||
| 5002f2cf6a | |||
| b6018f3d57 | |||
| aee537099d | |||
| e37f14fd6a | |||
| 432c9cc542 | |||
| 9d4da1ad2e | |||
| 9725bac5c4 | |||
| 68e270b029 | |||
| bf859f234e | |||
| 70fbae3c5f | |||
| 7cd77292fc | |||
| e8e3052d1a | |||
| eb96312b41 | |||
| ab359b259f | |||
| 83ee2c82df | |||
| 0bfbd8dcbd | |||
| a112ebb4df | |||
| 993d007c4b | |||
| 92a7f3f794 | |||
| 2919033f3c | |||
| cb9114e31c | |||
| 2f9912a012 | |||
| fc10a3e486 | |||
| dcdc51ce30 | |||
| ef09252dff | |||
| e3aa02b6af | |||
| d3e6f017be | |||
| 721700bfe5 |
@@ -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
@@ -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
|
|
||||||
-34
@@ -1,34 +0,0 @@
|
|||||||
language: cpp
|
|
||||||
cache:
|
|
||||||
- apt
|
|
||||||
compiler:
|
|
||||||
- clang
|
|
||||||
- gcc
|
|
||||||
before_install:
|
|
||||||
- sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
|
|
||||||
- sudo add-apt-repository -y ppa:h-rayflood/llvm
|
|
||||||
- sudo apt-get update -qq
|
|
||||||
- sudo apt-get update
|
|
||||||
- sudo apt-get install valgrind
|
|
||||||
install:
|
|
||||||
- sudo apt-get install -qq gcc-4.8-multilib g++-4.8-multilib
|
|
||||||
- sudo apt-get install --allow-unauthenticated -qq clang-3.4
|
|
||||||
- sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 90
|
|
||||||
- sudo apt-get install -y lib32gcc1
|
|
||||||
- sudo apt-get install -y libc6-i386
|
|
||||||
- sudo apt-get install -y lib32z1-dev
|
|
||||||
- sudo apt-get install -y lib32stdc++6
|
|
||||||
- wget https://googletest.googlecode.com/files/gtest-1.7.0.zip
|
|
||||||
- unzip 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 ..
|
|
||||||
env:
|
|
||||||
- ACTION="ci/build_autotools.sh" VERSION="cpp11" ARCH="64" LIBPATH="/usr/local/lib"
|
|
||||||
- ACTION="ci/build_autotools.sh" VERSION="cpp11" ARCH="32" LIBPATH="/usr/local/lib32"
|
|
||||||
- ACTION="ci/build_autotools.sh" VERSION="cpp03" ARCH="64" LIBPATH="/usr/local/lib"
|
|
||||||
- ACTION="ci/build_autotools.sh" VERSION="cpp03" ARCH="32" LIBPATH="/usr/local/lib32"
|
|
||||||
- ACTION="ci/build_cmake.sh" VERSION="cpp11" ARCH="64" LIBPATH="/usr/local/lib"
|
|
||||||
- ACTION="ci/build_cmake.sh" VERSION="cpp11" ARCH="32" LIBPATH="/usr/local/lib32"
|
|
||||||
- ACTION="ci/build_cmake.sh" VERSION="cpp03" ARCH="64" LIBPATH="/usr/local/lib"
|
|
||||||
- ACTION="ci/build_cmake.sh" VERSION="cpp03" ARCH="32" LIBPATH="/usr/local/lib32"
|
|
||||||
|
|
||||||
script:
|
|
||||||
- git clean -xdf && CMAKE_LIBRARY_PATH=${LIBPATH} ${ACTION} ${VERSION} ${ARCH}
|
|
||||||
+308
-15
@@ -1,5 +1,293 @@
|
|||||||
2015-04-03 version 1.1.0
|
# 2020-06-05 version 3.3.0
|
||||||
<< breaking change >>
|
* Add json example for C (#870)
|
||||||
|
* Add both header and body packing functions for C (#870)
|
||||||
|
* Set default ref_size and chunk_size to vrefbuffer (#865)
|
||||||
|
* Add examples (#861)
|
||||||
|
* Improve build system (#839, #842)
|
||||||
|
* Improve tests (#829)
|
||||||
|
* Improve documents (#828)
|
||||||
|
* Remove some warnings (#827, #851, #871)
|
||||||
|
* Improve CI environment (#824, #831, #833, #834, #846, #860, 874)
|
||||||
|
|
||||||
|
# 2019-12-10 version 3.2.1
|
||||||
|
* Fix snprintf return value checking (#821)
|
||||||
|
* Remove some warnings (#819)
|
||||||
|
* Fix fbuffer result checking (#812)
|
||||||
|
* Fix temporary object handling (#807)
|
||||||
|
* Improve cmake support (#804)
|
||||||
|
* Fix invalid `int main` parameter (#800)
|
||||||
|
* Improve supporting platform (#797, #817)
|
||||||
|
* Fix ZLIB error handling (#795)
|
||||||
|
* Remove unused variable (#793)
|
||||||
|
* Improve integer overflow checking (#792)
|
||||||
|
|
||||||
|
# 2019-05-27 version 3.2.0
|
||||||
|
|
||||||
|
* Fix invalid include (#783)
|
||||||
|
* Add timespec support (#781)
|
||||||
|
* Fix unchecked fnprintf on C (#780)
|
||||||
|
* Improve integer overflow checking on C (#776)
|
||||||
|
* Fix warnings on `-Wconversion` (#770, #777, #784)
|
||||||
|
* Fix invalid passed by value on aligned_zone_size_visitor (#764)
|
||||||
|
* Improve windows support (#757, #779)
|
||||||
|
* Fix msgpack::object size caluclation error (#754)
|
||||||
|
* Fix memory error on example code (#753)
|
||||||
|
* Fix redundant memory allocation on C (#747)
|
||||||
|
* Fix msgpack::type::tuple base class conversion (#743)
|
||||||
|
|
||||||
|
# 2018-09-09 version 3.1.1
|
||||||
|
|
||||||
|
* Add force endian set functionality (#736)
|
||||||
|
* Fix vrefbuffer memory management problem (#733)
|
||||||
|
* Fix msvc specific problem (#731, #732)
|
||||||
|
* Update boost from 1.61.0 to 1.68.0 (#730)
|
||||||
|
* Fix msgpack_timestamp type mismatch bug (#726)
|
||||||
|
|
||||||
|
# 2018-08-10 version 3.1.0
|
||||||
|
|
||||||
|
* Improve documents (#687, #718)
|
||||||
|
* Add fuzzer support (#689)
|
||||||
|
* Fix msgpack::object union member access bug (#694)
|
||||||
|
* Improve cross platform configuration (#704)
|
||||||
|
* Fix out of range dereference bug of EXT (#705)
|
||||||
|
* Add timestamp support. std::chrono::system_clock::time_point is mapped to TIMESTAMP (#706)
|
||||||
|
* Add minimal timestamp support for C. The type `msgpack_timestamp` and the function `msgpack_object_to_timestamp()` are introduced (#707)
|
||||||
|
* Improve MSGPACK_DEFINE family name confliction probability (#710)
|
||||||
|
* Add no static-library build option (BUILD_SHARED_LIBS=ON) (#713, #717, #722)
|
||||||
|
* Add header only cmake target (#721)
|
||||||
|
* Add `std::byte` adaptor (#719)
|
||||||
|
* Remove some warnings (#720)
|
||||||
|
|
||||||
|
# 2018-05-12 version 3.0.1
|
||||||
|
|
||||||
|
* Add fuzz directory to release tar ball (#686)
|
||||||
|
* Add include file checking for X-Code (#683)
|
||||||
|
|
||||||
|
# 2018-05-09 version 3.0.0
|
||||||
|
|
||||||
|
## << breaking changes >>
|
||||||
|
|
||||||
|
* Change offset parameter updating rule. If parse error happens, offset is updated to the error position. (#639, #666)
|
||||||
|
|
||||||
|
## << other updates >>
|
||||||
|
|
||||||
|
* Improve cross platform configuration (#655, #677)
|
||||||
|
* Improve build system (#647)
|
||||||
|
* Improve user class adaptor (#645, #673)
|
||||||
|
* Improve msgpack::object visitation logic (#676)
|
||||||
|
* Remove some warnings (#641, 659)
|
||||||
|
* Add `->` and `*` operators to object_handle (#635)
|
||||||
|
* Improve CI environment (#631, #634, #643, #657, #662, #668)
|
||||||
|
* Improve documents (#630, #661)
|
||||||
|
* Refactoring (#670)
|
||||||
|
* Add OSS-Fuzz support (#672, #674, #675, #678)
|
||||||
|
|
||||||
|
# 2017-08-04 version 2.1.5
|
||||||
|
* Improve cross platform configuration (#624)
|
||||||
|
* Add boost asio examples (including zlib) (#610)
|
||||||
|
* Remove some warnings (#611)
|
||||||
|
* Fix unpack visitor to treat float32/64 correctly (#613)
|
||||||
|
* Improve documents (#616)
|
||||||
|
* Fix alignment problem on some platform (#617, #518)
|
||||||
|
* Fix conflict std::tuple, std::pair, and boost::fusion::sequence problem (#619)
|
||||||
|
|
||||||
|
# 2017-08-03 version 2.1.4 (Invalid)
|
||||||
|
* See https://github.com/msgpack/msgpack-c/issues/623
|
||||||
|
|
||||||
|
# 2017-06-15 version 2.1.3
|
||||||
|
* Improve build system (#603)
|
||||||
|
* Add C++17 adaptors `std::optional` and `std::string_view`. (#607, #608)
|
||||||
|
* Improve cross platform configuration (#601)
|
||||||
|
* Remove some warnings (#599, #602, #605)
|
||||||
|
|
||||||
|
# 2017-06-07 version 2.1.2
|
||||||
|
|
||||||
|
* Improve documents (#565)
|
||||||
|
* Fix empty map parse bug (#568)
|
||||||
|
* Improve build system (#569, #570, #572, #579, #591, #592)
|
||||||
|
* Remove some warnings (#574, #578, #586, #588)
|
||||||
|
* Improve cross platform configuration (#577, #582)
|
||||||
|
* Add cmake package config support (#580)
|
||||||
|
* Fix streaming unpack bug (#585)
|
||||||
|
|
||||||
|
# 2017-02-04 version 2.1.1
|
||||||
|
|
||||||
|
* Fix unpacker's buffer management bug (#561)
|
||||||
|
* Add boost string_view adaptor (#558)
|
||||||
|
* Remove some warnings (#557, #559)
|
||||||
|
* Improve coding style (#556)
|
||||||
|
|
||||||
|
# 2017-01-10 version 2.1.0
|
||||||
|
|
||||||
|
## << breaking changes >>
|
||||||
|
|
||||||
|
* Fix object internal data type is float if msgpack format is float32 (#531)
|
||||||
|
|
||||||
|
## << recommended changes >>
|
||||||
|
|
||||||
|
* Add `FLOAT64` type. Please use it instead of `DOUBLE` (#531)
|
||||||
|
* Add `FLOAT32` type. Please use it instead of `FLOAT` (#531)
|
||||||
|
|
||||||
|
## << other updates >>
|
||||||
|
|
||||||
|
* Add iterator based parse/unpack function(experimental) (#553)
|
||||||
|
* Add `[[deprecated]]` attribute for C++14 (#552)
|
||||||
|
* Fix `msgpack_unpack()` return code (#548)
|
||||||
|
* Fix integer overflow (#547, #549, #550)
|
||||||
|
* Add example codes (#542)
|
||||||
|
* Add MSGPACK_NVP. You can use not only variable name but also any strings (#535)
|
||||||
|
* Fix and Improve build system (#532, #545)
|
||||||
|
* Fix `gcc_atomic.hpp` include path (#529, #530)
|
||||||
|
* Improve CI environment (#526)
|
||||||
|
* Improve documents (#524)
|
||||||
|
* Add msgpack_unpacker_next_with_size() function (#515)
|
||||||
|
* Fix `as()` applying condition (#511)
|
||||||
|
* Fix fbuffer write (#504)
|
||||||
|
* Add gcc bug workaround (#499)
|
||||||
|
* Improve object print (#497, #500, #505, #533)
|
||||||
|
* Remove some warnings (#495, #506, #508, #513, #528, #538, #545)
|
||||||
|
|
||||||
|
# 2016-06-25 version 2.0.0
|
||||||
|
|
||||||
|
## << breaking changes >>
|
||||||
|
|
||||||
|
* Removed autotools support. Use cmake instead (#476, #479)
|
||||||
|
* Removed pointer version of msgpack::unpack APIs. Use reference version instead (#453)
|
||||||
|
* Removed MSGPACK_DISABLE_LEGACY_CONVERT. msgpack::object::convert(T*) is removed by default. Use msgpack::object::convert(T&) instead (#451)
|
||||||
|
* Removed msgpacl::type::nil. Use nil_t or define MSGPACK_USE_LECACY_NIL (#444)
|
||||||
|
* Removed std::string to msgpack::object conversion (#434)
|
||||||
|
|
||||||
|
## << recommended changes >>
|
||||||
|
|
||||||
|
* Replaced msgpack::unpacked with msgpack::object_handle. msgpack::unpacked is kept as a typedef of msgpack::object_handle. (#448)
|
||||||
|
|
||||||
|
## << other updates >>
|
||||||
|
|
||||||
|
* Add strict size checking adaptor. Relaxed tuple conversion (#489)
|
||||||
|
* Fix and Improve example codes (#487)
|
||||||
|
* Add C++/CLI support for nullptr (#481)
|
||||||
|
* Update the boost libraries that are contained by msgpack-c (#475)
|
||||||
|
* Fix gcc_atomic.hpp location (#474)
|
||||||
|
* Add C-Style array support (#466, #488)
|
||||||
|
* Fix include file dependency (#464)
|
||||||
|
* Add a visitor version of unpack API (#461)
|
||||||
|
* Fix JSON string conversion from "nil" to "null" (#458)
|
||||||
|
* Fix and Improve build system (#455, #471, #473, #486, #491)
|
||||||
|
* Fix comments (#452)
|
||||||
|
* Fix unintentional msgpack::zone moving problem (#447)
|
||||||
|
* Fix operator>> and << for msgpack::object (#443)
|
||||||
|
* Fix C++03 msgpack::zone::clear() memory access violation bug (#441)
|
||||||
|
* Fix TARGET_OS_IPHONE checking (#436)
|
||||||
|
* Fix invalid front() call for empty container (#435)
|
||||||
|
* Fix compile error on g++6 (C++11 only) (#426, #430)
|
||||||
|
* Fix zone size expansion logic (#423)
|
||||||
|
* Fix wrong hader file dependency (#421)
|
||||||
|
* Fix msvc specific problem (#420)
|
||||||
|
* Add v2 API support (#415)
|
||||||
|
|
||||||
|
# 2016-01-22 version 1.4.0
|
||||||
|
|
||||||
|
## << recommended changes >>
|
||||||
|
|
||||||
|
* Define [MSGPACK_DISABLE_LEGACY_NIL](https://github.com/msgpack/msgpack-c/wiki/v1_1_cpp_configure#msgpack_disable_legacy_nil-since-140), then `msgpack::type::nil` is replaced by with `msgpack::type::nil_t` (#408, #411, #412).
|
||||||
|
Replace `msgpack::type::nil` with `msgpack::type::nil_t` in client codes.
|
||||||
|
`msgpack::type::nil` will be removed on the version 2.0.0.
|
||||||
|
* Define [MSGPACK_DISABLE_LEGACY_CONVERT](https://github.com/msgpack/msgpack-c/wiki/v1_1_cpp_configure#msgpack_disable_legacy_convert-since-140), then `msgpack::object::convert(T*)` is removed (#410).
|
||||||
|
Replace calling `msgpack::bojectconvert(T*)` with `msgpack::bojectconvert(T&)` in client codes as follows:
|
||||||
|
|
||||||
|
```C++
|
||||||
|
int i;
|
||||||
|
obj.convert(&i); // before
|
||||||
|
```
|
||||||
|
|
||||||
|
```C++
|
||||||
|
int i;
|
||||||
|
obj.convert(i); // after
|
||||||
|
```
|
||||||
|
|
||||||
|
`msgpack::object::convert(T*)` will be removed on the version 2.0.0.
|
||||||
|
|
||||||
|
Define the macros above as follows when you compile C++ codes that use msgpack-c:
|
||||||
|
|
||||||
|
```
|
||||||
|
g++ -Ipath_to_msgpack/include -DMSGPACK_DISABLE_LEGACY_NIL -DMSGPACK_DISABLE_LEGACY_CONVERT your_code.cpp
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
You can compile existing codes without defining macros above but I recommend defining them and updating your codes to fix the issues #408, #411, #412, #399, and #410. It is also a good preparation for the version 2.0.0.
|
||||||
|
|
||||||
|
## << other updates >>
|
||||||
|
|
||||||
|
* Improve documents (#387, #407)
|
||||||
|
* Remove C++ version library (#394, #402)
|
||||||
|
* Add Doxyfile and ChangeLog to the distribution package (#397)
|
||||||
|
* Add signed/unsigned char test to travis-ci (#398)
|
||||||
|
* Remove some warnings (#400, #401, #409)
|
||||||
|
* Fix endian checking. (#404)
|
||||||
|
|
||||||
|
# 2015-11-21 version 1.3.0
|
||||||
|
|
||||||
|
* Change the license from the Apache License Version 2.0 to the
|
||||||
|
Boost Software License, Version 1.0.(#386)
|
||||||
|
* Remove some warnings (#365)
|
||||||
|
* Add std::reference_wrapper support(#373, #384)
|
||||||
|
* Improve tests (#375, #378, #379, #380)
|
||||||
|
* Fix msvc specific problem (#376, #383)
|
||||||
|
* Fix typos (#381)
|
||||||
|
|
||||||
|
# 2015-09-04 version 1.2.0
|
||||||
|
|
||||||
|
## << breaking changes >>
|
||||||
|
|
||||||
|
* Change std::vector<unsigned char> and std::array<unsigned char>
|
||||||
|
mapped to BIN instead of ARRAY (#243)
|
||||||
|
* Remove redundant copy (#285)
|
||||||
|
|
||||||
|
|
||||||
|
## << other updates >>
|
||||||
|
|
||||||
|
* Add array_ref to map to ARRAY (#243)
|
||||||
|
* Add variant type and adaptor (#349)
|
||||||
|
* Add object::convert_if_not_nil() (#357)
|
||||||
|
* Fix invalid offset update (#354)
|
||||||
|
* Add C++11 support on MSVC2015(#339, #347)
|
||||||
|
* Fix and Improve build system (#346, #350, #361, #363)
|
||||||
|
* Import Boost.Preprocessor as a part of msgpack-c (#312)
|
||||||
|
* Fix OSX with libc++ specific errors (#334, #362)
|
||||||
|
* Add customized containers support (#330)
|
||||||
|
* Add std::unique_ptr and std::shared_ptr support (#329)
|
||||||
|
* Add missing install files (#328)
|
||||||
|
* Add shared/static library switching option (#316)
|
||||||
|
* Improve no throw description on C++11 (#313)
|
||||||
|
* Import Boost.Predef as a part of msgpack-c (#312)
|
||||||
|
* Add map based serialize support (#306)
|
||||||
|
* Add Boost.Fusion support (#305)
|
||||||
|
* Add v4 format RAW support (#304)
|
||||||
|
* Fix zbuffer with empty string problem (#303)
|
||||||
|
* Add non default constructible class support (#302, #324, #327, #331, #332, #345)
|
||||||
|
* Add inline keyword to function (template) (#299)
|
||||||
|
* Add EXT type supporting classes (#292, #308)
|
||||||
|
* Fix raw_ref != comparison (#290)
|
||||||
|
* Add object deep copy (#288)
|
||||||
|
* Remove some warnings (#284, #322, #323, #335)
|
||||||
|
* Improve compiler version checking (#283)
|
||||||
|
* Add return value to object::convert() (#282)
|
||||||
|
* Improve move semantic support in C++11 (#279, #353)
|
||||||
|
* Add Boost.StringRef support (#278)
|
||||||
|
* Improve CI environment (#276, #294, #338)
|
||||||
|
* Add converting to JSON (#274, #301)
|
||||||
|
* Fix iOS specific problem (#270)
|
||||||
|
* Improve doxtgen document generation (#269)
|
||||||
|
* Add Boost.Optional support (#268)
|
||||||
|
* Fix msvc specific problem (#267, #295)
|
||||||
|
* Add base class serialization. (#265, #277)
|
||||||
|
* Add and improve examples. (#264, #310, #311, #341, #342, #344)
|
||||||
|
* Fix wiki URL. (#263)
|
||||||
|
|
||||||
|
# 2015-04-03 version 1.1.0
|
||||||
|
|
||||||
|
## << breaking changes >>
|
||||||
|
|
||||||
* Remove msgpack_fwd.hpp
|
* Remove msgpack_fwd.hpp
|
||||||
* Improve user types adaptation mechanism (#262)
|
* Improve user types adaptation mechanism (#262)
|
||||||
Since version 1.0.0, users need to obey the correct include order.
|
Since version 1.0.0, users need to obey the correct include order.
|
||||||
@@ -8,18 +296,24 @@
|
|||||||
care about include order. Migration guide from 1.0.x to 1.1.0 has
|
care about include order. Migration guide from 1.0.x to 1.1.0 has
|
||||||
been written. See https://github.com/msgpack/msgpack-c/wiki
|
been written. See https://github.com/msgpack/msgpack-c/wiki
|
||||||
|
|
||||||
|
|
||||||
|
## << other updates >>
|
||||||
|
|
||||||
* Fix vector<bool> size check (#251)
|
* Fix vector<bool> size check (#251)
|
||||||
* Fix inttypes.h inclusion on MSVC (#257)
|
* Fix inttypes.h inclusion on MSVC (#257)
|
||||||
* Support documents generation by Doxygen (#259)
|
* Support documents generation by Doxygen (#259)
|
||||||
* Remove C99 style variable declaration (#253)
|
* Remove C99 style variable declaration (#253)
|
||||||
* Improve documents (https://github.com/msgpack/msgpack-c/wiki)
|
* Improve documents (https://github.com/msgpack/msgpack-c/wiki)
|
||||||
2015-03-22 version 1.0.1:
|
|
||||||
|
# 2015-03-22 version 1.0.1:
|
||||||
|
|
||||||
* Fix compilation error on Mac 10.9 (#244)
|
* Fix compilation error on Mac 10.9 (#244)
|
||||||
* Fix typos in documents (#240)
|
* Fix typos in documents (#240)
|
||||||
* Update CHANGELOG.md for version 1.0.0 (#242)
|
* Update CHANGELOG.md for version 1.0.0 (#242)
|
||||||
* Fix erb templates for the next code generation (#239)
|
* Fix erb templates for the next code generation (#239)
|
||||||
|
|
||||||
2015-03-10 version 1.0.0:
|
# 2015-03-10 version 1.0.0:
|
||||||
|
|
||||||
* Support msgpack v5 format (str, bin, and ext) https://github.com/msgpack/msgpack/blob/master/spec.md (#142)
|
* Support msgpack v5 format (str, bin, and ext) https://github.com/msgpack/msgpack/blob/master/spec.md (#142)
|
||||||
* Support std::tuple, std::forward_list, std::array, std::unordered_set, std::unordered_map on C++11. tr1 unordered containers are still supported (#53, #130, #137, #154, #169)
|
* Support std::tuple, std::forward_list, std::array, std::unordered_set, std::unordered_map on C++11. tr1 unordered containers are still supported (#53, #130, #137, #154, #169)
|
||||||
* Update msgpack-c as a header-only library on C++ (#142)
|
* Update msgpack-c as a header-only library on C++ (#142)
|
||||||
@@ -45,7 +339,7 @@
|
|||||||
* Improve documents (https://github.com/msgpack/msgpack-c/wiki)
|
* Improve documents (https://github.com/msgpack/msgpack-c/wiki)
|
||||||
* Other bug fixes and refactoring: #62, #91, #95, #97, #107, #109, #113, #117, #119, #121, #122, #123, #126, #131, #136, #138, #140, #143, #145, #146, #150, #151, #152, #156, #157, #158, #161, #165, #170, #172, #179, #180, #181, #182, #183, #192, #195, #199, #200, #207, #211, #212, #219, #222, #224, #230, #231, #232, #233, #234, #235
|
* Other bug fixes and refactoring: #62, #91, #95, #97, #107, #109, #113, #117, #119, #121, #122, #123, #126, #131, #136, #138, #140, #143, #145, #146, #150, #151, #152, #156, #157, #158, #161, #165, #170, #172, #179, #180, #181, #182, #183, #192, #195, #199, #200, #207, #211, #212, #219, #222, #224, #230, #231, #232, #233, #234, #235
|
||||||
|
|
||||||
2014-07-02 version 0.5.9:
|
# 2014-07-02 version 0.5.9:
|
||||||
|
|
||||||
* Support std::tr1 unordered containers by default (#51, #63, #68, #69)
|
* Support std::tr1 unordered containers by default (#51, #63, #68, #69)
|
||||||
* Remove some warnings (#56)
|
* Remove some warnings (#56)
|
||||||
@@ -59,7 +353,7 @@
|
|||||||
* Add FILE* buffer (#40)
|
* Add FILE* buffer (#40)
|
||||||
* Other bug fixes and refactoring: #39, #73, #77, #79, #80, #81, #84, #90
|
* Other bug fixes and refactoring: #39, #73, #77, #79, #80, #81, #84, #90
|
||||||
|
|
||||||
2013-12-23 version 0.5.8:
|
# 2013-12-23 version 0.5.8:
|
||||||
|
|
||||||
* Move to the new github repository msgpack/msgpack-c
|
* Move to the new github repository msgpack/msgpack-c
|
||||||
* Support the new deserialization specification
|
* Support the new deserialization specification
|
||||||
@@ -67,38 +361,38 @@
|
|||||||
* Other bug fixes and refactoring: #46, #41, #36, #35, #33, #32, #30, #29, #28, #27, #26, #25, #8, #3
|
* Other bug fixes and refactoring: #46, #41, #36, #35, #33, #32, #30, #29, #28, #27, #26, #25, #8, #3
|
||||||
* Update of documents: #23, #18, #17
|
* Update of documents: #23, #18, #17
|
||||||
|
|
||||||
2011-08-08 version 0.5.7:
|
# 2011-08-08 version 0.5.7:
|
||||||
|
|
||||||
* fixes compile error problem with llvm-gcc and Mac OS X Lion
|
* fixes compile error problem with llvm-gcc and Mac OS X Lion
|
||||||
|
|
||||||
2011-04-24 version 0.5.6:
|
# 2011-04-24 version 0.5.6:
|
||||||
|
|
||||||
* #42 fixes double-free problem on msgpack_unpacker_release_zone
|
* #42 fixes double-free problem on msgpack_unpacker_release_zone
|
||||||
|
|
||||||
2011-02-24 version 0.5.5:
|
# 2011-02-24 version 0.5.5:
|
||||||
|
|
||||||
* eliminates dependency of winsock2.h header
|
* eliminates dependency of winsock2.h header
|
||||||
* fixes msgpack_vc.postbuild.bat file
|
* fixes msgpack_vc.postbuild.bat file
|
||||||
* fixes some implicit cast warnings
|
* fixes some implicit cast warnings
|
||||||
|
|
||||||
2010-08-29 version 0.5.4:
|
# 2010-08-29 version 0.5.4:
|
||||||
|
|
||||||
* includes msgpack_vc2008.vcproj file in source package
|
* includes msgpack_vc2008.vcproj file in source package
|
||||||
* fixes type::fix_int types
|
* fixes type::fix_int types
|
||||||
|
|
||||||
2010-08-27 version 0.5.3:
|
# 2010-08-27 version 0.5.3:
|
||||||
|
|
||||||
* adds type::fix_{u,}int{8,16,32,64} types
|
* adds type::fix_{u,}int{8,16,32,64} types
|
||||||
* adds msgpack_pack_fix_{u,}int{8,16,32,64} functions
|
* adds msgpack_pack_fix_{u,}int{8,16,32,64} functions
|
||||||
* adds packer<Stream>::pack_fix_{u,}int{8,16,32,64} functions
|
* adds packer<Stream>::pack_fix_{u,}int{8,16,32,64} functions
|
||||||
* fixes include paths
|
* fixes include paths
|
||||||
|
|
||||||
2010-07-14 version 0.5.2:
|
# 2010-07-14 version 0.5.2:
|
||||||
|
|
||||||
* type::raw::str(), operator==, operator!=, operator< and operator> are now const
|
* type::raw::str(), operator==, operator!=, operator< and operator> are now const
|
||||||
* generates version.h using AC_OUTPUT macro in ./configure
|
* generates version.h using AC_OUTPUT macro in ./configure
|
||||||
|
|
||||||
2010-07-06 version 0.5.1:
|
# 2010-07-06 version 0.5.1:
|
||||||
|
|
||||||
* Add msgpack_vrefbuffer_new and msgpack_vrefbuffer_free
|
* Add msgpack_vrefbuffer_new and msgpack_vrefbuffer_free
|
||||||
* Add msgpack_sbuffer_new and msgpack_sbuffer_free
|
* Add msgpack_sbuffer_new and msgpack_sbuffer_free
|
||||||
@@ -108,7 +402,7 @@
|
|||||||
* Add msgpack_version{,_major,_minor} functions to check library version
|
* Add msgpack_version{,_major,_minor} functions to check library version
|
||||||
* ./configure supports --disable-cxx option not to build C++ API
|
* ./configure supports --disable-cxx option not to build C++ API
|
||||||
|
|
||||||
2010-04-29 version 0.5.0:
|
# 2010-04-29 version 0.5.0:
|
||||||
|
|
||||||
* msgpack_object_type is changed. MSGPACK_OBJECT_NIL is now 0x00.
|
* msgpack_object_type is changed. MSGPACK_OBJECT_NIL is now 0x00.
|
||||||
* New safe streaming deserializer API.
|
* New safe streaming deserializer API.
|
||||||
@@ -116,4 +410,3 @@
|
|||||||
* Add operator==(object, const T&)
|
* Add operator==(object, const T&)
|
||||||
* MSGPACK_DEFINE macro defines msgpack_object(object* obj, zone* z)
|
* MSGPACK_DEFINE macro defines msgpack_object(object* obj, zone* z)
|
||||||
* C++ programs doesn't need to link "msgpackc" library.
|
* C++ programs doesn't need to link "msgpackc" library.
|
||||||
|
|
||||||
|
|||||||
-242
@@ -1,242 +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")
|
|
||||||
|
|
||||||
OPTION (MSGPACK_CXX11 "Using c++11 compiler" OFF)
|
|
||||||
OPTION (MSGPACK_32BIT "32bit compile" OFF)
|
|
||||||
|
|
||||||
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")
|
|
||||||
MESSAGE ( FATAL_ERROR "MSVC doesn't support C++11 yet.")
|
|
||||||
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 ()
|
|
||||||
|
|
||||||
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_ENABLE_CXX "Enable C++ interface." 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)
|
|
||||||
|
|
||||||
IF (MSGPACK_ENABLE_GCC_CXX_ATOMIC)
|
|
||||||
LIST (APPEND msgpack_SOURCES
|
|
||||||
src/gcc_atomic.cpp
|
|
||||||
)
|
|
||||||
ENDIF ()
|
|
||||||
|
|
||||||
|
|
||||||
LIST (APPEND msgpack_SOURCES
|
|
||||||
src/unpack.c
|
|
||||||
src/objectc.c
|
|
||||||
src/version.c
|
|
||||||
src/vrefbuffer.c
|
|
||||||
src/zone.c
|
|
||||||
)
|
|
||||||
|
|
||||||
LIST (APPEND msgpack_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/sbuffer.h
|
|
||||||
include/msgpack/version.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
|
|
||||||
)
|
|
||||||
|
|
||||||
IF (MSGPACK_ENABLE_CXX)
|
|
||||||
LIST (APPEND msgpack_HEADERS
|
|
||||||
include/msgpack.hpp
|
|
||||||
include/msgpack/adaptor/adaptor_base.hpp
|
|
||||||
include/msgpack/adaptor/bool.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/forward_list.hpp
|
|
||||||
include/msgpack/adaptor/cpp11/tuple.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.hpp
|
|
||||||
include/msgpack/adaptor/detail/cpp03_msgpack_tuple.hpp
|
|
||||||
include/msgpack/adaptor/detail/cpp11_define.hpp
|
|
||||||
include/msgpack/adaptor/detail/cpp11_msgpack_tuple.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/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/cpp_config.hpp
|
|
||||||
include/msgpack/detail/cpp03_zone.hpp
|
|
||||||
include/msgpack/detail/cpp11_zone.hpp
|
|
||||||
include/msgpack/fbuffer.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
|
|
||||||
)
|
|
||||||
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/
|
|
||||||
)
|
|
||||||
|
|
||||||
ADD_LIBRARY (msgpack SHARED
|
|
||||||
${msgpack_SOURCES}
|
|
||||||
${msgpack_HEADERS}
|
|
||||||
)
|
|
||||||
|
|
||||||
ADD_LIBRARY (msgpack-static STATIC
|
|
||||||
${msgpack_SOURCES}
|
|
||||||
${msgpack_HEADERS}
|
|
||||||
)
|
|
||||||
|
|
||||||
SET_TARGET_PROPERTIES (msgpack-static PROPERTIES OUTPUT_NAME "msgpack")
|
|
||||||
SET_TARGET_PROPERTIES (msgpack PROPERTIES IMPORT_SUFFIX "_import.lib")
|
|
||||||
SET_TARGET_PROPERTIES (msgpack PROPERTIES SOVERSION 3 VERSION 4.0.0)
|
|
||||||
|
|
||||||
IF (MSGPACK_BUILD_TESTS)
|
|
||||||
ENABLE_TESTING ()
|
|
||||||
SET(CTEST_MEMORYCHECK_COMMAND "/usr/bin/valgrind")
|
|
||||||
INCLUDE(Dart)
|
|
||||||
SET(MEMORYCHECK_COMMAND_OPTIONS "--leak-check=full --error-exitcode=1")
|
|
||||||
ADD_SUBDIRECTORY (test)
|
|
||||||
ENDIF ()
|
|
||||||
|
|
||||||
IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
|
|
||||||
SET_PROPERTY (TARGET msgpack APPEND_STRING PROPERTY COMPILE_FLAGS "-Wall -g -O3 -DPIC")
|
|
||||||
SET_PROPERTY (TARGET msgpack-static APPEND_STRING PROPERTY COMPILE_FLAGS "-Wall -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" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
|
|
||||||
ELSE ()
|
|
||||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3")
|
|
||||||
ENDIF ()
|
|
||||||
ENDIF ()
|
|
||||||
|
|
||||||
IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC90" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC10")
|
|
||||||
SET_SOURCE_FILES_PROPERTIES(${msgpack_SOURCES} PROPERTIES LANGUAGE CXX)
|
|
||||||
ENDIF()
|
|
||||||
|
|
||||||
IF (NOT DEFINED CMAKE_INSTALL_LIBDIR)
|
|
||||||
SET(CMAKE_INSTALL_LIBDIR lib)
|
|
||||||
ENDIF ()
|
|
||||||
|
|
||||||
INSTALL (TARGETS msgpack msgpack-static DESTINATION ${CMAKE_INSTALL_LIBDIR})
|
|
||||||
INSTALL (DIRECTORY include DESTINATION ${CMAKE_INSTALL_PREFIX})
|
|
||||||
INSTALL (FILES ${CMAKE_CURRENT_BINARY_DIR}/msgpack.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
|
|
||||||
|
|
||||||
# Doxygen
|
|
||||||
FIND_PACKAGE (Doxygen)
|
|
||||||
IF (DOXYGEN_FOUND)
|
|
||||||
ADD_CUSTOM_TARGET (
|
|
||||||
doxygen_c
|
|
||||||
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
|
|
||||||
COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_c
|
|
||||||
VERBATIM
|
|
||||||
)
|
|
||||||
ADD_CUSTOM_TARGET (
|
|
||||||
doxygen_cpp
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_cpp
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E echo "FILE_PATTERNS = *.hpp" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_cpp
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E echo "OUTPUT_DIRECTORY = doc_cpp" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_cpp
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E echo "INPUT = ${CMAKE_CURRENT_SOURCE_DIR}/include" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_cpp
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E echo "EXTRACT_ALL = YES" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_cpp
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E echo "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 ()
|
|
||||||
@@ -1,14 +1,5 @@
|
|||||||
Copyright (C) 2008-2010 FURUHASHI Sadayuki
|
Copyright (C) 2008-2015 FURUHASHI Sadayuki
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
|
|
||||||
|
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)
|
||||||
|
|||||||
@@ -1,38 +0,0 @@
|
|||||||
MessagePack cross-language test cases
|
|
||||||
=====================================
|
|
||||||
|
|
||||||
## cases
|
|
||||||
|
|
||||||
Valid serialized data are stored in "cases.mpac" and "cases_compact.mpac".
|
|
||||||
These files describe same objects. And "cases.json" describes an array of the described objects.
|
|
||||||
|
|
||||||
Thus you can verify your implementations as comparing the objects.
|
|
||||||
|
|
||||||
|
|
||||||
## crosslang
|
|
||||||
|
|
||||||
The *crosslang* tool reads serialized data from stdin and writes re-serialize data to stdout.
|
|
||||||
|
|
||||||
There are C++ and Ruby implementation of crosslang tool. You can verify your implementation
|
|
||||||
as comparing that implementations.
|
|
||||||
|
|
||||||
### C++ version
|
|
||||||
|
|
||||||
$ cd ../cpp && ./configure && make && make install
|
|
||||||
or
|
|
||||||
$ port install msgpack # MacPorts
|
|
||||||
|
|
||||||
$ g++ -Wall crosslang.cc -lmsgpack -o crosslang
|
|
||||||
|
|
||||||
$ ./crosslang
|
|
||||||
Usage: ./crosslang [in-file] [out-file]
|
|
||||||
|
|
||||||
### Ruby version
|
|
||||||
|
|
||||||
$ gem install msgpack
|
|
||||||
or
|
|
||||||
$ port install rb_msgpack # MacPorts
|
|
||||||
|
|
||||||
$ ruby crosslang.rb
|
|
||||||
Usage: crosslang.rb [in-file] [out-file]
|
|
||||||
|
|
||||||
@@ -1,202 +0,0 @@
|
|||||||
|
|
||||||
Apache License
|
|
||||||
Version 2.0, January 2004
|
|
||||||
http://www.apache.org/licenses/
|
|
||||||
|
|
||||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
||||||
|
|
||||||
1. Definitions.
|
|
||||||
|
|
||||||
"License" shall mean the terms and conditions for use, reproduction,
|
|
||||||
and distribution as defined by Sections 1 through 9 of this document.
|
|
||||||
|
|
||||||
"Licensor" shall mean the copyright owner or entity authorized by
|
|
||||||
the copyright owner that is granting the License.
|
|
||||||
|
|
||||||
"Legal Entity" shall mean the union of the acting entity and all
|
|
||||||
other entities that control, are controlled by, or are under common
|
|
||||||
control with that entity. For the purposes of this definition,
|
|
||||||
"control" means (i) the power, direct or indirect, to cause the
|
|
||||||
direction or management of such entity, whether by contract or
|
|
||||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
||||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
||||||
|
|
||||||
"You" (or "Your") shall mean an individual or Legal Entity
|
|
||||||
exercising permissions granted by this License.
|
|
||||||
|
|
||||||
"Source" form shall mean the preferred form for making modifications,
|
|
||||||
including but not limited to software source code, documentation
|
|
||||||
source, and configuration files.
|
|
||||||
|
|
||||||
"Object" form shall mean any form resulting from mechanical
|
|
||||||
transformation or translation of a Source form, including but
|
|
||||||
not limited to compiled object code, generated documentation,
|
|
||||||
and conversions to other media types.
|
|
||||||
|
|
||||||
"Work" shall mean the work of authorship, whether in Source or
|
|
||||||
Object form, made available under the License, as indicated by a
|
|
||||||
copyright notice that is included in or attached to the work
|
|
||||||
(an example is provided in the Appendix below).
|
|
||||||
|
|
||||||
"Derivative Works" shall mean any work, whether in Source or Object
|
|
||||||
form, that is based on (or derived from) the Work and for which the
|
|
||||||
editorial revisions, annotations, elaborations, or other modifications
|
|
||||||
represent, as a whole, an original work of authorship. For the purposes
|
|
||||||
of this License, Derivative Works shall not include works that remain
|
|
||||||
separable from, or merely link (or bind by name) to the interfaces of,
|
|
||||||
the Work and Derivative Works thereof.
|
|
||||||
|
|
||||||
"Contribution" shall mean any work of authorship, including
|
|
||||||
the original version of the Work and any modifications or additions
|
|
||||||
to that Work or Derivative Works thereof, that is intentionally
|
|
||||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
||||||
or by an individual or Legal Entity authorized to submit on behalf of
|
|
||||||
the copyright owner. For the purposes of this definition, "submitted"
|
|
||||||
means any form of electronic, verbal, or written communication sent
|
|
||||||
to the Licensor or its representatives, including but not limited to
|
|
||||||
communication on electronic mailing lists, source code control systems,
|
|
||||||
and issue tracking systems that are managed by, or on behalf of, the
|
|
||||||
Licensor for the purpose of discussing and improving the Work, but
|
|
||||||
excluding communication that is conspicuously marked or otherwise
|
|
||||||
designated in writing by the copyright owner as "Not a Contribution."
|
|
||||||
|
|
||||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
||||||
on behalf of whom a Contribution has been received by Licensor and
|
|
||||||
subsequently incorporated within the Work.
|
|
||||||
|
|
||||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
copyright license to reproduce, prepare Derivative Works of,
|
|
||||||
publicly display, publicly perform, sublicense, and distribute the
|
|
||||||
Work and such Derivative Works in Source or Object form.
|
|
||||||
|
|
||||||
3. Grant of Patent License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
(except as stated in this section) patent license to make, have made,
|
|
||||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
||||||
where such license applies only to those patent claims licensable
|
|
||||||
by such Contributor that are necessarily infringed by their
|
|
||||||
Contribution(s) alone or by combination of their Contribution(s)
|
|
||||||
with the Work to which such Contribution(s) was submitted. If You
|
|
||||||
institute patent litigation against any entity (including a
|
|
||||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
||||||
or a Contribution incorporated within the Work constitutes direct
|
|
||||||
or contributory patent infringement, then any patent licenses
|
|
||||||
granted to You under this License for that Work shall terminate
|
|
||||||
as of the date such litigation is filed.
|
|
||||||
|
|
||||||
4. Redistribution. You may reproduce and distribute copies of the
|
|
||||||
Work or Derivative Works thereof in any medium, with or without
|
|
||||||
modifications, and in Source or Object form, provided that You
|
|
||||||
meet the following conditions:
|
|
||||||
|
|
||||||
(a) You must give any other recipients of the Work or
|
|
||||||
Derivative Works a copy of this License; and
|
|
||||||
|
|
||||||
(b) You must cause any modified files to carry prominent notices
|
|
||||||
stating that You changed the files; and
|
|
||||||
|
|
||||||
(c) You must retain, in the Source form of any Derivative Works
|
|
||||||
that You distribute, all copyright, patent, trademark, and
|
|
||||||
attribution notices from the Source form of the Work,
|
|
||||||
excluding those notices that do not pertain to any part of
|
|
||||||
the Derivative Works; and
|
|
||||||
|
|
||||||
(d) If the Work includes a "NOTICE" text file as part of its
|
|
||||||
distribution, then any Derivative Works that You distribute must
|
|
||||||
include a readable copy of the attribution notices contained
|
|
||||||
within such NOTICE file, excluding those notices that do not
|
|
||||||
pertain to any part of the Derivative Works, in at least one
|
|
||||||
of the following places: within a NOTICE text file distributed
|
|
||||||
as part of the Derivative Works; within the Source form or
|
|
||||||
documentation, if provided along with the Derivative Works; or,
|
|
||||||
within a display generated by the Derivative Works, if and
|
|
||||||
wherever such third-party notices normally appear. The contents
|
|
||||||
of the NOTICE file are for informational purposes only and
|
|
||||||
do not modify the License. You may add Your own attribution
|
|
||||||
notices within Derivative Works that You distribute, alongside
|
|
||||||
or as an addendum to the NOTICE text from the Work, provided
|
|
||||||
that such additional attribution notices cannot be construed
|
|
||||||
as modifying the License.
|
|
||||||
|
|
||||||
You may add Your own copyright statement to Your modifications and
|
|
||||||
may provide additional or different license terms and conditions
|
|
||||||
for use, reproduction, or distribution of Your modifications, or
|
|
||||||
for any such Derivative Works as a whole, provided Your use,
|
|
||||||
reproduction, and distribution of the Work otherwise complies with
|
|
||||||
the conditions stated in this License.
|
|
||||||
|
|
||||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
||||||
any Contribution intentionally submitted for inclusion in the Work
|
|
||||||
by You to the Licensor shall be under the terms and conditions of
|
|
||||||
this License, without any additional terms or conditions.
|
|
||||||
Notwithstanding the above, nothing herein shall supersede or modify
|
|
||||||
the terms of any separate license agreement you may have executed
|
|
||||||
with Licensor regarding such Contributions.
|
|
||||||
|
|
||||||
6. Trademarks. This License does not grant permission to use the trade
|
|
||||||
names, trademarks, service marks, or product names of the Licensor,
|
|
||||||
except as required for reasonable and customary use in describing the
|
|
||||||
origin of the Work and reproducing the content of the NOTICE file.
|
|
||||||
|
|
||||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
||||||
agreed to in writing, Licensor provides the Work (and each
|
|
||||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
||||||
implied, including, without limitation, any warranties or conditions
|
|
||||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
||||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
||||||
appropriateness of using or redistributing the Work and assume any
|
|
||||||
risks associated with Your exercise of permissions under this License.
|
|
||||||
|
|
||||||
8. Limitation of Liability. In no event and under no legal theory,
|
|
||||||
whether in tort (including negligence), contract, or otherwise,
|
|
||||||
unless required by applicable law (such as deliberate and grossly
|
|
||||||
negligent acts) or agreed to in writing, shall any Contributor be
|
|
||||||
liable to You for damages, including any direct, indirect, special,
|
|
||||||
incidental, or consequential damages of any character arising as a
|
|
||||||
result of this License or out of the use or inability to use the
|
|
||||||
Work (including but not limited to damages for loss of goodwill,
|
|
||||||
work stoppage, computer failure or malfunction, or any and all
|
|
||||||
other commercial damages or losses), even if such Contributor
|
|
||||||
has been advised of the possibility of such damages.
|
|
||||||
|
|
||||||
9. Accepting Warranty or Additional Liability. While redistributing
|
|
||||||
the Work or Derivative Works thereof, You may choose to offer,
|
|
||||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
||||||
or other liability obligations and/or rights consistent with this
|
|
||||||
License. However, in accepting such obligations, You may act only
|
|
||||||
on Your own behalf and on Your sole responsibility, not on behalf
|
|
||||||
of any other Contributor, and only if You agree to indemnify,
|
|
||||||
defend, and hold each Contributor harmless for any liability
|
|
||||||
incurred by, or claims asserted against, such Contributor by reason
|
|
||||||
of your accepting any such warranty or additional liability.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
APPENDIX: How to apply the Apache License to your work.
|
|
||||||
|
|
||||||
To apply the Apache License to your work, attach the following
|
|
||||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
|
||||||
replaced with your own identifying information. (Don't include
|
|
||||||
the brackets!) The text should be enclosed in the appropriate
|
|
||||||
comment syntax for the file format. We also recommend that a
|
|
||||||
file or class name and description of purpose be included on the
|
|
||||||
same "printed page" as the copyright notice for easier
|
|
||||||
identification within third-party archives.
|
|
||||||
|
|
||||||
Copyright [yyyy] [name of copyright owner]
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
Boost Software License - Version 1.0 - August 17th, 2003
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person or organization
|
||||||
|
obtaining a copy of the software and accompanying documentation covered by
|
||||||
|
this license (the "Software") to use, reproduce, display, distribute,
|
||||||
|
execute, and transmit the Software, and to prepare derivative works of the
|
||||||
|
Software, and to permit third-parties to whom the Software is furnished to
|
||||||
|
do so, all subject to the following:
|
||||||
|
|
||||||
|
The copyright notices in the Software and this entire statement, including
|
||||||
|
the above license grant, this restriction and the following disclaimer,
|
||||||
|
must be included in all copies of the Software, in whole or in part, and
|
||||||
|
all derivative works of the Software, unless such copies or derivative
|
||||||
|
works are solely in the form of machine-executable object code generated by
|
||||||
|
a source language processor.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||||
|
SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||||
|
FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||||
|
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||||
|
DEALINGS IN THE SOFTWARE.
|
||||||
-21
@@ -1,21 +0,0 @@
|
|||||||
SUBDIRS = src test
|
|
||||||
|
|
||||||
DOC_FILES = \
|
|
||||||
README.md \
|
|
||||||
LICENSE \
|
|
||||||
NOTICE \
|
|
||||||
msgpack_vc8.vcproj \
|
|
||||||
msgpack_vc8.sln \
|
|
||||||
msgpack_vc.postbuild.bat
|
|
||||||
|
|
||||||
EXTRA_DIST = \
|
|
||||||
$(DOC_FILES) CMakeLists.txt test/CMakeLists.txt
|
|
||||||
|
|
||||||
pkgconfigdir = $(libdir)/pkgconfig
|
|
||||||
pkgconfig_DATA = msgpack.pc
|
|
||||||
|
|
||||||
doxygen:
|
|
||||||
./preprocess clean
|
|
||||||
cd src && $(MAKE) doxygen
|
|
||||||
./preprocess
|
|
||||||
|
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
This product bundles Boost Predef and Boost Preprocessor.
|
||||||
|
They are 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)
|
||||||
|
|
||||||
|
For details, see the following files:
|
||||||
|
|
||||||
|
external/boost/predef
|
||||||
|
include/msgpack/predef.h
|
||||||
|
include/msgpack/predef/*
|
||||||
|
|
||||||
|
external/boost/preprocessor
|
||||||
|
include/msgpack/preprocessor.hpp
|
||||||
|
include/msgpack/preprocessor/*
|
||||||
-194
@@ -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-0.5.5.tar.gz
|
|
||||||
$ tar zxvf msgpack-0.5.5.tar.gz
|
|
||||||
$ cd msgpack-0.5.5
|
|
||||||
$ ./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_raw(pk, 5);
|
|
||||||
msgpack_pack_raw_body(pk, "Hello", 5);
|
|
||||||
msgpack_pack_raw(pk, 11);
|
|
||||||
msgpack_pack_raw_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_raw(pk, 5);
|
|
||||||
msgpack_pack_raw_body(pk, "Hello", 5);
|
|
||||||
msgpack_pack_raw(pk, 11);
|
|
||||||
msgpack_pack_raw_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 -lmsgpack -o stream
|
|
||||||
* $ ./stream
|
|
||||||
* 1
|
|
||||||
* 2
|
|
||||||
* 3
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
```
|
|
||||||
@@ -1,159 +0,0 @@
|
|||||||
# Implementation Status
|
|
||||||
|
|
||||||
The serialization library is production-ready.
|
|
||||||
|
|
||||||
Currently, RPC implementation is in testing phase. Requires newer kernel, not running on RHEL5/CentOS5.
|
|
||||||
|
|
||||||
# Install
|
|
||||||
|
|
||||||
Same as QuickStart for C Language.
|
|
||||||
|
|
||||||
# Serialization QuickStart for C+\+
|
|
||||||
|
|
||||||
## First program
|
|
||||||
|
|
||||||
Include `msgpack.hpp` header and link `msgpack` library to use MessagePack on your program.
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
#include <msgpack.hpp>
|
|
||||||
#include <vector>
|
|
||||||
#include <string>
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
int main(void) {
|
|
||||||
// serializes this object.
|
|
||||||
std::vector<std::string> vec;
|
|
||||||
vec.push_back("Hello");
|
|
||||||
vec.push_back("MessagePack");
|
|
||||||
|
|
||||||
// serialize it into simple buffer.
|
|
||||||
msgpack::sbuffer sbuf;
|
|
||||||
msgpack::pack(sbuf, vec);
|
|
||||||
|
|
||||||
// deserialize it.
|
|
||||||
msgpack::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++ hello.cc -lmsgpack -o hello
|
|
||||||
$ ./hello
|
|
||||||
["Hello", "MessagePack"]
|
|
||||||
```
|
|
||||||
|
|
||||||
## 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++ stream.cc -lmsgpack -o stream
|
|
||||||
// $ ./stream
|
|
||||||
// "Log message ... 1"
|
|
||||||
// "Log message ... 2"
|
|
||||||
// "Log message ... 3"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Streaming into an array or map
|
|
||||||
|
|
||||||
```cpp
|
|
||||||
#include <msgpack.hpp>
|
|
||||||
#include <iostream>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
int main(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);
|
|
||||||
}
|
|
||||||
```
|
|
||||||
@@ -1,9 +1,7 @@
|
|||||||
`msgpack` for C/C++
|
`msgpack` for C/C++
|
||||||
===================
|
===================
|
||||||
|
|
||||||
Version 1.1.0 [](https://travis-ci.org/msgpack/msgpack-c)
|
It's like JSON but smaller and faster.
|
||||||
|
|
||||||
It's like JSON but small and fast.
|
|
||||||
|
|
||||||
Overview
|
Overview
|
||||||
--------
|
--------
|
||||||
@@ -11,196 +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 your_source_file.cpp
|
|
||||||
|
|
||||||
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
|
||||||
@@ -215,5 +37,5 @@ Here's the list of [great contributors](https://github.com/msgpack/msgpack-c/gra
|
|||||||
License
|
License
|
||||||
-------
|
-------
|
||||||
|
|
||||||
`msgpack-c` is licensed under the Apache License Version 2.0. See
|
`msgpack-c` is licensed under the Boost Software License, Version 1.0. See
|
||||||
the [`LICENSE`](./LICENSE) file for details.
|
the [`LICENSE_1_0.txt`](./LICENSE_1_0.txt) file for details.
|
||||||
|
|||||||
@@ -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 || touch 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 +0,0 @@
|
|||||||
[false,true,null,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,127,127,255,65535,4294967295,-32,-32,-128,-32768,-2147483648,0.0,-0.0,1.0,-1.0,"a","a","a","","","",[0],[0],[0],[],[],[],{},{},{},{"a":97},{"a":97},{"a":97},[[]],[["a"]]]
|
|
||||||
@@ -1,99 +0,0 @@
|
|||||||
#
|
|
||||||
# MessagePack format test case
|
|
||||||
#
|
|
||||||
begin
|
|
||||||
require 'rubygems'
|
|
||||||
rescue LoadError
|
|
||||||
end
|
|
||||||
require 'msgpack'
|
|
||||||
require 'json'
|
|
||||||
|
|
||||||
source = <<EOF
|
|
||||||
c2 # false
|
|
||||||
c3 # true
|
|
||||||
c0 # nil
|
|
||||||
00 # 0 Positive FixNum
|
|
||||||
cc 00 # 0 uint8
|
|
||||||
cd 00 00 # 0 uint16
|
|
||||||
ce 00 00 00 00 # 0 uint32
|
|
||||||
cf 00 00 00 00 00 00 00 00 # 0 uint64
|
|
||||||
d0 00 # 0 int8
|
|
||||||
d1 00 00 # 0 int16
|
|
||||||
d2 00 00 00 00 # 0 int32
|
|
||||||
d3 00 00 00 00 00 00 00 00 # 0 int64
|
|
||||||
ff # -1 Negative FixNum
|
|
||||||
d0 ff # -1 int8
|
|
||||||
d1 ff ff # -1 int16
|
|
||||||
d2 ff ff ff ff # -1 int32
|
|
||||||
d3 ff ff ff ff ff ff ff ff # -1 int64
|
|
||||||
7f # 127 Positive FixNum
|
|
||||||
cc 7f # 127 uint8
|
|
||||||
cd 00 ff # 255 uint16
|
|
||||||
ce 00 00 ff ff # 65535 uint32
|
|
||||||
cf 00 00 00 00 ff ff ff ff # 4294967295 uint64
|
|
||||||
e0 # -32 Negative FixNum
|
|
||||||
d0 e0 # -32 int8
|
|
||||||
d1 ff 80 # -128 int16
|
|
||||||
d2 ff ff 80 00 # -32768 int32
|
|
||||||
d3 ff ff ff ff 80 00 00 00 # -2147483648 int64
|
|
||||||
#ca 00 00 00 00 # 0.0 float
|
|
||||||
cb 00 00 00 00 00 00 00 00 # 0.0 double
|
|
||||||
#ca 80 00 00 00 # -0.0 float
|
|
||||||
cb 80 00 00 00 00 00 00 00 # -0.0 double
|
|
||||||
cb 3f f0 00 00 00 00 00 00 # 1.0 double
|
|
||||||
cb bf f0 00 00 00 00 00 00 # -1.0 double
|
|
||||||
a1 61 # "a" FixRaw
|
|
||||||
da 00 01 61 # "a" raw 16
|
|
||||||
db 00 00 00 01 61 # "a" raw 32
|
|
||||||
a0 # "" FixRaw
|
|
||||||
da 00 00 # "" raw 16
|
|
||||||
db 00 00 00 00 # "" raw 32
|
|
||||||
91 00 # [0] FixArray
|
|
||||||
dc 00 01 00 # [0] array 16
|
|
||||||
dd 00 00 00 01 00 # [0] array 32
|
|
||||||
90 # [] FixArray
|
|
||||||
dc 00 00 # [] array 16
|
|
||||||
dd 00 00 00 00 # [] array 32
|
|
||||||
80 # {} FixMap
|
|
||||||
de 00 00 # {} map 16
|
|
||||||
df 00 00 00 00 # {} map 32
|
|
||||||
81 a1 61 61 # {"a"=>97} FixMap
|
|
||||||
de 00 01 a1 61 61 # {"a"=>97} map 16
|
|
||||||
df 00 00 00 01 a1 61 61 # {"a"=>97} map 32
|
|
||||||
91 90 # [[]]
|
|
||||||
91 91 a1 61 # [["a"]]
|
|
||||||
EOF
|
|
||||||
|
|
||||||
source.gsub!(/\#.+$/,'')
|
|
||||||
bytes = source.strip.split(/\s+/).map {|x| x.to_i(16) }.pack('C*')
|
|
||||||
|
|
||||||
objs = []
|
|
||||||
compact_bytes = ""
|
|
||||||
|
|
||||||
pac = MessagePack::Unpacker.new
|
|
||||||
pac.feed(bytes)
|
|
||||||
pac.each {|obj|
|
|
||||||
p obj
|
|
||||||
objs << obj
|
|
||||||
compact_bytes << obj.to_msgpack
|
|
||||||
}
|
|
||||||
|
|
||||||
json = objs.to_json
|
|
||||||
|
|
||||||
# self check
|
|
||||||
cpac = MessagePack::Unpacker.new
|
|
||||||
cpac.feed(compact_bytes)
|
|
||||||
cpac.each {|cobj|
|
|
||||||
obj = objs.shift
|
|
||||||
if obj != cobj
|
|
||||||
puts "** SELF CHECK FAILED **"
|
|
||||||
puts "expected: #{obj.inspect}"
|
|
||||||
puts "actual: #{cobj.inspect}"
|
|
||||||
exit 1
|
|
||||||
end
|
|
||||||
}
|
|
||||||
|
|
||||||
File.open("cases.mpac","w") {|f| f.write(bytes) }
|
|
||||||
File.open("cases_compact.mpac","w") {|f| f.write(compact_bytes) }
|
|
||||||
File.open("cases.json","w") {|f| f.write(json) }
|
|
||||||
|
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
./bootstrap
|
|
||||||
ret=$?
|
|
||||||
if [ $ret -ne 0 ]
|
|
||||||
then
|
|
||||||
exit $ret
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ $1 = "cpp11" ]
|
|
||||||
then
|
|
||||||
if [ $2 = "32" ]
|
|
||||||
then
|
|
||||||
./configure CFLAGS="-m32" CXXFLAGS="-std=c++11 -m32"
|
|
||||||
else
|
|
||||||
./configure CXXFLAGS="-std=c++11"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
if [ $2 = "32" ]
|
|
||||||
then
|
|
||||||
./configure CFLAGS="-m32" CXXFLAGS="-m32"
|
|
||||||
else
|
|
||||||
./configure
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
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`/install
|
|
||||||
|
|
||||||
ret=$?
|
|
||||||
if [ $ret -ne 0 ]
|
|
||||||
then
|
|
||||||
exit $ret
|
|
||||||
fi
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
@@ -1,83 +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
|
|
||||||
if [ $2 = "32" ]
|
|
||||||
then
|
|
||||||
cmake -DMSGPACK_CXX11=ON -DMSGPACK_32BIT=ON ..
|
|
||||||
else
|
|
||||||
cmake -DMSGPACK_CXX11=ON ..
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
if [ $2 = "32" ]
|
|
||||||
then
|
|
||||||
cmake -DMSGPACK_32BIT=ON ..
|
|
||||||
else
|
|
||||||
cmake ..
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
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
|
|
||||||
@@ -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 $CFLAGS"
|
|
||||||
|
|
||||||
AC_SUBST(CXXFLAGS)
|
|
||||||
CXXFLAGS="-O3 -Wall $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])
|
|
||||||
-133
@@ -1,133 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack cross-language test tool
|
|
||||||
//
|
|
||||||
// $ cd ../cpp && ./configure && make && make install
|
|
||||||
// or
|
|
||||||
// $ port install msgpack # MacPorts
|
|
||||||
//
|
|
||||||
// $ g++ -Wall crosslang.cc -lmsgpack
|
|
||||||
//
|
|
||||||
#include <msgpack.hpp>
|
|
||||||
#include <iostream>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
static int run(int infd, int outfd)
|
|
||||||
try {
|
|
||||||
msgpack::unpacker pac;
|
|
||||||
|
|
||||||
while(true) {
|
|
||||||
pac.reserve_buffer(32*1024);
|
|
||||||
|
|
||||||
ssize_t count =
|
|
||||||
read(infd, pac.buffer(), pac.buffer_capacity());
|
|
||||||
|
|
||||||
if(count <= 0) {
|
|
||||||
if(count == 0) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if(errno == EAGAIN || errno == EINTR) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
pac.buffer_consumed(count);
|
|
||||||
|
|
||||||
msgpack::unpacked result;
|
|
||||||
while(pac.next(&result)) {
|
|
||||||
msgpack::sbuffer sbuf;
|
|
||||||
msgpack::pack(sbuf, result.get());
|
|
||||||
|
|
||||||
const char* p = sbuf.data();
|
|
||||||
const char* const pend = p + sbuf.size();
|
|
||||||
while(p < pend) {
|
|
||||||
ssize_t bytes = write(outfd, p, pend-p);
|
|
||||||
|
|
||||||
if(bytes <= 0) {
|
|
||||||
if(count == 0) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if(errno == EAGAIN || errno == EINTR) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
p += bytes;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
} catch (std::exception& e) {
|
|
||||||
std::cerr << e.what() << std::endl;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void usage(const char* prog)
|
|
||||||
{
|
|
||||||
printf(
|
|
||||||
"Usage: %s [in-file] [out-file]\n"
|
|
||||||
"\n"
|
|
||||||
"This tool is for testing of MessagePack implementation.\n"
|
|
||||||
"This does following behavior:\n"
|
|
||||||
"\n"
|
|
||||||
" 1. Reads objects serialized by MessagePack from <in-file> (default: stdin)\n"
|
|
||||||
" 2. Re-serializes the objects using C++ implementation of MessagePack (Note that C++ implementation is considered valid)\n"
|
|
||||||
" 3. Writes the re-serialized objects into <out-file> (default: stdout)\n"
|
|
||||||
"\n"
|
|
||||||
, prog);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char* argv[])
|
|
||||||
{
|
|
||||||
int infd = 0;
|
|
||||||
int outfd = 1;
|
|
||||||
|
|
||||||
if(argc < 1 || argc > 3) {
|
|
||||||
usage(argv[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
for(int i=1; i < argc; ++i) {
|
|
||||||
if(strlen(argv[i]) > 1 && argv[i][0] == '-') {
|
|
||||||
usage(argv[0]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(argc >= 2) {
|
|
||||||
const char* fname = argv[1];
|
|
||||||
if(strcmp(fname, "-") != 0) {
|
|
||||||
infd = open(fname, O_RDONLY);
|
|
||||||
if(infd < 0) {
|
|
||||||
perror("can't open input file");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(argc >= 3) {
|
|
||||||
const char* fname = argv[2];
|
|
||||||
if(strcmp(fname, "-") != 0) {
|
|
||||||
outfd = open(fname, O_WRONLY | O_CREAT| O_TRUNC, 0666);
|
|
||||||
if(outfd < 0) {
|
|
||||||
perror("can't open output file");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int code = run(infd, outfd);
|
|
||||||
|
|
||||||
close(infd);
|
|
||||||
close(outfd);
|
|
||||||
|
|
||||||
return code;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,88 +0,0 @@
|
|||||||
#
|
|
||||||
# MessagePack cross-language test tool
|
|
||||||
#
|
|
||||||
# $ gem install msgpack
|
|
||||||
# or
|
|
||||||
# $ port install rb_msgpack # MacPorts
|
|
||||||
#
|
|
||||||
begin
|
|
||||||
require 'rubygems'
|
|
||||||
rescue LoadError
|
|
||||||
end
|
|
||||||
require 'msgpack'
|
|
||||||
|
|
||||||
def run(inio, outio)
|
|
||||||
pac = MessagePack::Unpacker.new(inio)
|
|
||||||
|
|
||||||
begin
|
|
||||||
pac.each {|obj|
|
|
||||||
outio.write MessagePack.pack(obj)
|
|
||||||
outio.flush
|
|
||||||
}
|
|
||||||
rescue EOFError
|
|
||||||
return 0
|
|
||||||
rescue
|
|
||||||
$stderr.puts $!
|
|
||||||
return 1
|
|
||||||
end
|
|
||||||
|
|
||||||
return 0
|
|
||||||
end
|
|
||||||
|
|
||||||
def usage
|
|
||||||
puts <<EOF
|
|
||||||
Usage: #{$0} [in-file] [out-file]
|
|
||||||
|
|
||||||
This tool is for testing of MessagePack implementation.
|
|
||||||
This does following behavior:
|
|
||||||
|
|
||||||
1. Reads objects serialized by MessagePack from <in-file> (default: stdin)
|
|
||||||
2. Re-serializes the objects using Ruby implementation of MessagePack (Note that Ruby implementation is considered valid)
|
|
||||||
3. Writes the re-serialized objects into <out-file> (default: stdout)
|
|
||||||
|
|
||||||
EOF
|
|
||||||
exit 1
|
|
||||||
end
|
|
||||||
|
|
||||||
inio = $stdin
|
|
||||||
outio = $stdout
|
|
||||||
|
|
||||||
if ARGV.length > 2
|
|
||||||
usage
|
|
||||||
end
|
|
||||||
|
|
||||||
ARGV.each {|str|
|
|
||||||
if str.size > 1 && str[0] == ?-
|
|
||||||
usage
|
|
||||||
end
|
|
||||||
}
|
|
||||||
|
|
||||||
if fname = ARGV[0]
|
|
||||||
unless fname == "-"
|
|
||||||
begin
|
|
||||||
inio = File.open(fname)
|
|
||||||
rescue
|
|
||||||
puts "can't open output file: #{$!}"
|
|
||||||
exit 1
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if fname = ARGV[1]
|
|
||||||
unless fname == "-"
|
|
||||||
begin
|
|
||||||
outio = File.open(fname, "w")
|
|
||||||
rescue
|
|
||||||
puts "can't open output file: #{$!}"
|
|
||||||
exit 1
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
code = run(inio, outio)
|
|
||||||
|
|
||||||
inio.close
|
|
||||||
outio.close
|
|
||||||
|
|
||||||
exit code
|
|
||||||
|
|
||||||
@@ -1,179 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2009 FURUHASHI Sadayuki
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
#ifndef MSGPACK_CPP03_DEFINE_HPP
|
|
||||||
#define MSGPACK_CPP03_DEFINE_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(...) \
|
|
||||||
template <typename Packer> \
|
|
||||||
void msgpack_pack(Packer& pk) const \
|
|
||||||
{ \
|
|
||||||
msgpack::type::make_define(__VA_ARGS__).msgpack_pack(pk); \
|
|
||||||
} \
|
|
||||||
void msgpack_unpack(msgpack::object const& o) \
|
|
||||||
{ \
|
|
||||||
msgpack::type::make_define(__VA_ARGS__).msgpack_unpack(o); \
|
|
||||||
}\
|
|
||||||
template <typename MSGPACK_OBJECT> \
|
|
||||||
void msgpack_object(MSGPACK_OBJECT* o, msgpack::zone& z) const \
|
|
||||||
{ \
|
|
||||||
msgpack::type::make_define(__VA_ARGS__).msgpack_object(o, z); \
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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;
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct define<> {
|
|
||||||
typedef define<> 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<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> {
|
|
||||||
typedef define<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> value_type;
|
|
||||||
typedef tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> tuple_type;
|
|
||||||
define(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<> make_define()
|
|
||||||
{
|
|
||||||
return define<>();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
<%0.upto(GENERATION_LIMIT) {|i|%>
|
|
||||||
template <typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>>
|
|
||||||
define<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> make_define(A0& a0<%1.upto(i) {|j|%>, A<%=j%>& a<%=j%><%}%>)
|
|
||||||
{
|
|
||||||
return define<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_HPP
|
|
||||||
@@ -1,246 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2013 FURUHASHI Sadayuki and KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
#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,340 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ memory pool
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2010 FURUHASHI Sadayuki
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
#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 {
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @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,123 +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;
|
|
||||||
}
|
|
||||||
|
|
||||||
#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;
|
|
||||||
char* buf;
|
|
||||||
size_t recv_len;
|
|
||||||
int recv_count = 0;
|
|
||||||
int i = 0;
|
|
||||||
|
|
||||||
msgpack_unpacked_init(&result);
|
|
||||||
if (msgpack_unpacker_buffer_capacity(unp) < EACH_RECV_SIZE) {
|
|
||||||
bool expanded = msgpack_unpacker_reserve_buffer(unp, 100);
|
|
||||||
assert(expanded);
|
|
||||||
}
|
|
||||||
buf = msgpack_unpacker_buffer(unp);
|
|
||||||
|
|
||||||
recv_len = receiver_recv(r, buf, EACH_RECV_SIZE);
|
|
||||||
msgpack_unpacker_buffer_consumed(unp, recv_len);
|
|
||||||
|
|
||||||
|
|
||||||
while (recv_len > 0) {
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
if (msgpack_unpacker_buffer_capacity(unp) < EACH_RECV_SIZE) {
|
|
||||||
bool expanded = msgpack_unpacker_reserve_buffer(unp, 100);
|
|
||||||
assert(expanded);
|
|
||||||
}
|
|
||||||
buf = msgpack_unpacker_buffer(unp);
|
|
||||||
recv_len = receiver_recv(r, buf, 4);
|
|
||||||
msgpack_unpacker_buffer_consumed(unp, recv_len);
|
|
||||||
}
|
|
||||||
msgpack_unpacked_destroy(&result);
|
|
||||||
}
|
|
||||||
|
|
||||||
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,38 +0,0 @@
|
|||||||
#include <msgpack.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
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);
|
|
||||||
|
|
||||||
/* 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);
|
|
||||||
{
|
|
||||||
int 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(int argc, char **argv)
|
|
||||||
{
|
|
||||||
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);
|
|
||||||
{
|
|
||||||
int 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(int argc, char **argv)
|
|
||||||
{
|
|
||||||
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,80 +0,0 @@
|
|||||||
// MessagePack for C++ example
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2015 FURUHASHI Sadayuki and KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
|
|
||||||
#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) {}
|
|
||||||
|
|
||||||
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(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,126 +0,0 @@
|
|||||||
// MessagePack for C++ example
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2015 FURUHASHI Sadayuki and KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
|
|
||||||
#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,75 +0,0 @@
|
|||||||
// MessagePack for C++ example
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2015 FURUHASHI Sadayuki and KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
|
|
||||||
#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,67 +0,0 @@
|
|||||||
// MessagePack for C++ example
|
|
||||||
//
|
|
||||||
// Copyright (C) 2015 KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
|
|
||||||
#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,105 +0,0 @@
|
|||||||
// MessagePack for C++ example
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2015 FURUHASHI Sadayuki and KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
|
|
||||||
#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,47 +0,0 @@
|
|||||||
// MessagePack for C++ example
|
|
||||||
//
|
|
||||||
// Copyright (C) 2015 KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
|
|
||||||
#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);
|
|
||||||
assert(obj.as<std::vector<int> >() == v);
|
|
||||||
|
|
||||||
// msgpack str is constructed on z.
|
|
||||||
assert(msgpack::unpack(z, ss.str().data(), ss.str().size(), offset).as<std::string>() == s);
|
|
||||||
}
|
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
// MessagePack for C++ example
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2015 FURUHASHI Sadayuki and KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
|
|
||||||
#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,71 +0,0 @@
|
|||||||
// MessagePack for C++ example
|
|
||||||
//
|
|
||||||
// Copyright (C) 2013-2015 KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
|
|
||||||
// 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,94 +0,0 @@
|
|||||||
// MessagePack for C++ example
|
|
||||||
//
|
|
||||||
// Copyright (C) 2013-2015 KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
|
|
||||||
// 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 (int 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 (int 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 = 16;
|
|
||||||
std::cout << "Setting up array data..." << std::endl;
|
|
||||||
typename 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;
|
|
||||||
typename 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,150 +0,0 @@
|
|||||||
// MessagePack for C++ example
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2015 FURUHASHI Sadayuki and KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
|
|
||||||
#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];
|
|
||||||
pipe(pair);
|
|
||||||
|
|
||||||
// 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,108 +0,0 @@
|
|||||||
// MessagePack for C++ example
|
|
||||||
//
|
|
||||||
// Copyright (C) 2015 KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
|
|
||||||
#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::array<int, 5> const& new_a = obj.as<std::array<int, 5>>();
|
|
||||||
|
|
||||||
assert(new_a == 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();
|
|
||||||
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());
|
|
||||||
assert(und.get().as<decltype(m)>() == m);
|
|
||||||
}
|
|
||||||
|
|
||||||
void unordered_set() {
|
|
||||||
std::unordered_set<std::string> s { "ABC", "DEF" };
|
|
||||||
std::stringstream ss;
|
|
||||||
msgpack::pack(ss, s);
|
|
||||||
|
|
||||||
assert(msgpack::unpack(ss.str().data(), ss.str().size()).get().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);
|
|
||||||
|
|
||||||
assert(msgpack::unpack(ss.str().data(), ss.str().size()).get().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;
|
|
||||||
assert(msgpack::unpack(ss.str().data(), ss.str().size(), offset).get().as<decltype(a)>() == a);
|
|
||||||
assert(msgpack::unpack(ss.str().data(), ss.str().size(), offset).get().as<decltype(t)>() == t);
|
|
||||||
assert(msgpack::unpack(ss.str().data(), ss.str().size(), offset).get().as<decltype(m)>() == m);
|
|
||||||
assert(msgpack::unpack(ss.str().data(), ss.str().size(), offset).get().as<decltype(s)>() == s);
|
|
||||||
assert(msgpack::unpack(ss.str().data(), ss.str().size(), offset).get().as<decltype(f)>() == f);
|
|
||||||
}
|
|
||||||
|
|
||||||
int main() {
|
|
||||||
array();
|
|
||||||
tuple();
|
|
||||||
unordered_map();
|
|
||||||
unordered_set();
|
|
||||||
forward_list();
|
|
||||||
combi();
|
|
||||||
}
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
/*
|
|
||||||
* MessagePack for C
|
|
||||||
*
|
|
||||||
* Copyright (C) 2008-2009 FURUHASHI Sadayuki
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @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,26 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2009 FURUHASHI Sadayuki
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
#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,92 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2015 KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
#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>
|
|
||||||
struct convert {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, T& v) const;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct pack {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, T const& v) const;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct object {
|
|
||||||
void operator()(msgpack::object& o, T const& v) const;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
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,74 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2009 FURUHASHI Sadayuki
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
#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,165 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2014-2015 KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
#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,65 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2015 KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
#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) {
|
|
||||||
}
|
|
||||||
|
|
||||||
} // 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,91 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2014-2015 KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
|
|
||||||
#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 <array>
|
|
||||||
|
|
||||||
namespace msgpack {
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
MSGPACK_API_VERSION_NAMESPACE(v1) {
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
namespace adaptor {
|
|
||||||
|
|
||||||
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,97 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2014-2015 KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
#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,87 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2014 KONDO-2015 Takatoshi
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
|
|
||||||
#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>
|
|
||||||
struct convert<std::forward_list<T>> {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, std::forward_list<T>& 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>
|
|
||||||
struct pack<std::forward_list<T>> {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::forward_list<T>& 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>
|
|
||||||
struct object_with_zone<std::forward_list<T>> {
|
|
||||||
void operator()(msgpack::object::with_zone& o, const std::forward_list<T>& 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,174 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2015 FURUHASHI Sadayuki and KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
#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 <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, 1> {
|
|
||||||
static void pack (
|
|
||||||
msgpack::packer<Stream>& o,
|
|
||||||
const Tuple& v) {
|
|
||||||
o.pack(std::get<0>(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 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, 1> {
|
|
||||||
static void convert (
|
|
||||||
msgpack::object const& o,
|
|
||||||
Tuple& v) {
|
|
||||||
o.via.array.ptr[0].convert<typename std::remove_reference<decltype(std::get<0>(v))>::type>(std::get<0>(v));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Tuple>
|
|
||||||
struct StdTupleConverter<Tuple, 0> {
|
|
||||||
static void convert (
|
|
||||||
msgpack::object const&,
|
|
||||||
Tuple&) {
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
namespace adaptor {
|
|
||||||
|
|
||||||
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, 1> {
|
|
||||||
static void convert (
|
|
||||||
msgpack::object::with_zone& o,
|
|
||||||
const Tuple& v) {
|
|
||||||
o.via.array.ptr[0] = msgpack::object(std::get<0>(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,158 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2014-2015 KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
#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>
|
|
||||||
struct convert<std::unordered_map<K, V>> {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, std::unordered_map<K, V>& 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> 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>
|
|
||||||
struct pack<std::unordered_map<K, V>> {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::unordered_map<K,V>& v) const {
|
|
||||||
uint32_t size = checked_get_container_size(v.size());
|
|
||||||
o.pack_map(size);
|
|
||||||
for(typename std::unordered_map<K,V>::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>
|
|
||||||
struct object_with_zone<std::unordered_map<K, V>> {
|
|
||||||
void operator()(msgpack::object::with_zone& o, const std::unordered_map<K,V>& 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>::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>
|
|
||||||
struct convert<std::unordered_multimap<K, V>> {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, std::unordered_multimap<K, V>& 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> 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>
|
|
||||||
struct pack<std::unordered_multimap<K, V>> {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::unordered_multimap<K,V>& v) const {
|
|
||||||
uint32_t size = checked_get_container_size(v.size());
|
|
||||||
o.pack_map(size);
|
|
||||||
for(typename std::unordered_multimap<K,V>::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>
|
|
||||||
struct object_with_zone<std::unordered_multimap<K, V>> {
|
|
||||||
void operator()(msgpack::object::with_zone& o, const std::unordered_multimap<K,V>& 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>::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,150 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2014-2015 KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
#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 T>
|
|
||||||
struct convert<std::unordered_set<T>> {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, std::unordered_set<T>& 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<T> tmp;
|
|
||||||
while(p > pbegin) {
|
|
||||||
--p;
|
|
||||||
tmp.insert(p->as<T>());
|
|
||||||
}
|
|
||||||
tmp.swap(v);
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct pack<std::unordered_set<T>> {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::unordered_set<T>& v) const {
|
|
||||||
uint32_t size = checked_get_container_size(v.size());
|
|
||||||
o.pack_array(size);
|
|
||||||
for(typename std::unordered_set<T>::const_iterator it(v.begin()), it_end(v.end());
|
|
||||||
it != it_end; ++it) {
|
|
||||||
o.pack(*it);
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct object_with_zone<std::unordered_set<T>> {
|
|
||||||
void operator()(msgpack::object::with_zone& o, const std::unordered_set<T>& 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<T>::const_iterator it(v.begin());
|
|
||||||
do {
|
|
||||||
*p = msgpack::object(*it, o.zone);
|
|
||||||
++p;
|
|
||||||
++it;
|
|
||||||
} while(p < pend);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct convert<std::unordered_multiset<T>> {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, std::unordered_multiset<T>& 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<T> tmp;
|
|
||||||
while(p > pbegin) {
|
|
||||||
--p;
|
|
||||||
tmp.insert(p->as<T>());
|
|
||||||
}
|
|
||||||
tmp.swap(v);
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct pack<std::unordered_multiset<T>> {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::unordered_multiset<T>& v) const {
|
|
||||||
uint32_t size = checked_get_container_size(v.size());
|
|
||||||
o.pack_array(size);
|
|
||||||
for(typename std::unordered_multiset<T>::const_iterator it(v.begin()), it_end(v.end());
|
|
||||||
it != it_end; ++it) {
|
|
||||||
o.pack(*it);
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct object_with_zone<std::unordered_multiset<T>> {
|
|
||||||
void operator()(msgpack::object::with_zone& o, const std::unordered_multiset<T>& 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<T>::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,29 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2014 FURUHASHI Sadayuki and KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
#ifndef MSGPACK_DEFINE_HPP
|
|
||||||
#define MSGPACK_DEFINE_HPP
|
|
||||||
|
|
||||||
#include "msgpack/cpp_config.hpp"
|
|
||||||
|
|
||||||
#if defined(MSGPACK_USE_CPP03)
|
|
||||||
#include "detail/cpp03_define.hpp"
|
|
||||||
#else // MSGPACK_USE_CPP03
|
|
||||||
#include "detail/cpp11_define.hpp"
|
|
||||||
#endif // MSGPACK_USE_CPP03
|
|
||||||
|
|
||||||
#endif // MSGPACK_DEFINE_HPP
|
|
||||||
@@ -1,95 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2015 FURUHASHI Sadayuki
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
#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 {
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct convert<std::deque<T> > {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, std::deque<T>& 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>::iterator it = v.begin();
|
|
||||||
for(; p < pend; ++p, ++it) {
|
|
||||||
p->convert(*it);
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct pack<std::deque<T> > {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::deque<T>& v) const {
|
|
||||||
uint32_t size = checked_get_container_size(v.size());
|
|
||||||
o.pack_array(size);
|
|
||||||
for(typename std::deque<T>::const_iterator it(v.begin()), it_end(v.end());
|
|
||||||
it != it_end; ++it) {
|
|
||||||
o.pack(*it);
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct object_with_zone<std::deque<T> > {
|
|
||||||
void operator()(msgpack::object::with_zone& o, const std::deque<T>& 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>::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
@@ -1,199 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2013 FURUHASHI Sadayuki and KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
#ifndef MSGPACK_CPP11_DEFINE_HPP
|
|
||||||
#define MSGPACK_CPP11_DEFINE_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(...) \
|
|
||||||
template <typename Packer> \
|
|
||||||
void msgpack_pack(Packer& pk) const \
|
|
||||||
{ \
|
|
||||||
msgpack::type::make_define(__VA_ARGS__).msgpack_pack(pk); \
|
|
||||||
} \
|
|
||||||
void msgpack_unpack(msgpack::object const& o) \
|
|
||||||
{ \
|
|
||||||
msgpack::type::make_define(__VA_ARGS__).msgpack_unpack(o); \
|
|
||||||
}\
|
|
||||||
template <typename MSGPACK_OBJECT> \
|
|
||||||
void msgpack_object(MSGPACK_OBJECT* o, msgpack::zone& z) const \
|
|
||||||
{ \
|
|
||||||
msgpack::type::make_define(__VA_ARGS__).msgpack_object(o, z); \
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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_imp {
|
|
||||||
template <typename Packer>
|
|
||||||
static void pack(Packer& pk, Tuple const& t) {
|
|
||||||
define_imp<Tuple, N-1>::pack(pk, t);
|
|
||||||
pk.pack(std::get<N-1>(t));
|
|
||||||
}
|
|
||||||
static void unpack(msgpack::object const& o, Tuple& t) {
|
|
||||||
define_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_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_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 {
|
|
||||||
typedef define<Args...> value_type;
|
|
||||||
typedef std::tuple<Args...> tuple_type;
|
|
||||||
define(Args&... args) :
|
|
||||||
a(args...) {}
|
|
||||||
template <typename Packer>
|
|
||||||
void msgpack_pack(Packer& pk) const
|
|
||||||
{
|
|
||||||
pk.pack_array(sizeof...(Args));
|
|
||||||
|
|
||||||
define_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_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_imp<std::tuple<Args&...>, sizeof...(Args)>::object(o, z, a);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::tuple<Args&...> a;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct define<> {
|
|
||||||
typedef define<> 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<> make_define()
|
|
||||||
{
|
|
||||||
return define<>();
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename... Args>
|
|
||||||
define<Args...> make_define(Args&... args)
|
|
||||||
{
|
|
||||||
return define<Args...>(args...);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace type
|
|
||||||
/// @cond
|
|
||||||
} // MSGPACK_API_VERSION_NAMESPACE(v1)
|
|
||||||
/// @endcond
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
#endif // MSGPACK_CPP11_DEFINE_HPP
|
|
||||||
@@ -1,235 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2014 FURUHASHI Sadayuki and KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
#ifndef MSGPACK_CPP11_MSGPACK_TUPLE_HPP
|
|
||||||
#define MSGPACK_CPP11_MSGPACK_TUPLE_HPP
|
|
||||||
|
|
||||||
#include "msgpack/versioning.hpp"
|
|
||||||
#include "msgpack/object_fwd.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::make_tuple;
|
|
||||||
using std::tie;
|
|
||||||
using std::forward_as_tuple;
|
|
||||||
using std::swap;
|
|
||||||
|
|
||||||
template< class... Types >
|
|
||||||
class tuple : public std::tuple<Types...> {
|
|
||||||
public:
|
|
||||||
using base = std::tuple<Types...>;
|
|
||||||
|
|
||||||
using base::base;
|
|
||||||
|
|
||||||
tuple() = default;
|
|
||||||
tuple(tuple const&) = default;
|
|
||||||
tuple(tuple&&) = default;
|
|
||||||
|
|
||||||
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... Tuples >
|
|
||||||
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)...);
|
|
||||||
}
|
|
||||||
} // 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<type::tuple<Args...>> {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(
|
|
||||||
msgpack::packer<Stream>& o,
|
|
||||||
const 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 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 convert<type::tuple<Args...>> {
|
|
||||||
msgpack::object const& operator()(
|
|
||||||
msgpack::object const& o,
|
|
||||||
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<type::tuple<Args...>> {
|
|
||||||
void operator()(
|
|
||||||
msgpack::object::with_zone& o,
|
|
||||||
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,306 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2020 FURUHASHI Sadayuki
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
#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,131 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2009 FURUHASHI Sadayuki
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
#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,436 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2009 FURUHASHI Sadayuki
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
#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 inline 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 inline 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> {
|
|
||||||
static inline void make(msgpack::object& o, char 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 inline 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,95 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2015 FURUHASHI Sadayuki
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
#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 {
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct convert<std::list<T> > {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, std::list<T>& 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>::iterator it = v.begin();
|
|
||||||
for(; p < pend; ++p, ++it) {
|
|
||||||
p->convert(*it);
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct pack<std::list<T> > {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::list<T>& v) const {
|
|
||||||
uint32_t size = checked_get_container_size(v.size());
|
|
||||||
o.pack_array(size);
|
|
||||||
for(typename std::list<T>::const_iterator it(v.begin()), it_end(v.end());
|
|
||||||
it != it_end; ++it) {
|
|
||||||
o.pack(*it);
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct object_with_zone<std::list<T> > {
|
|
||||||
void operator()(msgpack::object::with_zone& o, const std::list<T>& 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>::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,237 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2015 FURUHASHI Sadayuki
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
#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>
|
|
||||||
class assoc_vector : public std::vector< std::pair<K, V> > {};
|
|
||||||
|
|
||||||
namespace detail {
|
|
||||||
template <typename K, typename V>
|
|
||||||
struct pair_first_less {
|
|
||||||
bool operator() (const std::pair<K, V>& x, const std::pair<K, V>& y) const
|
|
||||||
{ return x.first < y.first; }
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
} //namespace type
|
|
||||||
|
|
||||||
namespace adaptor {
|
|
||||||
|
|
||||||
template <typename K, typename V>
|
|
||||||
struct convert<type::assoc_vector<K, V> > {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, type::assoc_vector<K,V>& v) const {
|
|
||||||
if(o.type != msgpack::type::MAP) { throw msgpack::type_error(); }
|
|
||||||
v.resize(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;
|
|
||||||
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>());
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename K, typename V>
|
|
||||||
struct pack<type::assoc_vector<K, V> > {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const type::assoc_vector<K,V>& v) const {
|
|
||||||
uint32_t size = checked_get_container_size(v.size());
|
|
||||||
o.pack_map(size);
|
|
||||||
for(typename type::assoc_vector<K,V>::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>
|
|
||||||
struct object_with_zone<type::assoc_vector<K, V> > {
|
|
||||||
void operator()(msgpack::object::with_zone& o, const type::assoc_vector<K,V>& 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>::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>
|
|
||||||
struct convert<std::map<K, V> > {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, std::map<K, V>& 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> tmp;
|
|
||||||
for(; p != pend; ++p) {
|
|
||||||
K key;
|
|
||||||
p->key.convert(key);
|
|
||||||
typename std::map<K,V>::iterator it(tmp.lower_bound(key));
|
|
||||||
if(it != tmp.end() && !(key < it->first)) {
|
|
||||||
p->val.convert(it->second);
|
|
||||||
} else {
|
|
||||||
V val;
|
|
||||||
p->val.convert(val);
|
|
||||||
tmp.insert(it, std::pair<K,V>(key, val));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
tmp.swap(v);
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename K, typename V>
|
|
||||||
struct pack<std::map<K, V> > {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::map<K,V>& v) const {
|
|
||||||
uint32_t size = checked_get_container_size(v.size());
|
|
||||||
o.pack_map(size);
|
|
||||||
for(typename std::map<K,V>::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>
|
|
||||||
struct object_with_zone<std::map<K, V> > {
|
|
||||||
void operator()(msgpack::object::with_zone& o, const std::map<K,V>& 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>::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>
|
|
||||||
struct convert<std::multimap<K, V> > {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, std::multimap<K, V>& 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> 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>
|
|
||||||
struct pack<std::multimap<K, V> > {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::multimap<K,V>& v) const {
|
|
||||||
uint32_t size = checked_get_container_size(v.size());
|
|
||||||
o.pack_map(size);
|
|
||||||
for(typename std::multimap<K,V>::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>
|
|
||||||
struct object_with_zone<std::multimap<K, V> > {
|
|
||||||
void operator()(msgpack::object::with_zone& o, const std::multimap<K,V>& 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>::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,29 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2014 FURUHASHI Sadayuki and KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
#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,84 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2009 FURUHASHI Sadayuki
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
#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 { };
|
|
||||||
|
|
||||||
} // namespace type
|
|
||||||
|
|
||||||
namespace adaptor {
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct convert<type::nil> {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, type::nil&) const {
|
|
||||||
if(o.type != msgpack::type::NIL) { throw msgpack::type_error(); }
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct pack<type::nil> {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const type::nil&) const {
|
|
||||||
o.pack_nil();
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object<type::nil> {
|
|
||||||
void operator()(msgpack::object& o, type::nil) const {
|
|
||||||
o.type = msgpack::type::NIL;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object_with_zone<type::nil> {
|
|
||||||
void operator()(msgpack::object::with_zone& o, type::nil v) const {
|
|
||||||
static_cast<msgpack::object&>(o) << v;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace adaptror
|
|
||||||
|
|
||||||
template <>
|
|
||||||
inline void msgpack::object::as<void>() const
|
|
||||||
{
|
|
||||||
msgpack::type::nil v;
|
|
||||||
convert(v);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
} // MSGPACK_API_VERSION_NAMESPACE(v1)
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
#endif // MSGPACK_TYPE_NIL_HPP
|
|
||||||
@@ -1,75 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2009 FURUHASHI Sadayuki
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
#ifndef MSGPACK_TYPE_PAIR_HPP
|
|
||||||
#define MSGPACK_TYPE_PAIR_HPP
|
|
||||||
|
|
||||||
#include "msgpack/versioning.hpp"
|
|
||||||
#include "msgpack/adaptor/adaptor_base.hpp"
|
|
||||||
#include <utility>
|
|
||||||
|
|
||||||
namespace msgpack {
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
MSGPACK_API_VERSION_NAMESPACE(v1) {
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
namespace adaptor {
|
|
||||||
|
|
||||||
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,114 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2009 FURUHASHI Sadayuki
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
#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,149 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2015 FURUHASHI Sadayuki
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
#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 {
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct convert<std::set<T> > {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, std::set<T>& 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> tmp;
|
|
||||||
while(p > pbegin) {
|
|
||||||
--p;
|
|
||||||
tmp.insert(p->as<T>());
|
|
||||||
}
|
|
||||||
tmp.swap(v);
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct pack<std::set<T> > {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::set<T>& v) const {
|
|
||||||
uint32_t size = checked_get_container_size(v.size());
|
|
||||||
o.pack_array(size);
|
|
||||||
for(typename std::set<T>::const_iterator it(v.begin()), it_end(v.end());
|
|
||||||
it != it_end; ++it) {
|
|
||||||
o.pack(*it);
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct object_with_zone<std::set<T> > {
|
|
||||||
void operator()(msgpack::object::with_zone& o, const std::set<T>& 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>::const_iterator it(v.begin());
|
|
||||||
do {
|
|
||||||
*p = msgpack::object(*it, o.zone);
|
|
||||||
++p;
|
|
||||||
++it;
|
|
||||||
} while(p < pend);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct convert<std::multiset<T> > {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, std::multiset<T>& 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> tmp;
|
|
||||||
while(p > pbegin) {
|
|
||||||
--p;
|
|
||||||
tmp.insert(p->as<T>());
|
|
||||||
}
|
|
||||||
tmp.swap(v);
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct pack<std::multiset<T> > {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::multiset<T>& v) const {
|
|
||||||
uint32_t size = checked_get_container_size(v.size());
|
|
||||||
o.pack_array(size);
|
|
||||||
for(typename std::multiset<T>::const_iterator it(v.begin()), it_end(v.end());
|
|
||||||
it != it_end; ++it) {
|
|
||||||
o.pack(*it);
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct object_with_zone<std::multiset<T> > {
|
|
||||||
void operator()(msgpack::object::with_zone& o, const std::multiset<T>& 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>::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,94 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2015 FURUHASHI Sadayuki
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
#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,179 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2015 FURUHASHI Sadayuki
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
#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>
|
|
||||||
struct convert<MSGPACK_STD_TR1::unordered_map<K, V> > {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, MSGPACK_STD_TR1::unordered_map<K, V>& 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> 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>
|
|
||||||
struct pack<MSGPACK_STD_TR1::unordered_map<K, V> > {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const MSGPACK_STD_TR1::unordered_map<K,V>& v) const {
|
|
||||||
uint32_t size = checked_get_container_size(v.size());
|
|
||||||
o.pack_map(size);
|
|
||||||
for(typename MSGPACK_STD_TR1::unordered_map<K,V>::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>
|
|
||||||
struct object_with_zone<MSGPACK_STD_TR1::unordered_map<K, V> > {
|
|
||||||
void operator()(msgpack::object::with_zone& o, const MSGPACK_STD_TR1::unordered_map<K,V>& 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>::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>
|
|
||||||
struct convert<MSGPACK_STD_TR1::unordered_multimap<K, V> > {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, MSGPACK_STD_TR1::unordered_multimap<K, V>& 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> 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>
|
|
||||||
struct pack<MSGPACK_STD_TR1::unordered_multimap<K, V> > {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const MSGPACK_STD_TR1::unordered_multimap<K,V>& v) const {
|
|
||||||
uint32_t size = checked_get_container_size(v.size());
|
|
||||||
o.pack_map(size);
|
|
||||||
for(typename MSGPACK_STD_TR1::unordered_multimap<K,V>::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>
|
|
||||||
struct object_with_zone<MSGPACK_STD_TR1::unordered_multimap<K, V> > {
|
|
||||||
void operator()(msgpack::object::with_zone& o, const MSGPACK_STD_TR1::unordered_multimap<K,V>& 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>::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,173 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2015 FURUHASHI Sadayuki
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
#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>
|
|
||||||
struct convert<MSGPACK_STD_TR1::unordered_set<T> > {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, MSGPACK_STD_TR1::unordered_set<T>& 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> tmp;
|
|
||||||
while(p > pbegin) {
|
|
||||||
--p;
|
|
||||||
tmp.insert(p->as<T>());
|
|
||||||
}
|
|
||||||
tmp.swap(v);
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct pack<MSGPACK_STD_TR1::unordered_set<T> > {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const MSGPACK_STD_TR1::unordered_set<T>& v) const {
|
|
||||||
uint32_t size = checked_get_container_size(v.size());
|
|
||||||
o.pack_array(size);
|
|
||||||
for(typename MSGPACK_STD_TR1::unordered_set<T>::const_iterator it(v.begin()), it_end(v.end());
|
|
||||||
it != it_end; ++it) {
|
|
||||||
o.pack(*it);
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct object_with_zone<MSGPACK_STD_TR1::unordered_set<T> > {
|
|
||||||
void operator()(msgpack::object::with_zone& o, const MSGPACK_STD_TR1::unordered_set<T>& 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>::const_iterator it(v.begin());
|
|
||||||
do {
|
|
||||||
*p = msgpack::object(*it, o.zone);
|
|
||||||
++p;
|
|
||||||
++it;
|
|
||||||
} while(p < pend);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct convert<MSGPACK_STD_TR1::unordered_multiset<T> > {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, MSGPACK_STD_TR1::unordered_multiset<T>& 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> tmp;
|
|
||||||
while(p > pbegin) {
|
|
||||||
--p;
|
|
||||||
tmp.insert(p->as<T>());
|
|
||||||
}
|
|
||||||
tmp.swap(v);
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct pack<MSGPACK_STD_TR1::unordered_multiset<T> > {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const MSGPACK_STD_TR1::unordered_multiset<T>& v) const {
|
|
||||||
uint32_t size = checked_get_container_size(v.size());
|
|
||||||
o.pack_array(size);
|
|
||||||
for(typename MSGPACK_STD_TR1::unordered_multiset<T>::const_iterator it(v.begin()), it_end(v.end());
|
|
||||||
it != it_end; ++it) {
|
|
||||||
o.pack(*it);
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct object_with_zone<MSGPACK_STD_TR1::unordered_multiset<T> > {
|
|
||||||
void operator()(msgpack::object::with_zone& o, const MSGPACK_STD_TR1::unordered_multiset<T>& 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>::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,99 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2009 FURUHASHI Sadayuki
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
#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 {
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct convert<std::vector<T> > {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, std::vector<T>& 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>::iterator it = v.begin();
|
|
||||||
do {
|
|
||||||
p->convert(*it);
|
|
||||||
++p;
|
|
||||||
++it;
|
|
||||||
} while(p < pend);
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct pack<std::vector<T> > {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::vector<T>& v) const {
|
|
||||||
uint32_t size = checked_get_container_size(v.size());
|
|
||||||
o.pack_array(size);
|
|
||||||
for(typename std::vector<T>::const_iterator it(v.begin()), it_end(v.end());
|
|
||||||
it != it_end; ++it) {
|
|
||||||
o.pack(*it);
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct object_with_zone<std::vector<T> > {
|
|
||||||
void operator()(msgpack::object::with_zone& o, const std::vector<T>& 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>::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_VECTOR_HPP
|
|
||||||
@@ -1,96 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2015 KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
#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 <>
|
|
||||||
struct convert<std::vector<bool> > {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, std::vector<bool>& 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 (std::vector<bool>::iterator it = v.begin(), end = v.end();
|
|
||||||
it != end;
|
|
||||||
++it) {
|
|
||||||
*it = p->as<bool>();
|
|
||||||
++p;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct pack<std::vector<bool> > {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::vector<bool>& v) const {
|
|
||||||
uint32_t size = checked_get_container_size(v.size());
|
|
||||||
o.pack_array(size);
|
|
||||||
for(std::vector<bool>::const_iterator it(v.begin()), it_end(v.end());
|
|
||||||
it != it_end; ++it) {
|
|
||||||
o.pack(static_cast<bool>(*it));
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object_with_zone<std::vector<bool> > {
|
|
||||||
void operator()(msgpack::object::with_zone& o, const std::vector<bool>& 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;
|
|
||||||
std::vector<bool>::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,97 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2014-2015 KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
#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 <>
|
|
||||||
struct convert<std::vector<char> > {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, std::vector<char>& v) const {
|
|
||||||
switch (o.type) {
|
|
||||||
case msgpack::type::BIN:
|
|
||||||
v.resize(o.via.bin.size);
|
|
||||||
std::memcpy(&v.front(), o.via.bin.ptr, o.via.bin.size);
|
|
||||||
break;
|
|
||||||
case msgpack::type::STR:
|
|
||||||
v.resize(o.via.str.size);
|
|
||||||
std::memcpy(&v.front(), o.via.str.ptr, o.via.str.size);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
throw msgpack::type_error();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct pack<std::vector<char> > {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::vector<char>& v) const {
|
|
||||||
uint32_t size = checked_get_container_size(v.size());
|
|
||||||
o.pack_bin(size);
|
|
||||||
o.pack_bin_body(&v.front(), size);
|
|
||||||
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object<std::vector<char> > {
|
|
||||||
void operator()(msgpack::object& o, const std::vector<char>& v) const {
|
|
||||||
uint32_t size = checked_get_container_size(v.size());
|
|
||||||
o.type = msgpack::type::BIN;
|
|
||||||
o.via.bin.ptr = &v.front();
|
|
||||||
o.via.bin.size = size;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object_with_zone<std::vector<char> > {
|
|
||||||
void operator()(msgpack::object::with_zone& o, const std::vector<char>& 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.front(), size);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace adaptor
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
} // MSGPACK_API_VERSION_NAMESPACE(v1)
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
#endif // MSGPACK_TYPE_VECTOR_CHAR_HPP
|
|
||||||
@@ -1,117 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ C++03/C++11 Adaptation
|
|
||||||
//
|
|
||||||
// Copyright (C) 2013 KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
#ifndef MSGPACK_CPP_CONFIG_HPP
|
|
||||||
#define MSGPACK_CPP_CONFIG_HPP
|
|
||||||
|
|
||||||
#include "msgpack/versioning.hpp"
|
|
||||||
|
|
||||||
#if !defined(MSGPACK_USE_CPP03)
|
|
||||||
// If MSVC would support C++11 completely,
|
|
||||||
// then 'defined(_MSC_VER)' would replace with
|
|
||||||
// '_MSC_VER < XXXX'
|
|
||||||
# if (__cplusplus < 201103) || defined(_MSC_VER)
|
|
||||||
# define MSGPACK_USE_CPP03
|
|
||||||
# endif
|
|
||||||
#endif // MSGPACK_USE_CPP03
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#if defined __cplusplus
|
|
||||||
#if __cplusplus < 201103
|
|
||||||
|
|
||||||
#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> {
|
|
||||||
};
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
} // MSGPACK_API_VERSION_NAMESPACE(v1)
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
|
|
||||||
#else // __cplusplus < 201103
|
|
||||||
|
|
||||||
#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;
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
} // MSGPACK_API_VERSION_NAMESPACE(v1)
|
|
||||||
/// @endcond
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
|
|
||||||
#endif // __cplusplus < 201103
|
|
||||||
|
|
||||||
#endif // __cplusplus
|
|
||||||
|
|
||||||
#endif /* msgpack/cpp_config.hpp */
|
|
||||||
@@ -1,670 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ memory pool
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2010 FURUHASHI Sadayuki
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
#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 {
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @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,372 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ memory pool
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2013 FURUHASHI Sadayuki and KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
#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;
|
|
||||||
}
|
|
||||||
#if !defined(MSGPACK_USE_CPP03)
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
#if !defined(MSGPACK_USE_CPP03)
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
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) throw(std::bad_alloc)
|
|
||||||
{
|
|
||||||
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* mem) throw()
|
|
||||||
{
|
|
||||||
return mem;
|
|
||||||
}
|
|
||||||
static void operator delete(void * /*p*/, void* /*mem*/) throw()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
} // MSGPACK_API_VERSION_NAMESPACE(v1)
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
#endif // MSGPACK_CPP11_ZONE_HPP
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
/*
|
|
||||||
* MessagePack for C FILE* buffer adaptor
|
|
||||||
*
|
|
||||||
* Copyright (C) 2013 Vladimir Volodko
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
#ifndef MSGPACK_FBUFFER_H
|
|
||||||
#define MSGPACK_FBUFFER_H
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup msgpack_fbuffer FILE* buffer
|
|
||||||
* @ingroup msgpack_buffer
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
static inline int msgpack_fbuffer_write(void* data, const char* buf, unsigned int len)
|
|
||||||
{
|
|
||||||
return (1 == fwrite(buf, len, 1, (FILE *)data)) ? 0 : -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @} */
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* msgpack/fbuffer.h */
|
|
||||||
@@ -1,68 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ FILE* buffer adaptor
|
|
||||||
//
|
|
||||||
// Copyright (C) 2013 Vladimir Volodko
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
#ifndef MSGPACK_FBUFFER_HPP__
|
|
||||||
#define MSGPACK_FBUFFER_HPP__
|
|
||||||
|
|
||||||
#include "msgpack/versioning.hpp"
|
|
||||||
|
|
||||||
#include <cstdio>
|
|
||||||
#include <stdexcept>
|
|
||||||
|
|
||||||
namespace msgpack {
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
MSGPACK_API_VERSION_NAMESPACE(v1) {
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
class fbuffer {
|
|
||||||
public:
|
|
||||||
explicit fbuffer(FILE* file) : m_file(file) { }
|
|
||||||
|
|
||||||
public:
|
|
||||||
void write(const char* buf, unsigned int len)
|
|
||||||
{
|
|
||||||
if (1 != fwrite(buf, len, 1, m_file)) {
|
|
||||||
throw std::runtime_error("fwrite() failed");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
FILE* file() const
|
|
||||||
{
|
|
||||||
return m_file;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(MSGPACK_USE_CPP03)
|
|
||||||
private:
|
|
||||||
fbuffer(const fbuffer&);
|
|
||||||
fbuffer& operator=(const fbuffer&);
|
|
||||||
#else // defined(MSGPACK_USE_CPP03)
|
|
||||||
fbuffer(const fbuffer&) = delete;
|
|
||||||
fbuffer& operator=(const fbuffer&) = delete;
|
|
||||||
#endif // defined(MSGPACK_USE_CPP03)
|
|
||||||
|
|
||||||
private:
|
|
||||||
FILE* m_file;
|
|
||||||
};
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
} // MSGPACK_API_VERSION_NAMESPACE(v1)
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
#endif /* msgpack/fbuffer.hpp */
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
/*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef MSGPACK_GCC_ATOMIC_H
|
|
||||||
#define MSGPACK_GCC_ATOMIC_H
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef int _msgpack_atomic_counter_t;
|
|
||||||
|
|
||||||
int _msgpack_sync_decr_and_fetch(volatile _msgpack_atomic_counter_t* ptr);
|
|
||||||
int _msgpack_sync_incr_and_fetch(volatile _msgpack_atomic_counter_t* ptr);
|
|
||||||
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#endif // MSGPACK_GCC_ATOMIC_H
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2015 MIZUKI Hirata
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifndef MSGPACK_ITERATOR_HPP
|
|
||||||
#define MSGPACK_ITERATOR_HPP
|
|
||||||
#if !defined(MSGPACK_USE_CPP03)
|
|
||||||
|
|
||||||
#include <msgpack/object_fwd.hpp>
|
|
||||||
|
|
||||||
namespace msgpack
|
|
||||||
{
|
|
||||||
/// @cond
|
|
||||||
MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS)
|
|
||||||
{
|
|
||||||
/// @endcond
|
|
||||||
inline object_kv* begin(object_map &map) { return map.ptr; }
|
|
||||||
inline const object_kv* begin(const object_map &map) { return map.ptr; }
|
|
||||||
inline object_kv* end(object_map &map) { return map.ptr + map.size; }
|
|
||||||
inline const object_kv* end(const object_map &map) { return map.ptr + map.size; }
|
|
||||||
|
|
||||||
inline object* begin(object_array &array) { return array.ptr; }
|
|
||||||
inline const object* begin(const object_array &array) { return array.ptr; }
|
|
||||||
inline object* end(object_array &array) { return array.ptr + array.size; }
|
|
||||||
inline const object* end(const object_array &array) { return array.ptr + array.size; }
|
|
||||||
/// @cond
|
|
||||||
}
|
|
||||||
/// @endcond
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // !defined(MSGPACK_USE_CPP03)
|
|
||||||
#endif // MSGPACK_ITERATOR_HPP
|
|
||||||
@@ -1,119 +0,0 @@
|
|||||||
/*
|
|
||||||
* MessagePack for C dynamic typing routine
|
|
||||||
*
|
|
||||||
* Copyright (C) 2008-2009 FURUHASHI Sadayuki
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
#ifndef MSGPACK_OBJECT_H
|
|
||||||
#define MSGPACK_OBJECT_H
|
|
||||||
|
|
||||||
#include "zone.h"
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup msgpack_object Dynamically typed object
|
|
||||||
* @ingroup msgpack
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
MSGPACK_OBJECT_NIL = 0x00,
|
|
||||||
MSGPACK_OBJECT_BOOLEAN = 0x01,
|
|
||||||
MSGPACK_OBJECT_POSITIVE_INTEGER = 0x02,
|
|
||||||
MSGPACK_OBJECT_NEGATIVE_INTEGER = 0x03,
|
|
||||||
MSGPACK_OBJECT_FLOAT = 0x04,
|
|
||||||
#if defined(MSGPACK_USE_LEGACY_NAME_AS_FLOAT)
|
|
||||||
MSGPACK_OBJECT_DOUBLE = MSGPACK_OBJECT_FLOAT, /* obsolete */
|
|
||||||
#endif /* MSGPACK_USE_LEGACY_NAME_AS_FLOAT */
|
|
||||||
MSGPACK_OBJECT_STR = 0x05,
|
|
||||||
MSGPACK_OBJECT_ARRAY = 0x06,
|
|
||||||
MSGPACK_OBJECT_MAP = 0x07,
|
|
||||||
MSGPACK_OBJECT_BIN = 0x08,
|
|
||||||
MSGPACK_OBJECT_EXT = 0x09
|
|
||||||
} msgpack_object_type;
|
|
||||||
|
|
||||||
|
|
||||||
struct msgpack_object;
|
|
||||||
struct msgpack_object_kv;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint32_t size;
|
|
||||||
struct msgpack_object* ptr;
|
|
||||||
} msgpack_object_array;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint32_t size;
|
|
||||||
struct msgpack_object_kv* ptr;
|
|
||||||
} msgpack_object_map;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint32_t size;
|
|
||||||
const char* ptr;
|
|
||||||
} msgpack_object_str;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint32_t size;
|
|
||||||
const char* ptr;
|
|
||||||
} msgpack_object_bin;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int8_t type;
|
|
||||||
uint32_t size;
|
|
||||||
const char* ptr;
|
|
||||||
} msgpack_object_ext;
|
|
||||||
|
|
||||||
typedef union {
|
|
||||||
bool boolean;
|
|
||||||
uint64_t u64;
|
|
||||||
int64_t i64;
|
|
||||||
#if defined(MSGPACK_USE_LEGACY_NAME_AS_FLOAT)
|
|
||||||
double dec; /* obsolete*/
|
|
||||||
#endif /* MSGPACK_USE_LEGACY_NAME_AS_FLOAT */
|
|
||||||
double f64;
|
|
||||||
msgpack_object_array array;
|
|
||||||
msgpack_object_map map;
|
|
||||||
msgpack_object_str str;
|
|
||||||
msgpack_object_bin bin;
|
|
||||||
msgpack_object_ext ext;
|
|
||||||
} msgpack_object_union;
|
|
||||||
|
|
||||||
typedef struct msgpack_object {
|
|
||||||
msgpack_object_type type;
|
|
||||||
msgpack_object_union via;
|
|
||||||
} msgpack_object;
|
|
||||||
|
|
||||||
typedef struct msgpack_object_kv {
|
|
||||||
msgpack_object key;
|
|
||||||
msgpack_object val;
|
|
||||||
} msgpack_object_kv;
|
|
||||||
|
|
||||||
MSGPACK_DLLEXPORT
|
|
||||||
void msgpack_object_print(FILE* out, msgpack_object o);
|
|
||||||
|
|
||||||
MSGPACK_DLLEXPORT
|
|
||||||
bool msgpack_object_equal(const msgpack_object x, const msgpack_object y);
|
|
||||||
|
|
||||||
/** @} */
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* msgpack/object.h */
|
|
||||||
@@ -1,640 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2014 FURUHASHI Sadayuki and KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
#ifndef MSGPACK_OBJECT_HPP
|
|
||||||
#define MSGPACK_OBJECT_HPP
|
|
||||||
|
|
||||||
#include "msgpack/versioning.hpp"
|
|
||||||
#include "msgpack/pack.hpp"
|
|
||||||
#include "msgpack/zone.hpp"
|
|
||||||
#include "msgpack/adaptor/adaptor_base.hpp"
|
|
||||||
|
|
||||||
#include <cstring>
|
|
||||||
#include <stdexcept>
|
|
||||||
#include <typeinfo>
|
|
||||||
#include <limits>
|
|
||||||
#include <ostream>
|
|
||||||
#include <typeinfo>
|
|
||||||
|
|
||||||
namespace msgpack {
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
MSGPACK_API_VERSION_NAMESPACE(v1) {
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
struct object::implicit_type {
|
|
||||||
implicit_type(object const& o) : obj(o) { }
|
|
||||||
~implicit_type() { }
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
operator T() { return obj.as<T>(); }
|
|
||||||
|
|
||||||
private:
|
|
||||||
msgpack::object const& obj;
|
|
||||||
};
|
|
||||||
|
|
||||||
namespace detail {
|
|
||||||
template <typename Stream, typename T>
|
|
||||||
struct packer_serializer {
|
|
||||||
static msgpack::packer<Stream>& pack(msgpack::packer<Stream>& o, const T& v) {
|
|
||||||
v.msgpack_pack(o);
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
} // namespace detail
|
|
||||||
|
|
||||||
// Adaptor functors' member functions definitions.
|
|
||||||
template <typename T>
|
|
||||||
inline
|
|
||||||
msgpack::object const&
|
|
||||||
msgpack::adaptor::convert<T>::operator()(msgpack::object const& o, T& v) const {
|
|
||||||
v.msgpack_unpack(o.convert());
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
template <typename Stream>
|
|
||||||
inline
|
|
||||||
msgpack::packer<Stream>&
|
|
||||||
msgpack::adaptor::pack<T>::operator()(msgpack::packer<Stream>& o, T const& v) const {
|
|
||||||
return detail::packer_serializer<Stream, T>::pack(o, v);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
inline
|
|
||||||
void
|
|
||||||
msgpack::adaptor::object_with_zone<T>::operator()(msgpack::object::with_zone& o, T const& v) const {
|
|
||||||
v.msgpack_object(static_cast<msgpack::object*>(&o), o.zone);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Adaptor functor specialization to object
|
|
||||||
namespace adaptor {
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct convert<msgpack::object> {
|
|
||||||
msgpack::object const& operator()(msgpack::object const& o, msgpack::object& v) const {
|
|
||||||
v = o;
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct pack<msgpack::object> {
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, msgpack::object const& v) const {
|
|
||||||
switch(v.type) {
|
|
||||||
case msgpack::type::NIL:
|
|
||||||
o.pack_nil();
|
|
||||||
return o;
|
|
||||||
|
|
||||||
case msgpack::type::BOOLEAN:
|
|
||||||
if(v.via.boolean) {
|
|
||||||
o.pack_true();
|
|
||||||
} else {
|
|
||||||
o.pack_false();
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
|
|
||||||
case msgpack::type::POSITIVE_INTEGER:
|
|
||||||
o.pack_uint64(v.via.u64);
|
|
||||||
return o;
|
|
||||||
|
|
||||||
case msgpack::type::NEGATIVE_INTEGER:
|
|
||||||
o.pack_int64(v.via.i64);
|
|
||||||
return o;
|
|
||||||
|
|
||||||
case msgpack::type::FLOAT:
|
|
||||||
o.pack_double(v.via.f64);
|
|
||||||
return o;
|
|
||||||
|
|
||||||
case msgpack::type::STR:
|
|
||||||
o.pack_str(v.via.str.size);
|
|
||||||
o.pack_str_body(v.via.str.ptr, v.via.str.size);
|
|
||||||
return o;
|
|
||||||
|
|
||||||
case msgpack::type::BIN:
|
|
||||||
o.pack_bin(v.via.bin.size);
|
|
||||||
o.pack_bin_body(v.via.bin.ptr, v.via.bin.size);
|
|
||||||
return o;
|
|
||||||
|
|
||||||
case msgpack::type::EXT:
|
|
||||||
o.pack_ext(v.via.ext.size, v.via.ext.type());
|
|
||||||
o.pack_ext_body(v.via.ext.data(), v.via.ext.size);
|
|
||||||
return o;
|
|
||||||
|
|
||||||
case msgpack::type::ARRAY:
|
|
||||||
o.pack_array(v.via.array.size);
|
|
||||||
for(msgpack::object* p(v.via.array.ptr),
|
|
||||||
* const pend(v.via.array.ptr + v.via.array.size);
|
|
||||||
p < pend; ++p) {
|
|
||||||
msgpack::operator<<(o, *p);
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
|
|
||||||
case msgpack::type::MAP:
|
|
||||||
o.pack_map(v.via.map.size);
|
|
||||||
for(msgpack::object_kv* p(v.via.map.ptr),
|
|
||||||
* const pend(v.via.map.ptr + v.via.map.size);
|
|
||||||
p < pend; ++p) {
|
|
||||||
msgpack::operator<<(o, p->key);
|
|
||||||
msgpack::operator<<(o, p->val);
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
|
|
||||||
default:
|
|
||||||
throw msgpack::type_error();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object_with_zone<msgpack::object> {
|
|
||||||
void operator()(msgpack::object::with_zone& o, msgpack::object const& v) const {
|
|
||||||
o.type = v.type;
|
|
||||||
|
|
||||||
switch(v.type) {
|
|
||||||
case msgpack::type::NIL:
|
|
||||||
case msgpack::type::BOOLEAN:
|
|
||||||
case msgpack::type::POSITIVE_INTEGER:
|
|
||||||
case msgpack::type::NEGATIVE_INTEGER:
|
|
||||||
case msgpack::type::FLOAT:
|
|
||||||
std::memcpy(&o.via, &v.via, sizeof(v.via));
|
|
||||||
return;
|
|
||||||
|
|
||||||
case msgpack::type::STR: {
|
|
||||||
char* ptr = static_cast<char*>(o.zone.allocate_align(v.via.str.size));
|
|
||||||
o.via.str.ptr = ptr;
|
|
||||||
o.via.str.size = v.via.str.size;
|
|
||||||
std::memcpy(ptr, v.via.str.ptr, v.via.str.size);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
case msgpack::type::BIN: {
|
|
||||||
char* ptr = static_cast<char*>(o.zone.allocate_align(v.via.bin.size));
|
|
||||||
o.via.bin.ptr = ptr;
|
|
||||||
o.via.bin.size = v.via.bin.size;
|
|
||||||
std::memcpy(ptr, v.via.bin.ptr, v.via.bin.size);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
case msgpack::type::EXT: {
|
|
||||||
char* ptr = static_cast<char*>(o.zone.allocate_align(v.via.ext.size + 1));
|
|
||||||
o.via.ext.ptr = ptr;
|
|
||||||
o.via.ext.size = v.via.ext.size;
|
|
||||||
std::memcpy(ptr, v.via.ext.ptr, v.via.ext.size + 1);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
case msgpack::type::ARRAY:
|
|
||||||
o.via.array.ptr = static_cast<msgpack::object*>(o.zone.allocate_align(sizeof(msgpack::object) * v.via.array.size));
|
|
||||||
o.via.array.size = v.via.array.size;
|
|
||||||
for (msgpack::object
|
|
||||||
* po(o.via.array.ptr),
|
|
||||||
* pv(v.via.array.ptr),
|
|
||||||
* const pvend(v.via.array.ptr + v.via.array.size);
|
|
||||||
pv < pvend;
|
|
||||||
++po, ++pv) {
|
|
||||||
new (po) msgpack::object(*pv, o.zone);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
|
|
||||||
case msgpack::type::MAP:
|
|
||||||
o.via.map.ptr = (msgpack::object_kv*)o.zone.allocate_align(sizeof(msgpack::object_kv) * v.via.map.size);
|
|
||||||
o.via.map.size = v.via.map.size;
|
|
||||||
for(msgpack::object_kv
|
|
||||||
* po(o.via.map.ptr),
|
|
||||||
* pv(v.via.map.ptr),
|
|
||||||
* const pvend(v.via.map.ptr + v.via.map.size);
|
|
||||||
pv < pvend;
|
|
||||||
++po, ++pv) {
|
|
||||||
msgpack::object_kv* kv = new (po) msgpack::object_kv;
|
|
||||||
new (&kv->key) msgpack::object(pv->key, o.zone);
|
|
||||||
new (&kv->val) msgpack::object(pv->val, o.zone);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
|
|
||||||
default:
|
|
||||||
throw msgpack::type_error();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Adaptor functor specialization to object::with_zone
|
|
||||||
|
|
||||||
template <>
|
|
||||||
struct object_with_zone<msgpack::object::with_zone> {
|
|
||||||
void operator()(
|
|
||||||
msgpack::object::with_zone& o,
|
|
||||||
msgpack::object::with_zone const& v) const {
|
|
||||||
o << static_cast<msgpack::object const&>(v);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
} // namespace adaptor
|
|
||||||
|
|
||||||
|
|
||||||
// obsolete
|
|
||||||
template <typename Type>
|
|
||||||
class define : public Type {
|
|
||||||
public:
|
|
||||||
typedef Type msgpack_type;
|
|
||||||
typedef define<Type> define_type;
|
|
||||||
|
|
||||||
define() {}
|
|
||||||
define(const msgpack_type& v) : msgpack_type(v) {}
|
|
||||||
|
|
||||||
template <typename Packer>
|
|
||||||
void msgpack_pack(Packer& o) const
|
|
||||||
{
|
|
||||||
msgpack::operator<<(o, static_cast<const msgpack_type&>(*this));
|
|
||||||
}
|
|
||||||
|
|
||||||
void msgpack_unpack(object const& o)
|
|
||||||
{
|
|
||||||
msgpack::operator>>(o, static_cast<msgpack_type&>(*this));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// deconvert operator
|
|
||||||
|
|
||||||
template <typename Stream>
|
|
||||||
template <typename T>
|
|
||||||
inline msgpack::packer<Stream>& packer<Stream>::pack(const T& v)
|
|
||||||
{
|
|
||||||
msgpack::operator<<(*this, v);
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool operator==(const msgpack::object& x, const msgpack::object& y)
|
|
||||||
{
|
|
||||||
if(x.type != y.type) { return false; }
|
|
||||||
|
|
||||||
switch(x.type) {
|
|
||||||
case msgpack::type::NIL:
|
|
||||||
return true;
|
|
||||||
|
|
||||||
case msgpack::type::BOOLEAN:
|
|
||||||
return x.via.boolean == y.via.boolean;
|
|
||||||
|
|
||||||
case msgpack::type::POSITIVE_INTEGER:
|
|
||||||
return x.via.u64 == y.via.u64;
|
|
||||||
|
|
||||||
case msgpack::type::NEGATIVE_INTEGER:
|
|
||||||
return x.via.i64 == y.via.i64;
|
|
||||||
|
|
||||||
case msgpack::type::FLOAT:
|
|
||||||
return x.via.f64 == y.via.f64;
|
|
||||||
|
|
||||||
case msgpack::type::STR:
|
|
||||||
return x.via.str.size == y.via.str.size &&
|
|
||||||
std::memcmp(x.via.str.ptr, y.via.str.ptr, x.via.str.size) == 0;
|
|
||||||
|
|
||||||
case msgpack::type::BIN:
|
|
||||||
return x.via.bin.size == y.via.bin.size &&
|
|
||||||
std::memcmp(x.via.bin.ptr, y.via.bin.ptr, x.via.bin.size) == 0;
|
|
||||||
|
|
||||||
case msgpack::type::EXT:
|
|
||||||
return x.via.ext.size == y.via.ext.size &&
|
|
||||||
std::memcmp(x.via.ext.ptr, y.via.ext.ptr, x.via.ext.size) == 0;
|
|
||||||
|
|
||||||
case msgpack::type::ARRAY:
|
|
||||||
if(x.via.array.size != y.via.array.size) {
|
|
||||||
return false;
|
|
||||||
} else if(x.via.array.size == 0) {
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
msgpack::object* px = x.via.array.ptr;
|
|
||||||
msgpack::object* const pxend = x.via.array.ptr + x.via.array.size;
|
|
||||||
msgpack::object* py = y.via.array.ptr;
|
|
||||||
do {
|
|
||||||
if(!(*px == *py)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
++px;
|
|
||||||
++py;
|
|
||||||
} while(px < pxend);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
case msgpack::type::MAP:
|
|
||||||
if(x.via.map.size != y.via.map.size) {
|
|
||||||
return false;
|
|
||||||
} else if(x.via.map.size == 0) {
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
msgpack::object_kv* px = x.via.map.ptr;
|
|
||||||
msgpack::object_kv* const pxend = x.via.map.ptr + x.via.map.size;
|
|
||||||
msgpack::object_kv* py = y.via.map.ptr;
|
|
||||||
do {
|
|
||||||
if(!(px->key == py->key) || !(px->val == py->val)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
++px;
|
|
||||||
++py;
|
|
||||||
} while(px < pxend);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
inline bool operator==(const msgpack::object& x, const T& y)
|
|
||||||
try {
|
|
||||||
return x == msgpack::object(y);
|
|
||||||
} catch (msgpack::type_error&) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline bool operator!=(const msgpack::object& x, const msgpack::object& y)
|
|
||||||
{ return !(x == y); }
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
inline bool operator==(const T& y, const msgpack::object x)
|
|
||||||
{ return x == y; }
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
inline bool operator!=(const msgpack::object& x, const T& y)
|
|
||||||
{ return !(x == y); }
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
inline bool operator!=(const T& y, const msgpack::object& x)
|
|
||||||
{ return x != y; }
|
|
||||||
|
|
||||||
|
|
||||||
inline msgpack::object::implicit_type object::convert() const
|
|
||||||
{
|
|
||||||
return msgpack::object::implicit_type(*this);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
inline void object::convert(T& v) const
|
|
||||||
{
|
|
||||||
msgpack::operator>>(*this, v);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
inline void object::convert(T* v) const
|
|
||||||
{
|
|
||||||
convert(*v);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
inline T object::as() const
|
|
||||||
{
|
|
||||||
T v;
|
|
||||||
convert(v);
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline object::object()
|
|
||||||
{
|
|
||||||
type = msgpack::type::NIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
inline object::object(const T& v)
|
|
||||||
{
|
|
||||||
msgpack::operator<<(*this, v);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
inline object& object::operator=(const T& v)
|
|
||||||
{
|
|
||||||
*this = object(v);
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
object::object(const T& v, msgpack::zone& z)
|
|
||||||
{
|
|
||||||
with_zone oz(z);
|
|
||||||
msgpack::operator<<(oz, v);
|
|
||||||
type = oz.type;
|
|
||||||
via = oz.via;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
object::object(const T& v, msgpack::zone* z)
|
|
||||||
{
|
|
||||||
with_zone oz(*z);
|
|
||||||
msgpack::operator<<(oz, v);
|
|
||||||
type = oz.type;
|
|
||||||
via = oz.via;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline object::object(const msgpack_object& o)
|
|
||||||
{
|
|
||||||
// FIXME beter way?
|
|
||||||
std::memcpy(this, &o, sizeof(o));
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void operator<< (msgpack::object& o, const msgpack_object& v)
|
|
||||||
{
|
|
||||||
// FIXME beter way?
|
|
||||||
std::memcpy(&o, &v, sizeof(v));
|
|
||||||
}
|
|
||||||
|
|
||||||
inline object::operator msgpack_object() const
|
|
||||||
{
|
|
||||||
// FIXME beter way?
|
|
||||||
msgpack_object obj;
|
|
||||||
std::memcpy(&obj, this, sizeof(obj));
|
|
||||||
return obj;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// obsolete
|
|
||||||
template <typename T>
|
|
||||||
inline void convert(T& v, msgpack::object const& o)
|
|
||||||
{
|
|
||||||
o.convert(v);
|
|
||||||
}
|
|
||||||
|
|
||||||
// obsolete
|
|
||||||
template <typename Stream, typename T>
|
|
||||||
inline void pack(msgpack::packer<Stream>& o, const T& v)
|
|
||||||
{
|
|
||||||
o.pack(v);
|
|
||||||
}
|
|
||||||
|
|
||||||
// obsolete
|
|
||||||
template <typename Stream, typename T>
|
|
||||||
inline void pack_copy(msgpack::packer<Stream>& o, T v)
|
|
||||||
{
|
|
||||||
pack(o, v);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template <typename Stream>
|
|
||||||
inline msgpack::packer<Stream>& operator<< (msgpack::packer<Stream>& o, const msgpack::object& v)
|
|
||||||
{
|
|
||||||
switch(v.type) {
|
|
||||||
case msgpack::type::NIL:
|
|
||||||
o.pack_nil();
|
|
||||||
return o;
|
|
||||||
|
|
||||||
case msgpack::type::BOOLEAN:
|
|
||||||
if(v.via.boolean) {
|
|
||||||
o.pack_true();
|
|
||||||
} else {
|
|
||||||
o.pack_false();
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
|
|
||||||
case msgpack::type::POSITIVE_INTEGER:
|
|
||||||
o.pack_uint64(v.via.u64);
|
|
||||||
return o;
|
|
||||||
|
|
||||||
case msgpack::type::NEGATIVE_INTEGER:
|
|
||||||
o.pack_int64(v.via.i64);
|
|
||||||
return o;
|
|
||||||
|
|
||||||
case msgpack::type::FLOAT:
|
|
||||||
o.pack_double(v.via.f64);
|
|
||||||
return o;
|
|
||||||
|
|
||||||
case msgpack::type::STR:
|
|
||||||
o.pack_str(v.via.str.size);
|
|
||||||
o.pack_str_body(v.via.str.ptr, v.via.str.size);
|
|
||||||
return o;
|
|
||||||
|
|
||||||
case msgpack::type::BIN:
|
|
||||||
o.pack_bin(v.via.bin.size);
|
|
||||||
o.pack_bin_body(v.via.bin.ptr, v.via.bin.size);
|
|
||||||
return o;
|
|
||||||
|
|
||||||
case msgpack::type::EXT:
|
|
||||||
o.pack_ext(v.via.ext.size, v.via.ext.type());
|
|
||||||
o.pack_ext_body(v.via.ext.data(), v.via.ext.size);
|
|
||||||
return o;
|
|
||||||
|
|
||||||
case msgpack::type::ARRAY:
|
|
||||||
o.pack_array(v.via.array.size);
|
|
||||||
for(msgpack::object* p(v.via.array.ptr),
|
|
||||||
* const pend(v.via.array.ptr + v.via.array.size);
|
|
||||||
p < pend; ++p) {
|
|
||||||
msgpack::operator<<(o, *p);
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
|
|
||||||
case msgpack::type::MAP:
|
|
||||||
o.pack_map(v.via.map.size);
|
|
||||||
for(msgpack::object_kv* p(v.via.map.ptr),
|
|
||||||
* const pend(v.via.map.ptr + v.via.map.size);
|
|
||||||
p < pend; ++p) {
|
|
||||||
msgpack::operator<<(o, p->key);
|
|
||||||
msgpack::operator<<(o, p->val);
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
|
|
||||||
default:
|
|
||||||
throw msgpack::type_error();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename Stream>
|
|
||||||
msgpack::packer<Stream>& operator<< (msgpack::packer<Stream>& o, const msgpack::object::with_zone& v)
|
|
||||||
{
|
|
||||||
return o << static_cast<msgpack::object>(v);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline std::ostream& operator<< (std::ostream& s, const msgpack::object& o)
|
|
||||||
{
|
|
||||||
switch(o.type) {
|
|
||||||
case msgpack::type::NIL:
|
|
||||||
s << "nil";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case msgpack::type::BOOLEAN:
|
|
||||||
s << (o.via.boolean ? "true" : "false");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case msgpack::type::POSITIVE_INTEGER:
|
|
||||||
s << o.via.u64;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case msgpack::type::NEGATIVE_INTEGER:
|
|
||||||
s << o.via.i64;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case msgpack::type::FLOAT:
|
|
||||||
s << o.via.f64;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case msgpack::type::STR:
|
|
||||||
(s << '"').write(o.via.str.ptr, o.via.str.size) << '"';
|
|
||||||
break;
|
|
||||||
|
|
||||||
case msgpack::type::BIN:
|
|
||||||
(s << '"').write(o.via.bin.ptr, o.via.bin.size) << '"';
|
|
||||||
break;
|
|
||||||
|
|
||||||
case msgpack::type::EXT:
|
|
||||||
s << "EXT";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case msgpack::type::ARRAY:
|
|
||||||
s << "[";
|
|
||||||
if(o.via.array.size != 0) {
|
|
||||||
msgpack::object* p(o.via.array.ptr);
|
|
||||||
s << *p;
|
|
||||||
++p;
|
|
||||||
for(msgpack::object* const pend(o.via.array.ptr + o.via.array.size);
|
|
||||||
p < pend; ++p) {
|
|
||||||
s << ", " << *p;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
s << "]";
|
|
||||||
break;
|
|
||||||
|
|
||||||
case msgpack::type::MAP:
|
|
||||||
s << "{";
|
|
||||||
if(o.via.map.size != 0) {
|
|
||||||
msgpack::object_kv* p(o.via.map.ptr);
|
|
||||||
s << p->key << "=>" << p->val;
|
|
||||||
++p;
|
|
||||||
for(msgpack::object_kv* const pend(o.via.map.ptr + o.via.map.size);
|
|
||||||
p < pend; ++p) {
|
|
||||||
s << ", " << p->key << "=>" << p->val;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
s << "}";
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
// FIXME
|
|
||||||
s << "#<UNKNOWN " << static_cast<uint16_t>(o.type) << ">";
|
|
||||||
}
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
} // MSGPACK_API_VERSION_NAMESPACE(v1)
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
#include "msgpack/type.hpp"
|
|
||||||
|
|
||||||
#endif /* msgpack/object.hpp */
|
|
||||||
@@ -1,161 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ static resolution routine
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2014 FURUHASHI Sadayuki and KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifndef MSGPACK_OBJECT_FWD_HPP
|
|
||||||
#define MSGPACK_OBJECT_FWD_HPP
|
|
||||||
|
|
||||||
#include "msgpack/versioning.hpp"
|
|
||||||
#include "msgpack/zone.hpp"
|
|
||||||
#include "msgpack/object.h"
|
|
||||||
|
|
||||||
#include <typeinfo>
|
|
||||||
|
|
||||||
namespace msgpack {
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
MSGPACK_API_VERSION_NAMESPACE(v1) {
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
|
|
||||||
namespace type {
|
|
||||||
enum object_type {
|
|
||||||
NIL = MSGPACK_OBJECT_NIL,
|
|
||||||
BOOLEAN = MSGPACK_OBJECT_BOOLEAN,
|
|
||||||
POSITIVE_INTEGER = MSGPACK_OBJECT_POSITIVE_INTEGER,
|
|
||||||
NEGATIVE_INTEGER = MSGPACK_OBJECT_NEGATIVE_INTEGER,
|
|
||||||
FLOAT = MSGPACK_OBJECT_FLOAT,
|
|
||||||
#if defined(MSGPACK_USE_LEGACY_NAME_AS_FLOAT)
|
|
||||||
DOUBLE = MSGPACK_OBJECT_DOUBLE, // obsolete
|
|
||||||
#endif // MSGPACK_USE_LEGACY_NAME_AS_FLOAT
|
|
||||||
STR = MSGPACK_OBJECT_STR,
|
|
||||||
BIN = MSGPACK_OBJECT_BIN,
|
|
||||||
ARRAY = MSGPACK_OBJECT_ARRAY,
|
|
||||||
MAP = MSGPACK_OBJECT_MAP,
|
|
||||||
EXT = MSGPACK_OBJECT_EXT
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
struct object;
|
|
||||||
struct object_kv;
|
|
||||||
|
|
||||||
struct object_array {
|
|
||||||
uint32_t size;
|
|
||||||
msgpack::object* ptr;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct object_map {
|
|
||||||
uint32_t size;
|
|
||||||
msgpack::object_kv* ptr;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct object_str {
|
|
||||||
uint32_t size;
|
|
||||||
const char* ptr;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct object_bin {
|
|
||||||
uint32_t size;
|
|
||||||
const char* ptr;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct object_ext {
|
|
||||||
int8_t type() const { return ptr[0]; }
|
|
||||||
const char* data() const { return &ptr[1]; }
|
|
||||||
uint32_t size;
|
|
||||||
const char* ptr;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct object {
|
|
||||||
union union_type {
|
|
||||||
bool boolean;
|
|
||||||
uint64_t u64;
|
|
||||||
int64_t i64;
|
|
||||||
#if defined(MSGPACK_USE_LEGACY_NAME_AS_FLOAT)
|
|
||||||
double dec; // obsolete
|
|
||||||
#endif // MSGPACK_USE_LEGACY_NAME_AS_FLOAT
|
|
||||||
double f64;
|
|
||||||
msgpack::object_array array;
|
|
||||||
msgpack::object_map map;
|
|
||||||
msgpack::object_str str;
|
|
||||||
msgpack::object_bin bin;
|
|
||||||
msgpack::object_ext ext;
|
|
||||||
};
|
|
||||||
|
|
||||||
msgpack::type::object_type type;
|
|
||||||
union_type via;
|
|
||||||
|
|
||||||
bool is_nil() const { return type == msgpack::type::NIL; }
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
T as() const;
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
void convert(T& v) const;
|
|
||||||
template <typename T>
|
|
||||||
void convert(T* v) const;
|
|
||||||
|
|
||||||
object();
|
|
||||||
|
|
||||||
object(const msgpack_object& o);
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
explicit object(const T& v);
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
object(const T& v, msgpack::zone& z);
|
|
||||||
|
|
||||||
// obsolete
|
|
||||||
template <typename T>
|
|
||||||
object(const T& v, msgpack::zone* z);
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
object& operator=(const T& v);
|
|
||||||
|
|
||||||
operator msgpack_object() const;
|
|
||||||
|
|
||||||
struct with_zone;
|
|
||||||
|
|
||||||
private:
|
|
||||||
struct implicit_type;
|
|
||||||
|
|
||||||
public:
|
|
||||||
implicit_type convert() const;
|
|
||||||
};
|
|
||||||
|
|
||||||
class type_error : public std::bad_cast { };
|
|
||||||
|
|
||||||
struct object_kv {
|
|
||||||
msgpack::object key;
|
|
||||||
msgpack::object val;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct object::with_zone : object {
|
|
||||||
with_zone(msgpack::zone& zone) : zone(zone) { }
|
|
||||||
msgpack::zone& zone;
|
|
||||||
private:
|
|
||||||
with_zone();
|
|
||||||
};
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
} // MSGPACK_API_VERSION_NAMESPACE(v1)
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
#endif // MSGPACK_OBJECT_FWD_HPP
|
|
||||||
@@ -1,153 +0,0 @@
|
|||||||
/*
|
|
||||||
* MessagePack for C packing routine
|
|
||||||
*
|
|
||||||
* Copyright (C) 2008-2009 FURUHASHI Sadayuki
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
#ifndef MSGPACK_PACK_H
|
|
||||||
#define MSGPACK_PACK_H
|
|
||||||
|
|
||||||
#include "pack_define.h"
|
|
||||||
#include "object.h"
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup msgpack_buffer Buffers
|
|
||||||
* @ingroup msgpack
|
|
||||||
* @{
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup msgpack_pack Serializer
|
|
||||||
* @ingroup msgpack
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef int (*msgpack_packer_write)(void* data, const char* buf, size_t len);
|
|
||||||
|
|
||||||
typedef struct msgpack_packer {
|
|
||||||
void* data;
|
|
||||||
msgpack_packer_write callback;
|
|
||||||
} msgpack_packer;
|
|
||||||
|
|
||||||
static void msgpack_packer_init(msgpack_packer* pk, void* data, msgpack_packer_write callback);
|
|
||||||
|
|
||||||
static msgpack_packer* msgpack_packer_new(void* data, msgpack_packer_write callback);
|
|
||||||
static void msgpack_packer_free(msgpack_packer* pk);
|
|
||||||
|
|
||||||
static int msgpack_pack_char(msgpack_packer* pk, char d);
|
|
||||||
|
|
||||||
static int msgpack_pack_signed_char(msgpack_packer* pk, signed char d);
|
|
||||||
static int msgpack_pack_short(msgpack_packer* pk, short d);
|
|
||||||
static int msgpack_pack_int(msgpack_packer* pk, int d);
|
|
||||||
static int msgpack_pack_long(msgpack_packer* pk, long d);
|
|
||||||
static int msgpack_pack_long_long(msgpack_packer* pk, long long d);
|
|
||||||
static int msgpack_pack_unsigned_char(msgpack_packer* pk, unsigned char d);
|
|
||||||
static int msgpack_pack_unsigned_short(msgpack_packer* pk, unsigned short d);
|
|
||||||
static int msgpack_pack_unsigned_int(msgpack_packer* pk, unsigned int d);
|
|
||||||
static int msgpack_pack_unsigned_long(msgpack_packer* pk, unsigned long d);
|
|
||||||
static int msgpack_pack_unsigned_long_long(msgpack_packer* pk, unsigned long long d);
|
|
||||||
|
|
||||||
static int msgpack_pack_uint8(msgpack_packer* pk, uint8_t d);
|
|
||||||
static int msgpack_pack_uint16(msgpack_packer* pk, uint16_t d);
|
|
||||||
static int msgpack_pack_uint32(msgpack_packer* pk, uint32_t d);
|
|
||||||
static int msgpack_pack_uint64(msgpack_packer* pk, uint64_t d);
|
|
||||||
static int msgpack_pack_int8(msgpack_packer* pk, int8_t d);
|
|
||||||
static int msgpack_pack_int16(msgpack_packer* pk, int16_t d);
|
|
||||||
static int msgpack_pack_int32(msgpack_packer* pk, int32_t d);
|
|
||||||
static int msgpack_pack_int64(msgpack_packer* pk, int64_t d);
|
|
||||||
|
|
||||||
static int msgpack_pack_fix_uint8(msgpack_packer* pk, uint8_t d);
|
|
||||||
static int msgpack_pack_fix_uint16(msgpack_packer* pk, uint16_t d);
|
|
||||||
static int msgpack_pack_fix_uint32(msgpack_packer* pk, uint32_t d);
|
|
||||||
static int msgpack_pack_fix_uint64(msgpack_packer* pk, uint64_t d);
|
|
||||||
static int msgpack_pack_fix_int8(msgpack_packer* pk, int8_t d);
|
|
||||||
static int msgpack_pack_fix_int16(msgpack_packer* pk, int16_t d);
|
|
||||||
static int msgpack_pack_fix_int32(msgpack_packer* pk, int32_t d);
|
|
||||||
static int msgpack_pack_fix_int64(msgpack_packer* pk, int64_t d);
|
|
||||||
|
|
||||||
static int msgpack_pack_float(msgpack_packer* pk, float d);
|
|
||||||
static int msgpack_pack_double(msgpack_packer* pk, double d);
|
|
||||||
|
|
||||||
static int msgpack_pack_nil(msgpack_packer* pk);
|
|
||||||
static int msgpack_pack_true(msgpack_packer* pk);
|
|
||||||
static int msgpack_pack_false(msgpack_packer* pk);
|
|
||||||
|
|
||||||
static int msgpack_pack_array(msgpack_packer* pk, size_t n);
|
|
||||||
|
|
||||||
static int msgpack_pack_map(msgpack_packer* pk, size_t n);
|
|
||||||
|
|
||||||
static int msgpack_pack_str(msgpack_packer* pk, size_t l);
|
|
||||||
static int msgpack_pack_str_body(msgpack_packer* pk, const void* b, size_t l);
|
|
||||||
|
|
||||||
static int msgpack_pack_bin(msgpack_packer* pk, size_t l);
|
|
||||||
static int msgpack_pack_bin_body(msgpack_packer* pk, const void* b, size_t l);
|
|
||||||
|
|
||||||
static int msgpack_pack_ext(msgpack_packer* pk, size_t l, int8_t type);
|
|
||||||
static int msgpack_pack_ext_body(msgpack_packer* pk, const void* b, size_t l);
|
|
||||||
|
|
||||||
int msgpack_pack_object(msgpack_packer* pk, msgpack_object d);
|
|
||||||
|
|
||||||
|
|
||||||
/** @} */
|
|
||||||
|
|
||||||
|
|
||||||
#define msgpack_pack_inline_func(name) \
|
|
||||||
inline int msgpack_pack ## name
|
|
||||||
|
|
||||||
#define msgpack_pack_inline_func_cint(name) \
|
|
||||||
inline int msgpack_pack ## name
|
|
||||||
|
|
||||||
#define msgpack_pack_inline_func_fixint(name) \
|
|
||||||
inline int msgpack_pack_fix ## name
|
|
||||||
|
|
||||||
#define msgpack_pack_user msgpack_packer*
|
|
||||||
|
|
||||||
#define msgpack_pack_append_buffer(user, buf, len) \
|
|
||||||
return (*(user)->callback)((user)->data, (const char*)buf, len)
|
|
||||||
|
|
||||||
#include "pack_template.h"
|
|
||||||
|
|
||||||
inline void msgpack_packer_init(msgpack_packer* pk, void* data, msgpack_packer_write callback)
|
|
||||||
{
|
|
||||||
pk->data = data;
|
|
||||||
pk->callback = callback;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline msgpack_packer* msgpack_packer_new(void* data, msgpack_packer_write callback)
|
|
||||||
{
|
|
||||||
msgpack_packer* pk = (msgpack_packer*)calloc(1, sizeof(msgpack_packer));
|
|
||||||
if(!pk) { return NULL; }
|
|
||||||
msgpack_packer_init(pk, data, callback);
|
|
||||||
return pk;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void msgpack_packer_free(msgpack_packer* pk)
|
|
||||||
{
|
|
||||||
free(pk);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* msgpack/pack.h */
|
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,26 +0,0 @@
|
|||||||
/*
|
|
||||||
* MessagePack unpacking routine template
|
|
||||||
*
|
|
||||||
* Copyright (C) 2008-2010 FURUHASHI Sadayuki
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
#ifndef MSGPACK_PACK_DEFINE_H
|
|
||||||
#define MSGPACK_PACK_DEFINE_H
|
|
||||||
|
|
||||||
#include "msgpack/sysdep.h"
|
|
||||||
#include <limits.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#endif /* msgpack/pack_define.h */
|
|
||||||
|
|
||||||
@@ -1,889 +0,0 @@
|
|||||||
/*
|
|
||||||
* MessagePack packing routine template
|
|
||||||
*
|
|
||||||
* Copyright (C) 2008-2010 FURUHASHI Sadayuki
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if defined(__LITTLE_ENDIAN__)
|
|
||||||
#define TAKE8_8(d) ((uint8_t*)&d)[0]
|
|
||||||
#define TAKE8_16(d) ((uint8_t*)&d)[0]
|
|
||||||
#define TAKE8_32(d) ((uint8_t*)&d)[0]
|
|
||||||
#define TAKE8_64(d) ((uint8_t*)&d)[0]
|
|
||||||
#elif defined(__BIG_ENDIAN__)
|
|
||||||
#define TAKE8_8(d) ((uint8_t*)&d)[0]
|
|
||||||
#define TAKE8_16(d) ((uint8_t*)&d)[1]
|
|
||||||
#define TAKE8_32(d) ((uint8_t*)&d)[3]
|
|
||||||
#define TAKE8_64(d) ((uint8_t*)&d)[7]
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef msgpack_pack_inline_func
|
|
||||||
#error msgpack_pack_inline_func template is not defined
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef msgpack_pack_user
|
|
||||||
#error msgpack_pack_user type is not defined
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef msgpack_pack_append_buffer
|
|
||||||
#error msgpack_pack_append_buffer callback is not defined
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Integer
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define msgpack_pack_real_uint8(x, d) \
|
|
||||||
do { \
|
|
||||||
if(d < (1<<7)) { \
|
|
||||||
/* fixnum */ \
|
|
||||||
msgpack_pack_append_buffer(x, &TAKE8_8(d), 1); \
|
|
||||||
} else { \
|
|
||||||
/* unsigned 8 */ \
|
|
||||||
unsigned char buf[2] = {0xcc, TAKE8_8(d)}; \
|
|
||||||
msgpack_pack_append_buffer(x, buf, 2); \
|
|
||||||
} \
|
|
||||||
} while(0)
|
|
||||||
|
|
||||||
#define msgpack_pack_real_uint16(x, d) \
|
|
||||||
do { \
|
|
||||||
if(d < (1<<7)) { \
|
|
||||||
/* fixnum */ \
|
|
||||||
msgpack_pack_append_buffer(x, &TAKE8_16(d), 1); \
|
|
||||||
} else if(d < (1<<8)) { \
|
|
||||||
/* unsigned 8 */ \
|
|
||||||
unsigned char buf[2] = {0xcc, TAKE8_16(d)}; \
|
|
||||||
msgpack_pack_append_buffer(x, buf, 2); \
|
|
||||||
} else { \
|
|
||||||
/* unsigned 16 */ \
|
|
||||||
unsigned char buf[3]; \
|
|
||||||
buf[0] = 0xcd; _msgpack_store16(&buf[1], (uint16_t)d); \
|
|
||||||
msgpack_pack_append_buffer(x, buf, 3); \
|
|
||||||
} \
|
|
||||||
} while(0)
|
|
||||||
|
|
||||||
#define msgpack_pack_real_uint32(x, d) \
|
|
||||||
do { \
|
|
||||||
if(d < (1<<8)) { \
|
|
||||||
if(d < (1<<7)) { \
|
|
||||||
/* fixnum */ \
|
|
||||||
msgpack_pack_append_buffer(x, &TAKE8_32(d), 1); \
|
|
||||||
} else { \
|
|
||||||
/* unsigned 8 */ \
|
|
||||||
unsigned char buf[2] = {0xcc, TAKE8_32(d)}; \
|
|
||||||
msgpack_pack_append_buffer(x, buf, 2); \
|
|
||||||
} \
|
|
||||||
} else { \
|
|
||||||
if(d < (1<<16)) { \
|
|
||||||
/* unsigned 16 */ \
|
|
||||||
unsigned char buf[3]; \
|
|
||||||
buf[0] = 0xcd; _msgpack_store16(&buf[1], (uint16_t)d); \
|
|
||||||
msgpack_pack_append_buffer(x, buf, 3); \
|
|
||||||
} else { \
|
|
||||||
/* unsigned 32 */ \
|
|
||||||
unsigned char buf[5]; \
|
|
||||||
buf[0] = 0xce; _msgpack_store32(&buf[1], (uint32_t)d); \
|
|
||||||
msgpack_pack_append_buffer(x, buf, 5); \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
} while(0)
|
|
||||||
|
|
||||||
#define msgpack_pack_real_uint64(x, d) \
|
|
||||||
do { \
|
|
||||||
if(d < (1ULL<<8)) { \
|
|
||||||
if(d < (1ULL<<7)) { \
|
|
||||||
/* fixnum */ \
|
|
||||||
msgpack_pack_append_buffer(x, &TAKE8_64(d), 1); \
|
|
||||||
} else { \
|
|
||||||
/* unsigned 8 */ \
|
|
||||||
unsigned char buf[2] = {0xcc, TAKE8_64(d)}; \
|
|
||||||
msgpack_pack_append_buffer(x, buf, 2); \
|
|
||||||
} \
|
|
||||||
} else { \
|
|
||||||
if(d < (1ULL<<16)) { \
|
|
||||||
/* unsigned 16 */ \
|
|
||||||
unsigned char buf[3]; \
|
|
||||||
buf[0] = 0xcd; _msgpack_store16(&buf[1], (uint16_t)d); \
|
|
||||||
msgpack_pack_append_buffer(x, buf, 3); \
|
|
||||||
} else if(d < (1ULL<<32)) { \
|
|
||||||
/* unsigned 32 */ \
|
|
||||||
unsigned char buf[5]; \
|
|
||||||
buf[0] = 0xce; _msgpack_store32(&buf[1], (uint32_t)d); \
|
|
||||||
msgpack_pack_append_buffer(x, buf, 5); \
|
|
||||||
} else { \
|
|
||||||
/* unsigned 64 */ \
|
|
||||||
unsigned char buf[9]; \
|
|
||||||
buf[0] = 0xcf; _msgpack_store64(&buf[1], d); \
|
|
||||||
msgpack_pack_append_buffer(x, buf, 9); \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
} while(0)
|
|
||||||
|
|
||||||
#define msgpack_pack_real_int8(x, d) \
|
|
||||||
do { \
|
|
||||||
if(d < -(1<<5)) { \
|
|
||||||
/* signed 8 */ \
|
|
||||||
unsigned char buf[2] = {0xd0, TAKE8_8(d)}; \
|
|
||||||
msgpack_pack_append_buffer(x, buf, 2); \
|
|
||||||
} else { \
|
|
||||||
/* fixnum */ \
|
|
||||||
msgpack_pack_append_buffer(x, &TAKE8_8(d), 1); \
|
|
||||||
} \
|
|
||||||
} while(0)
|
|
||||||
|
|
||||||
#define msgpack_pack_real_int16(x, d) \
|
|
||||||
do { \
|
|
||||||
if(d < -(1<<5)) { \
|
|
||||||
if(d < -(1<<7)) { \
|
|
||||||
/* signed 16 */ \
|
|
||||||
unsigned char buf[3]; \
|
|
||||||
buf[0] = 0xd1; _msgpack_store16(&buf[1], (int16_t)d); \
|
|
||||||
msgpack_pack_append_buffer(x, buf, 3); \
|
|
||||||
} else { \
|
|
||||||
/* signed 8 */ \
|
|
||||||
unsigned char buf[2] = {0xd0, TAKE8_16(d)}; \
|
|
||||||
msgpack_pack_append_buffer(x, buf, 2); \
|
|
||||||
} \
|
|
||||||
} else if(d < (1<<7)) { \
|
|
||||||
/* fixnum */ \
|
|
||||||
msgpack_pack_append_buffer(x, &TAKE8_16(d), 1); \
|
|
||||||
} else { \
|
|
||||||
if(d < (1<<8)) { \
|
|
||||||
/* unsigned 8 */ \
|
|
||||||
unsigned char buf[2] = {0xcc, TAKE8_16(d)}; \
|
|
||||||
msgpack_pack_append_buffer(x, buf, 2); \
|
|
||||||
} else { \
|
|
||||||
/* unsigned 16 */ \
|
|
||||||
unsigned char buf[3]; \
|
|
||||||
buf[0] = 0xcd; _msgpack_store16(&buf[1], (uint16_t)d); \
|
|
||||||
msgpack_pack_append_buffer(x, buf, 3); \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
} while(0)
|
|
||||||
|
|
||||||
#define msgpack_pack_real_int32(x, d) \
|
|
||||||
do { \
|
|
||||||
if(d < -(1<<5)) { \
|
|
||||||
if(d < -(1<<15)) { \
|
|
||||||
/* signed 32 */ \
|
|
||||||
unsigned char buf[5]; \
|
|
||||||
buf[0] = 0xd2; _msgpack_store32(&buf[1], (int32_t)d); \
|
|
||||||
msgpack_pack_append_buffer(x, buf, 5); \
|
|
||||||
} else if(d < -(1<<7)) { \
|
|
||||||
/* signed 16 */ \
|
|
||||||
unsigned char buf[3]; \
|
|
||||||
buf[0] = 0xd1; _msgpack_store16(&buf[1], (int16_t)d); \
|
|
||||||
msgpack_pack_append_buffer(x, buf, 3); \
|
|
||||||
} else { \
|
|
||||||
/* signed 8 */ \
|
|
||||||
unsigned char buf[2] = {0xd0, TAKE8_32(d)}; \
|
|
||||||
msgpack_pack_append_buffer(x, buf, 2); \
|
|
||||||
} \
|
|
||||||
} else if(d < (1<<7)) { \
|
|
||||||
/* fixnum */ \
|
|
||||||
msgpack_pack_append_buffer(x, &TAKE8_32(d), 1); \
|
|
||||||
} else { \
|
|
||||||
if(d < (1<<8)) { \
|
|
||||||
/* unsigned 8 */ \
|
|
||||||
unsigned char buf[2] = {0xcc, TAKE8_32(d)}; \
|
|
||||||
msgpack_pack_append_buffer(x, buf, 2); \
|
|
||||||
} else if(d < (1<<16)) { \
|
|
||||||
/* unsigned 16 */ \
|
|
||||||
unsigned char buf[3]; \
|
|
||||||
buf[0] = 0xcd; _msgpack_store16(&buf[1], (uint16_t)d); \
|
|
||||||
msgpack_pack_append_buffer(x, buf, 3); \
|
|
||||||
} else { \
|
|
||||||
/* unsigned 32 */ \
|
|
||||||
unsigned char buf[5]; \
|
|
||||||
buf[0] = 0xce; _msgpack_store32(&buf[1], (uint32_t)d); \
|
|
||||||
msgpack_pack_append_buffer(x, buf, 5); \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
} while(0)
|
|
||||||
|
|
||||||
#define msgpack_pack_real_int64(x, d) \
|
|
||||||
do { \
|
|
||||||
if(d < -(1LL<<5)) { \
|
|
||||||
if(d < -(1LL<<15)) { \
|
|
||||||
if(d < -(1LL<<31)) { \
|
|
||||||
/* signed 64 */ \
|
|
||||||
unsigned char buf[9]; \
|
|
||||||
buf[0] = 0xd3; _msgpack_store64(&buf[1], d); \
|
|
||||||
msgpack_pack_append_buffer(x, buf, 9); \
|
|
||||||
} else { \
|
|
||||||
/* signed 32 */ \
|
|
||||||
unsigned char buf[5]; \
|
|
||||||
buf[0] = 0xd2; _msgpack_store32(&buf[1], (int32_t)d); \
|
|
||||||
msgpack_pack_append_buffer(x, buf, 5); \
|
|
||||||
} \
|
|
||||||
} else { \
|
|
||||||
if(d < -(1<<7)) { \
|
|
||||||
/* signed 16 */ \
|
|
||||||
unsigned char buf[3]; \
|
|
||||||
buf[0] = 0xd1; _msgpack_store16(&buf[1], (int16_t)d); \
|
|
||||||
msgpack_pack_append_buffer(x, buf, 3); \
|
|
||||||
} else { \
|
|
||||||
/* signed 8 */ \
|
|
||||||
unsigned char buf[2] = {0xd0, TAKE8_64(d)}; \
|
|
||||||
msgpack_pack_append_buffer(x, buf, 2); \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
} else if(d < (1<<7)) { \
|
|
||||||
/* fixnum */ \
|
|
||||||
msgpack_pack_append_buffer(x, &TAKE8_64(d), 1); \
|
|
||||||
} else { \
|
|
||||||
if(d < (1LL<<16)) { \
|
|
||||||
if(d < (1<<8)) { \
|
|
||||||
/* unsigned 8 */ \
|
|
||||||
unsigned char buf[2] = {0xcc, TAKE8_64(d)}; \
|
|
||||||
msgpack_pack_append_buffer(x, buf, 2); \
|
|
||||||
} else { \
|
|
||||||
/* unsigned 16 */ \
|
|
||||||
unsigned char buf[3]; \
|
|
||||||
buf[0] = 0xcd; _msgpack_store16(&buf[1], (uint16_t)d); \
|
|
||||||
msgpack_pack_append_buffer(x, buf, 3); \
|
|
||||||
} \
|
|
||||||
} else { \
|
|
||||||
if(d < (1LL<<32)) { \
|
|
||||||
/* unsigned 32 */ \
|
|
||||||
unsigned char buf[5]; \
|
|
||||||
buf[0] = 0xce; _msgpack_store32(&buf[1], (uint32_t)d); \
|
|
||||||
msgpack_pack_append_buffer(x, buf, 5); \
|
|
||||||
} else { \
|
|
||||||
/* unsigned 64 */ \
|
|
||||||
unsigned char buf[9]; \
|
|
||||||
buf[0] = 0xcf; _msgpack_store64(&buf[1], d); \
|
|
||||||
msgpack_pack_append_buffer(x, buf, 9); \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
} while(0)
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef msgpack_pack_inline_func_fixint
|
|
||||||
|
|
||||||
msgpack_pack_inline_func_fixint(_uint8)(msgpack_pack_user x, uint8_t d)
|
|
||||||
{
|
|
||||||
unsigned char buf[2] = {0xcc, TAKE8_8(d)};
|
|
||||||
msgpack_pack_append_buffer(x, buf, 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
msgpack_pack_inline_func_fixint(_uint16)(msgpack_pack_user x, uint16_t d)
|
|
||||||
{
|
|
||||||
unsigned char buf[3];
|
|
||||||
buf[0] = 0xcd; _msgpack_store16(&buf[1], d);
|
|
||||||
msgpack_pack_append_buffer(x, buf, 3);
|
|
||||||
}
|
|
||||||
|
|
||||||
msgpack_pack_inline_func_fixint(_uint32)(msgpack_pack_user x, uint32_t d)
|
|
||||||
{
|
|
||||||
unsigned char buf[5];
|
|
||||||
buf[0] = 0xce; _msgpack_store32(&buf[1], d);
|
|
||||||
msgpack_pack_append_buffer(x, buf, 5);
|
|
||||||
}
|
|
||||||
|
|
||||||
msgpack_pack_inline_func_fixint(_uint64)(msgpack_pack_user x, uint64_t d)
|
|
||||||
{
|
|
||||||
unsigned char buf[9];
|
|
||||||
buf[0] = 0xcf; _msgpack_store64(&buf[1], d);
|
|
||||||
msgpack_pack_append_buffer(x, buf, 9);
|
|
||||||
}
|
|
||||||
|
|
||||||
msgpack_pack_inline_func_fixint(_int8)(msgpack_pack_user x, int8_t d)
|
|
||||||
{
|
|
||||||
unsigned char buf[2] = {0xd0, TAKE8_8(d)};
|
|
||||||
msgpack_pack_append_buffer(x, buf, 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
msgpack_pack_inline_func_fixint(_int16)(msgpack_pack_user x, int16_t d)
|
|
||||||
{
|
|
||||||
unsigned char buf[3];
|
|
||||||
buf[0] = 0xd1; _msgpack_store16(&buf[1], d);
|
|
||||||
msgpack_pack_append_buffer(x, buf, 3);
|
|
||||||
}
|
|
||||||
|
|
||||||
msgpack_pack_inline_func_fixint(_int32)(msgpack_pack_user x, int32_t d)
|
|
||||||
{
|
|
||||||
unsigned char buf[5];
|
|
||||||
buf[0] = 0xd2; _msgpack_store32(&buf[1], d);
|
|
||||||
msgpack_pack_append_buffer(x, buf, 5);
|
|
||||||
}
|
|
||||||
|
|
||||||
msgpack_pack_inline_func_fixint(_int64)(msgpack_pack_user x, int64_t d)
|
|
||||||
{
|
|
||||||
unsigned char buf[9];
|
|
||||||
buf[0] = 0xd3; _msgpack_store64(&buf[1], d);
|
|
||||||
msgpack_pack_append_buffer(x, buf, 9);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef msgpack_pack_inline_func_fixint
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
msgpack_pack_inline_func(_uint8)(msgpack_pack_user x, uint8_t d)
|
|
||||||
{
|
|
||||||
msgpack_pack_real_uint8(x, d);
|
|
||||||
}
|
|
||||||
|
|
||||||
msgpack_pack_inline_func(_uint16)(msgpack_pack_user x, uint16_t d)
|
|
||||||
{
|
|
||||||
msgpack_pack_real_uint16(x, d);
|
|
||||||
}
|
|
||||||
|
|
||||||
msgpack_pack_inline_func(_uint32)(msgpack_pack_user x, uint32_t d)
|
|
||||||
{
|
|
||||||
msgpack_pack_real_uint32(x, d);
|
|
||||||
}
|
|
||||||
|
|
||||||
msgpack_pack_inline_func(_uint64)(msgpack_pack_user x, uint64_t d)
|
|
||||||
{
|
|
||||||
msgpack_pack_real_uint64(x, d);
|
|
||||||
}
|
|
||||||
|
|
||||||
msgpack_pack_inline_func(_int8)(msgpack_pack_user x, int8_t d)
|
|
||||||
{
|
|
||||||
msgpack_pack_real_int8(x, d);
|
|
||||||
}
|
|
||||||
|
|
||||||
msgpack_pack_inline_func(_int16)(msgpack_pack_user x, int16_t d)
|
|
||||||
{
|
|
||||||
msgpack_pack_real_int16(x, d);
|
|
||||||
}
|
|
||||||
|
|
||||||
msgpack_pack_inline_func(_int32)(msgpack_pack_user x, int32_t d)
|
|
||||||
{
|
|
||||||
msgpack_pack_real_int32(x, d);
|
|
||||||
}
|
|
||||||
|
|
||||||
msgpack_pack_inline_func(_int64)(msgpack_pack_user x, int64_t d)
|
|
||||||
{
|
|
||||||
msgpack_pack_real_int64(x, d);
|
|
||||||
}
|
|
||||||
|
|
||||||
msgpack_pack_inline_func(_char)(msgpack_pack_user x, char d)
|
|
||||||
{
|
|
||||||
#if defined(CHAR_MIN)
|
|
||||||
#if CHAR_MIN < 0
|
|
||||||
msgpack_pack_real_int8(x, d);
|
|
||||||
#else
|
|
||||||
msgpack_pack_real_uint8(x, d);
|
|
||||||
#endif
|
|
||||||
#else
|
|
||||||
#error CHAR_MIN is not defined
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
msgpack_pack_inline_func(_signed_char)(msgpack_pack_user x, signed char d)
|
|
||||||
{
|
|
||||||
msgpack_pack_real_int8(x, d);
|
|
||||||
}
|
|
||||||
|
|
||||||
msgpack_pack_inline_func(_unsigned_char)(msgpack_pack_user x, unsigned char d)
|
|
||||||
{
|
|
||||||
msgpack_pack_real_uint8(x, d);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef msgpack_pack_inline_func_cint
|
|
||||||
|
|
||||||
msgpack_pack_inline_func_cint(_short)(msgpack_pack_user x, short d)
|
|
||||||
{
|
|
||||||
#if defined(SIZEOF_SHORT)
|
|
||||||
#if SIZEOF_SHORT == 2
|
|
||||||
msgpack_pack_real_int16(x, d);
|
|
||||||
#elif SIZEOF_SHORT == 4
|
|
||||||
msgpack_pack_real_int32(x, d);
|
|
||||||
#else
|
|
||||||
msgpack_pack_real_int64(x, d);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#elif defined(SHRT_MAX)
|
|
||||||
#if SHRT_MAX == 0x7fff
|
|
||||||
msgpack_pack_real_int16(x, d);
|
|
||||||
#elif SHRT_MAX == 0x7fffffff
|
|
||||||
msgpack_pack_real_int32(x, d);
|
|
||||||
#else
|
|
||||||
msgpack_pack_real_int64(x, d);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#else
|
|
||||||
if(sizeof(short) == 2) {
|
|
||||||
msgpack_pack_real_int16(x, d);
|
|
||||||
} else if(sizeof(short) == 4) {
|
|
||||||
msgpack_pack_real_int32(x, d);
|
|
||||||
} else {
|
|
||||||
msgpack_pack_real_int64(x, d);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
msgpack_pack_inline_func_cint(_int)(msgpack_pack_user x, int d)
|
|
||||||
{
|
|
||||||
#if defined(SIZEOF_INT)
|
|
||||||
#if SIZEOF_INT == 2
|
|
||||||
msgpack_pack_real_int16(x, d);
|
|
||||||
#elif SIZEOF_INT == 4
|
|
||||||
msgpack_pack_real_int32(x, d);
|
|
||||||
#else
|
|
||||||
msgpack_pack_real_int64(x, d);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#elif defined(INT_MAX)
|
|
||||||
#if INT_MAX == 0x7fff
|
|
||||||
msgpack_pack_real_int16(x, d);
|
|
||||||
#elif INT_MAX == 0x7fffffff
|
|
||||||
msgpack_pack_real_int32(x, d);
|
|
||||||
#else
|
|
||||||
msgpack_pack_real_int64(x, d);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#else
|
|
||||||
if(sizeof(int) == 2) {
|
|
||||||
msgpack_pack_real_int16(x, d);
|
|
||||||
} else if(sizeof(int) == 4) {
|
|
||||||
msgpack_pack_real_int32(x, d);
|
|
||||||
} else {
|
|
||||||
msgpack_pack_real_int64(x, d);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
msgpack_pack_inline_func_cint(_long)(msgpack_pack_user x, long d)
|
|
||||||
{
|
|
||||||
#if defined(SIZEOF_LONG)
|
|
||||||
#if SIZEOF_LONG == 2
|
|
||||||
msgpack_pack_real_int16(x, d);
|
|
||||||
#elif SIZEOF_LONG == 4
|
|
||||||
msgpack_pack_real_int32(x, d);
|
|
||||||
#else
|
|
||||||
msgpack_pack_real_int64(x, d);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#elif defined(LONG_MAX)
|
|
||||||
#if LONG_MAX == 0x7fffL
|
|
||||||
msgpack_pack_real_int16(x, d);
|
|
||||||
#elif LONG_MAX == 0x7fffffffL
|
|
||||||
msgpack_pack_real_int32(x, d);
|
|
||||||
#else
|
|
||||||
msgpack_pack_real_int64(x, d);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#else
|
|
||||||
if(sizeof(long) == 2) {
|
|
||||||
msgpack_pack_real_int16(x, d);
|
|
||||||
} else if(sizeof(long) == 4) {
|
|
||||||
msgpack_pack_real_int32(x, d);
|
|
||||||
} else {
|
|
||||||
msgpack_pack_real_int64(x, d);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
msgpack_pack_inline_func_cint(_long_long)(msgpack_pack_user x, long long d)
|
|
||||||
{
|
|
||||||
#if defined(SIZEOF_LONG_LONG)
|
|
||||||
#if SIZEOF_LONG_LONG == 2
|
|
||||||
msgpack_pack_real_int16(x, d);
|
|
||||||
#elif SIZEOF_LONG_LONG == 4
|
|
||||||
msgpack_pack_real_int32(x, d);
|
|
||||||
#else
|
|
||||||
msgpack_pack_real_int64(x, d);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#elif defined(LLONG_MAX)
|
|
||||||
#if LLONG_MAX == 0x7fffL
|
|
||||||
msgpack_pack_real_int16(x, d);
|
|
||||||
#elif LLONG_MAX == 0x7fffffffL
|
|
||||||
msgpack_pack_real_int32(x, d);
|
|
||||||
#else
|
|
||||||
msgpack_pack_real_int64(x, d);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#else
|
|
||||||
if(sizeof(long long) == 2) {
|
|
||||||
msgpack_pack_real_int16(x, d);
|
|
||||||
} else if(sizeof(long long) == 4) {
|
|
||||||
msgpack_pack_real_int32(x, d);
|
|
||||||
} else {
|
|
||||||
msgpack_pack_real_int64(x, d);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
msgpack_pack_inline_func_cint(_unsigned_short)(msgpack_pack_user x, unsigned short d)
|
|
||||||
{
|
|
||||||
#if defined(SIZEOF_SHORT)
|
|
||||||
#if SIZEOF_SHORT == 2
|
|
||||||
msgpack_pack_real_uint16(x, d);
|
|
||||||
#elif SIZEOF_SHORT == 4
|
|
||||||
msgpack_pack_real_uint32(x, d);
|
|
||||||
#else
|
|
||||||
msgpack_pack_real_uint64(x, d);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#elif defined(USHRT_MAX)
|
|
||||||
#if USHRT_MAX == 0xffffU
|
|
||||||
msgpack_pack_real_uint16(x, d);
|
|
||||||
#elif USHRT_MAX == 0xffffffffU
|
|
||||||
msgpack_pack_real_uint32(x, d);
|
|
||||||
#else
|
|
||||||
msgpack_pack_real_uint64(x, d);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#else
|
|
||||||
if(sizeof(unsigned short) == 2) {
|
|
||||||
msgpack_pack_real_uint16(x, d);
|
|
||||||
} else if(sizeof(unsigned short) == 4) {
|
|
||||||
msgpack_pack_real_uint32(x, d);
|
|
||||||
} else {
|
|
||||||
msgpack_pack_real_uint64(x, d);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
msgpack_pack_inline_func_cint(_unsigned_int)(msgpack_pack_user x, unsigned int d)
|
|
||||||
{
|
|
||||||
#if defined(SIZEOF_INT)
|
|
||||||
#if SIZEOF_INT == 2
|
|
||||||
msgpack_pack_real_uint16(x, d);
|
|
||||||
#elif SIZEOF_INT == 4
|
|
||||||
msgpack_pack_real_uint32(x, d);
|
|
||||||
#else
|
|
||||||
msgpack_pack_real_uint64(x, d);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#elif defined(UINT_MAX)
|
|
||||||
#if UINT_MAX == 0xffffU
|
|
||||||
msgpack_pack_real_uint16(x, d);
|
|
||||||
#elif UINT_MAX == 0xffffffffU
|
|
||||||
msgpack_pack_real_uint32(x, d);
|
|
||||||
#else
|
|
||||||
msgpack_pack_real_uint64(x, d);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#else
|
|
||||||
if(sizeof(unsigned int) == 2) {
|
|
||||||
msgpack_pack_real_uint16(x, d);
|
|
||||||
} else if(sizeof(unsigned int) == 4) {
|
|
||||||
msgpack_pack_real_uint32(x, d);
|
|
||||||
} else {
|
|
||||||
msgpack_pack_real_uint64(x, d);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
msgpack_pack_inline_func_cint(_unsigned_long)(msgpack_pack_user x, unsigned long d)
|
|
||||||
{
|
|
||||||
#if defined(SIZEOF_LONG)
|
|
||||||
#if SIZEOF_LONG == 2
|
|
||||||
msgpack_pack_real_uint16(x, d);
|
|
||||||
#elif SIZEOF_LONG == 4
|
|
||||||
msgpack_pack_real_uint32(x, d);
|
|
||||||
#else
|
|
||||||
msgpack_pack_real_uint64(x, d);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#elif defined(ULONG_MAX)
|
|
||||||
#if ULONG_MAX == 0xffffUL
|
|
||||||
msgpack_pack_real_uint16(x, d);
|
|
||||||
#elif ULONG_MAX == 0xffffffffUL
|
|
||||||
msgpack_pack_real_uint32(x, d);
|
|
||||||
#else
|
|
||||||
msgpack_pack_real_uint64(x, d);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#else
|
|
||||||
if(sizeof(unsigned long) == 2) {
|
|
||||||
msgpack_pack_real_uint16(x, d);
|
|
||||||
} else if(sizeof(unsigned long) == 4) {
|
|
||||||
msgpack_pack_real_uint32(x, d);
|
|
||||||
} else {
|
|
||||||
msgpack_pack_real_uint64(x, d);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
msgpack_pack_inline_func_cint(_unsigned_long_long)(msgpack_pack_user x, unsigned long long d)
|
|
||||||
{
|
|
||||||
#if defined(SIZEOF_LONG_LONG)
|
|
||||||
#if SIZEOF_LONG_LONG == 2
|
|
||||||
msgpack_pack_real_uint16(x, d);
|
|
||||||
#elif SIZEOF_LONG_LONG == 4
|
|
||||||
msgpack_pack_real_uint32(x, d);
|
|
||||||
#else
|
|
||||||
msgpack_pack_real_uint64(x, d);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#elif defined(ULLONG_MAX)
|
|
||||||
#if ULLONG_MAX == 0xffffUL
|
|
||||||
msgpack_pack_real_uint16(x, d);
|
|
||||||
#elif ULLONG_MAX == 0xffffffffUL
|
|
||||||
msgpack_pack_real_uint32(x, d);
|
|
||||||
#else
|
|
||||||
msgpack_pack_real_uint64(x, d);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#else
|
|
||||||
if(sizeof(unsigned long long) == 2) {
|
|
||||||
msgpack_pack_real_uint16(x, d);
|
|
||||||
} else if(sizeof(unsigned long long) == 4) {
|
|
||||||
msgpack_pack_real_uint32(x, d);
|
|
||||||
} else {
|
|
||||||
msgpack_pack_real_uint64(x, d);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef msgpack_pack_inline_func_cint
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Float
|
|
||||||
*/
|
|
||||||
|
|
||||||
msgpack_pack_inline_func(_float)(msgpack_pack_user x, float d)
|
|
||||||
{
|
|
||||||
unsigned char buf[5];
|
|
||||||
union { float f; uint32_t i; } mem;
|
|
||||||
mem.f = d;
|
|
||||||
buf[0] = 0xca; _msgpack_store32(&buf[1], mem.i);
|
|
||||||
msgpack_pack_append_buffer(x, buf, 5);
|
|
||||||
}
|
|
||||||
|
|
||||||
msgpack_pack_inline_func(_double)(msgpack_pack_user x, double d)
|
|
||||||
{
|
|
||||||
unsigned char buf[9];
|
|
||||||
union { double f; uint64_t i; } mem;
|
|
||||||
mem.f = d;
|
|
||||||
buf[0] = 0xcb;
|
|
||||||
#if defined(__arm__) && !(__ARM_EABI__) // arm-oabi
|
|
||||||
// https://github.com/msgpack/msgpack-perl/pull/1
|
|
||||||
mem.i = (mem.i & 0xFFFFFFFFUL) << 32UL | (mem.i >> 32UL);
|
|
||||||
#endif
|
|
||||||
_msgpack_store64(&buf[1], mem.i);
|
|
||||||
msgpack_pack_append_buffer(x, buf, 9);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Nil
|
|
||||||
*/
|
|
||||||
|
|
||||||
msgpack_pack_inline_func(_nil)(msgpack_pack_user x)
|
|
||||||
{
|
|
||||||
static const unsigned char d = 0xc0;
|
|
||||||
msgpack_pack_append_buffer(x, &d, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Boolean
|
|
||||||
*/
|
|
||||||
|
|
||||||
msgpack_pack_inline_func(_true)(msgpack_pack_user x)
|
|
||||||
{
|
|
||||||
static const unsigned char d = 0xc3;
|
|
||||||
msgpack_pack_append_buffer(x, &d, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
msgpack_pack_inline_func(_false)(msgpack_pack_user x)
|
|
||||||
{
|
|
||||||
static const unsigned char d = 0xc2;
|
|
||||||
msgpack_pack_append_buffer(x, &d, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Array
|
|
||||||
*/
|
|
||||||
|
|
||||||
msgpack_pack_inline_func(_array)(msgpack_pack_user x, size_t n)
|
|
||||||
{
|
|
||||||
if(n < 16) {
|
|
||||||
unsigned char d = 0x90 | (uint8_t)n;
|
|
||||||
msgpack_pack_append_buffer(x, &d, 1);
|
|
||||||
} else if(n < 65536) {
|
|
||||||
unsigned char buf[3];
|
|
||||||
buf[0] = 0xdc; _msgpack_store16(&buf[1], (uint16_t)n);
|
|
||||||
msgpack_pack_append_buffer(x, buf, 3);
|
|
||||||
} else {
|
|
||||||
unsigned char buf[5];
|
|
||||||
buf[0] = 0xdd; _msgpack_store32(&buf[1], (uint32_t)n);
|
|
||||||
msgpack_pack_append_buffer(x, buf, 5);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Map
|
|
||||||
*/
|
|
||||||
|
|
||||||
msgpack_pack_inline_func(_map)(msgpack_pack_user x, size_t n)
|
|
||||||
{
|
|
||||||
if(n < 16) {
|
|
||||||
unsigned char d = 0x80 | (uint8_t)n;
|
|
||||||
msgpack_pack_append_buffer(x, &TAKE8_8(d), 1);
|
|
||||||
} else if(n < 65536) {
|
|
||||||
unsigned char buf[3];
|
|
||||||
buf[0] = 0xde; _msgpack_store16(&buf[1], (uint16_t)n);
|
|
||||||
msgpack_pack_append_buffer(x, buf, 3);
|
|
||||||
} else {
|
|
||||||
unsigned char buf[5];
|
|
||||||
buf[0] = 0xdf; _msgpack_store32(&buf[1], (uint32_t)n);
|
|
||||||
msgpack_pack_append_buffer(x, buf, 5);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Str
|
|
||||||
*/
|
|
||||||
|
|
||||||
msgpack_pack_inline_func(_str)(msgpack_pack_user x, size_t l)
|
|
||||||
{
|
|
||||||
if(l < 32) {
|
|
||||||
unsigned char d = 0xa0 | (uint8_t)l;
|
|
||||||
msgpack_pack_append_buffer(x, &TAKE8_8(d), 1);
|
|
||||||
} else if(l < 256) {
|
|
||||||
unsigned char buf[2];
|
|
||||||
buf[0] = 0xd9; buf[1] = (uint8_t)l;
|
|
||||||
msgpack_pack_append_buffer(x, buf, 2);
|
|
||||||
} else if(l < 65536) {
|
|
||||||
unsigned char buf[3];
|
|
||||||
buf[0] = 0xda; _msgpack_store16(&buf[1], (uint16_t)l);
|
|
||||||
msgpack_pack_append_buffer(x, buf, 3);
|
|
||||||
} else {
|
|
||||||
unsigned char buf[5];
|
|
||||||
buf[0] = 0xdb; _msgpack_store32(&buf[1], (uint32_t)l);
|
|
||||||
msgpack_pack_append_buffer(x, buf, 5);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
msgpack_pack_inline_func(_str_body)(msgpack_pack_user x, const void* b, size_t l)
|
|
||||||
{
|
|
||||||
msgpack_pack_append_buffer(x, (const unsigned char*)b, l);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Bin
|
|
||||||
*/
|
|
||||||
|
|
||||||
msgpack_pack_inline_func(_bin)(msgpack_pack_user x, size_t l)
|
|
||||||
{
|
|
||||||
if(l < 256) {
|
|
||||||
unsigned char buf[2];
|
|
||||||
buf[0] = 0xc4; buf[1] = (uint8_t)l;
|
|
||||||
msgpack_pack_append_buffer(x, buf, 2);
|
|
||||||
} else if(l < 65536) {
|
|
||||||
unsigned char buf[3];
|
|
||||||
buf[0] = 0xc5; _msgpack_store16(&buf[1], (uint16_t)l);
|
|
||||||
msgpack_pack_append_buffer(x, buf, 3);
|
|
||||||
} else {
|
|
||||||
unsigned char buf[5];
|
|
||||||
buf[0] = 0xc6; _msgpack_store32(&buf[1], (uint32_t)l);
|
|
||||||
msgpack_pack_append_buffer(x, buf, 5);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
msgpack_pack_inline_func(_bin_body)(msgpack_pack_user x, const void* b, size_t l)
|
|
||||||
{
|
|
||||||
msgpack_pack_append_buffer(x, (const unsigned char*)b, l);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Ext
|
|
||||||
*/
|
|
||||||
|
|
||||||
msgpack_pack_inline_func(_ext)(msgpack_pack_user x, size_t l, int8_t type)
|
|
||||||
{
|
|
||||||
switch(l) {
|
|
||||||
case 1: {
|
|
||||||
unsigned char buf[2];
|
|
||||||
buf[0] = 0xd4;
|
|
||||||
buf[1] = type;
|
|
||||||
msgpack_pack_append_buffer(x, buf, 2);
|
|
||||||
} break;
|
|
||||||
case 2: {
|
|
||||||
unsigned char buf[2];
|
|
||||||
buf[0] = 0xd5;
|
|
||||||
buf[1] = type;
|
|
||||||
msgpack_pack_append_buffer(x, buf, 2);
|
|
||||||
} break;
|
|
||||||
case 4: {
|
|
||||||
unsigned char buf[2];
|
|
||||||
buf[0] = 0xd6;
|
|
||||||
buf[1] = type;
|
|
||||||
msgpack_pack_append_buffer(x, buf, 2);
|
|
||||||
} break;
|
|
||||||
case 8: {
|
|
||||||
unsigned char buf[2];
|
|
||||||
buf[0] = 0xd7;
|
|
||||||
buf[1] = type;
|
|
||||||
msgpack_pack_append_buffer(x, buf, 2);
|
|
||||||
} break;
|
|
||||||
case 16: {
|
|
||||||
unsigned char buf[2];
|
|
||||||
buf[0] = 0xd8;
|
|
||||||
buf[1] = type;
|
|
||||||
msgpack_pack_append_buffer(x, buf, 2);
|
|
||||||
} break;
|
|
||||||
default:
|
|
||||||
if(l < 256) {
|
|
||||||
unsigned char buf[3];
|
|
||||||
buf[0] = 0xc7;
|
|
||||||
buf[1] = (unsigned char)l;
|
|
||||||
buf[2] = type;
|
|
||||||
msgpack_pack_append_buffer(x, buf, 3);
|
|
||||||
} else if(l < 65536) {
|
|
||||||
unsigned char buf[4];
|
|
||||||
buf[0] = 0xc8;
|
|
||||||
_msgpack_store16(&buf[1], l);
|
|
||||||
buf[3] = type;
|
|
||||||
msgpack_pack_append_buffer(x, buf, 4);
|
|
||||||
} else {
|
|
||||||
unsigned char buf[6];
|
|
||||||
buf[0] = 0xc9;
|
|
||||||
_msgpack_store32(&buf[1], l);
|
|
||||||
buf[5] = type;
|
|
||||||
msgpack_pack_append_buffer(x, buf, 6);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
msgpack_pack_inline_func(_ext_body)(msgpack_pack_user x, const void* b, size_t l)
|
|
||||||
{
|
|
||||||
msgpack_pack_append_buffer(x, (const unsigned char*)b, l);
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef msgpack_pack_inline_func
|
|
||||||
#undef msgpack_pack_user
|
|
||||||
#undef msgpack_pack_append_buffer
|
|
||||||
|
|
||||||
#undef TAKE8_8
|
|
||||||
#undef TAKE8_16
|
|
||||||
#undef TAKE8_32
|
|
||||||
#undef TAKE8_64
|
|
||||||
|
|
||||||
#undef msgpack_pack_real_uint8
|
|
||||||
#undef msgpack_pack_real_uint16
|
|
||||||
#undef msgpack_pack_real_uint32
|
|
||||||
#undef msgpack_pack_real_uint64
|
|
||||||
#undef msgpack_pack_real_int8
|
|
||||||
#undef msgpack_pack_real_int16
|
|
||||||
#undef msgpack_pack_real_int32
|
|
||||||
#undef msgpack_pack_real_int64
|
|
||||||
|
|
||||||
@@ -1,118 +0,0 @@
|
|||||||
/*
|
|
||||||
* MessagePack for C simple buffer implementation
|
|
||||||
*
|
|
||||||
* Copyright (C) 2008-2009 FURUHASHI Sadayuki
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
#ifndef MSGPACK_SBUFFER_H
|
|
||||||
#define MSGPACK_SBUFFER_H
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup msgpack_sbuffer Simple buffer
|
|
||||||
* @ingroup msgpack_buffer
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef struct msgpack_sbuffer {
|
|
||||||
size_t size;
|
|
||||||
char* data;
|
|
||||||
size_t alloc;
|
|
||||||
} msgpack_sbuffer;
|
|
||||||
|
|
||||||
static inline void msgpack_sbuffer_init(msgpack_sbuffer* sbuf)
|
|
||||||
{
|
|
||||||
memset(sbuf, 0, sizeof(msgpack_sbuffer));
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void msgpack_sbuffer_destroy(msgpack_sbuffer* sbuf)
|
|
||||||
{
|
|
||||||
free(sbuf->data);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline msgpack_sbuffer* msgpack_sbuffer_new(void)
|
|
||||||
{
|
|
||||||
return (msgpack_sbuffer*)calloc(1, sizeof(msgpack_sbuffer));
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void msgpack_sbuffer_free(msgpack_sbuffer* sbuf)
|
|
||||||
{
|
|
||||||
if(sbuf == NULL) { return; }
|
|
||||||
msgpack_sbuffer_destroy(sbuf);
|
|
||||||
free(sbuf);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef MSGPACK_SBUFFER_INIT_SIZE
|
|
||||||
#define MSGPACK_SBUFFER_INIT_SIZE 8192
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static inline int msgpack_sbuffer_write(void* data, const char* buf, size_t len)
|
|
||||||
{
|
|
||||||
msgpack_sbuffer* sbuf = (msgpack_sbuffer*)data;
|
|
||||||
|
|
||||||
if(sbuf->alloc - sbuf->size < len) {
|
|
||||||
void* tmp;
|
|
||||||
size_t nsize = (sbuf->alloc) ?
|
|
||||||
sbuf->alloc * 2 : MSGPACK_SBUFFER_INIT_SIZE;
|
|
||||||
|
|
||||||
while(nsize < sbuf->size + len) {
|
|
||||||
size_t tmp_nsize = nsize * 2;
|
|
||||||
if (tmp_nsize <= nsize) {
|
|
||||||
nsize = sbuf->size + len;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
nsize = tmp_nsize;
|
|
||||||
}
|
|
||||||
|
|
||||||
tmp = realloc(sbuf->data, nsize);
|
|
||||||
if(!tmp) { return -1; }
|
|
||||||
|
|
||||||
sbuf->data = (char*)tmp;
|
|
||||||
sbuf->alloc = nsize;
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy(sbuf->data + sbuf->size, buf, len);
|
|
||||||
sbuf->size += len;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline char* msgpack_sbuffer_release(msgpack_sbuffer* sbuf)
|
|
||||||
{
|
|
||||||
char* tmp = sbuf->data;
|
|
||||||
sbuf->size = 0;
|
|
||||||
sbuf->data = NULL;
|
|
||||||
sbuf->alloc = 0;
|
|
||||||
return tmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void msgpack_sbuffer_clear(msgpack_sbuffer* sbuf)
|
|
||||||
{
|
|
||||||
sbuf->size = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @} */
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* msgpack/sbuffer.h */
|
|
||||||
@@ -1,138 +0,0 @@
|
|||||||
//
|
|
||||||
// MessagePack for C++ simple buffer implementation
|
|
||||||
//
|
|
||||||
// Copyright (C) 2008-2013 FURUHASHI Sadayuki and KONDO Takatoshi
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
//
|
|
||||||
#ifndef MSGPACK_SBUFFER_HPP
|
|
||||||
#define MSGPACK_SBUFFER_HPP
|
|
||||||
|
|
||||||
#include "msgpack/versioning.hpp"
|
|
||||||
|
|
||||||
#include <stdexcept>
|
|
||||||
|
|
||||||
#ifndef MSGPACK_SBUFFER_INIT_SIZE
|
|
||||||
#define MSGPACK_SBUFFER_INIT_SIZE 8192
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace msgpack {
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
MSGPACK_API_VERSION_NAMESPACE(v1) {
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
class sbuffer {
|
|
||||||
public:
|
|
||||||
sbuffer(size_t initsz = MSGPACK_SBUFFER_INIT_SIZE):m_size(0), m_alloc(initsz)
|
|
||||||
{
|
|
||||||
if(initsz == 0) {
|
|
||||||
m_data = nullptr;
|
|
||||||
} else {
|
|
||||||
m_data = (char*)::malloc(initsz);
|
|
||||||
if(!m_data) {
|
|
||||||
throw std::bad_alloc();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
~sbuffer()
|
|
||||||
{
|
|
||||||
::free(m_data);
|
|
||||||
}
|
|
||||||
|
|
||||||
public:
|
|
||||||
void write(const char* buf, size_t len)
|
|
||||||
{
|
|
||||||
if(m_alloc - m_size < len) {
|
|
||||||
expand_buffer(len);
|
|
||||||
}
|
|
||||||
std::memcpy(m_data + m_size, buf, len);
|
|
||||||
m_size += len;
|
|
||||||
}
|
|
||||||
|
|
||||||
char* data()
|
|
||||||
{
|
|
||||||
return m_data;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char* data() const
|
|
||||||
{
|
|
||||||
return m_data;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t size() const
|
|
||||||
{
|
|
||||||
return m_size;
|
|
||||||
}
|
|
||||||
|
|
||||||
char* release()
|
|
||||||
{
|
|
||||||
char* tmp = m_data;
|
|
||||||
m_size = 0;
|
|
||||||
m_data = nullptr;
|
|
||||||
m_alloc = 0;
|
|
||||||
return tmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
void clear()
|
|
||||||
{
|
|
||||||
m_size = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
void expand_buffer(size_t len)
|
|
||||||
{
|
|
||||||
size_t nsize = (m_alloc > 0) ?
|
|
||||||
m_alloc * 2 : MSGPACK_SBUFFER_INIT_SIZE;
|
|
||||||
|
|
||||||
while(nsize < m_size + len) {
|
|
||||||
size_t tmp_nsize = nsize * 2;
|
|
||||||
if (tmp_nsize <= nsize) {
|
|
||||||
nsize = m_size + len;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
nsize = tmp_nsize;
|
|
||||||
}
|
|
||||||
|
|
||||||
void* tmp = ::realloc(m_data, nsize);
|
|
||||||
if(!tmp) {
|
|
||||||
throw std::bad_alloc();
|
|
||||||
}
|
|
||||||
|
|
||||||
m_data = static_cast<char*>(tmp);
|
|
||||||
m_alloc = nsize;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(MSGPACK_USE_CPP03)
|
|
||||||
private:
|
|
||||||
sbuffer(const sbuffer&);
|
|
||||||
sbuffer& operator=(const sbuffer&);
|
|
||||||
#else // defined(MSGPACK_USE_CPP03)
|
|
||||||
sbuffer(const sbuffer&) = delete;
|
|
||||||
sbuffer& operator=(const sbuffer&) = delete;
|
|
||||||
#endif // defined(MSGPACK_USE_CPP03)
|
|
||||||
|
|
||||||
private:
|
|
||||||
size_t m_size;
|
|
||||||
char* m_data;
|
|
||||||
size_t m_alloc;
|
|
||||||
};
|
|
||||||
|
|
||||||
/// @cond
|
|
||||||
} // MSGPACK_API_VERSION_NAMESPACE(v1)
|
|
||||||
/// @endcond
|
|
||||||
|
|
||||||
} // namespace msgpack
|
|
||||||
|
|
||||||
#endif /* msgpack/sbuffer.hpp */
|
|
||||||
@@ -1,203 +0,0 @@
|
|||||||
/*
|
|
||||||
* MessagePack system dependencies
|
|
||||||
*
|
|
||||||
* Copyright (C) 2008-2010 FURUHASHI Sadayuki
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
#ifndef MSGPACK_SYSDEP_H
|
|
||||||
#define MSGPACK_SYSDEP_H
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stddef.h>
|
|
||||||
#if defined(_MSC_VER) && _MSC_VER < 1600
|
|
||||||
typedef __int8 int8_t;
|
|
||||||
typedef unsigned __int8 uint8_t;
|
|
||||||
typedef __int16 int16_t;
|
|
||||||
typedef unsigned __int16 uint16_t;
|
|
||||||
typedef __int32 int32_t;
|
|
||||||
typedef unsigned __int32 uint32_t;
|
|
||||||
typedef __int64 int64_t;
|
|
||||||
typedef unsigned __int64 uint64_t;
|
|
||||||
#elif defined(_MSC_VER) // && _MSC_VER >= 1600
|
|
||||||
#include <stdint.h>
|
|
||||||
#else
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(_MSC_VER)
|
|
||||||
#define MSGPACK_DLLEXPORT __declspec(dllexport)
|
|
||||||
#else /* _MSC_VER */
|
|
||||||
#define MSGPACK_DLLEXPORT
|
|
||||||
#endif /* _MSC_VER */
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
#define _msgpack_atomic_counter_header <windows.h>
|
|
||||||
typedef long _msgpack_atomic_counter_t;
|
|
||||||
#define _msgpack_sync_decr_and_fetch(ptr) InterlockedDecrement(ptr)
|
|
||||||
#define _msgpack_sync_incr_and_fetch(ptr) InterlockedIncrement(ptr)
|
|
||||||
#elif defined(__GNUC__) && ((__GNUC__*10 + __GNUC_MINOR__) < 41)
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
|
||||||
#define _msgpack_atomic_counter_header "gcc_atomic.hpp"
|
|
||||||
#else
|
|
||||||
#define _msgpack_atomic_counter_header "gcc_atomic.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#else
|
|
||||||
typedef unsigned int _msgpack_atomic_counter_t;
|
|
||||||
#define _msgpack_sync_decr_and_fetch(ptr) __sync_sub_and_fetch(ptr, 1)
|
|
||||||
#define _msgpack_sync_incr_and_fetch(ptr) __sync_add_and_fetch(ptr, 1)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
/* numeric_limits<T>::min,max */
|
|
||||||
#ifdef max
|
|
||||||
#undef max
|
|
||||||
#endif
|
|
||||||
#ifdef min
|
|
||||||
#undef min
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
#include <arpa/inet.h> /* __BYTE_ORDER */
|
|
||||||
# if !defined(__APPLE__) && !defined(__FreeBSD__) && !defined(__OpenBSD__) && \
|
|
||||||
!(defined(__sun) && defined(__SVR4))
|
|
||||||
# include <byteswap.h>
|
|
||||||
# endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__)
|
|
||||||
#if __BYTE_ORDER == __LITTLE_ENDIAN
|
|
||||||
#define __LITTLE_ENDIAN__
|
|
||||||
#elif __BYTE_ORDER == __BIG_ENDIAN
|
|
||||||
#define __BIG_ENDIAN__
|
|
||||||
#elif _WIN32
|
|
||||||
#define __LITTLE_ENDIAN__
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __LITTLE_ENDIAN__
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
# if defined(ntohs)
|
|
||||||
# define _msgpack_be16(x) ntohs(x)
|
|
||||||
# elif defined(_byteswap_ushort) || (defined(_MSC_VER) && _MSC_VER >= 1400)
|
|
||||||
# define _msgpack_be16(x) ((uint16_t)_byteswap_ushort((unsigned short)x))
|
|
||||||
# else
|
|
||||||
# define _msgpack_be16(x) ( \
|
|
||||||
((((uint16_t)x) << 8) ) | \
|
|
||||||
((((uint16_t)x) >> 8) ) )
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
# define _msgpack_be16(x) ntohs(x)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
# if defined(ntohl)
|
|
||||||
# define _msgpack_be32(x) ntohl(x)
|
|
||||||
# elif defined(_byteswap_ulong) || (defined(_MSC_VER) && _MSC_VER >= 1400)
|
|
||||||
# define _msgpack_be32(x) ((uint32_t)_byteswap_ulong((unsigned long)x))
|
|
||||||
# else
|
|
||||||
# define _msgpack_be32(x) \
|
|
||||||
( ((((uint32_t)x) << 24) ) | \
|
|
||||||
((((uint32_t)x) << 8) & 0x00ff0000U ) | \
|
|
||||||
((((uint32_t)x) >> 8) & 0x0000ff00U ) | \
|
|
||||||
((((uint32_t)x) >> 24) ) )
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
# define _msgpack_be32(x) ntohl(x)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(_byteswap_uint64) || (defined(_MSC_VER) && _MSC_VER >= 1400)
|
|
||||||
# define _msgpack_be64(x) (_byteswap_uint64(x))
|
|
||||||
#elif defined(bswap_64)
|
|
||||||
# define _msgpack_be64(x) bswap_64(x)
|
|
||||||
#elif defined(__DARWIN_OSSwapInt64)
|
|
||||||
# define _msgpack_be64(x) __DARWIN_OSSwapInt64(x)
|
|
||||||
#else
|
|
||||||
#define _msgpack_be64(x) \
|
|
||||||
( ((((uint64_t)x) << 56) ) | \
|
|
||||||
((((uint64_t)x) << 40) & 0x00ff000000000000ULL ) | \
|
|
||||||
((((uint64_t)x) << 24) & 0x0000ff0000000000ULL ) | \
|
|
||||||
((((uint64_t)x) << 8) & 0x000000ff00000000ULL ) | \
|
|
||||||
((((uint64_t)x) >> 8) & 0x00000000ff000000ULL ) | \
|
|
||||||
((((uint64_t)x) >> 24) & 0x0000000000ff0000ULL ) | \
|
|
||||||
((((uint64_t)x) >> 40) & 0x000000000000ff00ULL ) | \
|
|
||||||
((((uint64_t)x) >> 56) ) )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#else /* __LITTLE_ENDIAN__ */
|
|
||||||
|
|
||||||
#define _msgpack_be16(x) (x)
|
|
||||||
#define _msgpack_be32(x) (x)
|
|
||||||
#define _msgpack_be64(x) (x)
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define _msgpack_load16(cast, from, to) do { \
|
|
||||||
memcpy((cast*)(to), (from), sizeof(cast)); \
|
|
||||||
*(to) = _msgpack_be16(*(to)); \
|
|
||||||
} while (0);
|
|
||||||
|
|
||||||
#define _msgpack_load32(cast, from, to) do { \
|
|
||||||
memcpy((cast*)(to), (from), sizeof(cast)); \
|
|
||||||
*(to) = _msgpack_be32(*(to)); \
|
|
||||||
} while (0);
|
|
||||||
#define _msgpack_load64(cast, from, to) do { \
|
|
||||||
memcpy((cast*)(to), (from), sizeof(cast)); \
|
|
||||||
*(to) = _msgpack_be64(*(to)); \
|
|
||||||
} while (0);
|
|
||||||
|
|
||||||
#define _msgpack_store16(to, num) \
|
|
||||||
do { uint16_t val = _msgpack_be16(num); memcpy(to, &val, 2); } while(0)
|
|
||||||
#define _msgpack_store32(to, num) \
|
|
||||||
do { uint32_t val = _msgpack_be32(num); memcpy(to, &val, 4); } while(0)
|
|
||||||
#define _msgpack_store64(to, num) \
|
|
||||||
do { uint64_t val = _msgpack_be64(num); memcpy(to, &val, 8); } while(0)
|
|
||||||
|
|
||||||
/*
|
|
||||||
#define _msgpack_load16(cast, from) \
|
|
||||||
({ cast val; memcpy(&val, (char*)from, 2); _msgpack_be16(val); })
|
|
||||||
#define _msgpack_load32(cast, from) \
|
|
||||||
({ cast val; memcpy(&val, (char*)from, 4); _msgpack_be32(val); })
|
|
||||||
#define _msgpack_load64(cast, from) \
|
|
||||||
({ cast val; memcpy(&val, (char*)from, 8); _msgpack_be64(val); })
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#if !defined(__cplusplus) && defined(_MSC_VER)
|
|
||||||
# if !defined(FALSE)
|
|
||||||
# define FALSE (0)
|
|
||||||
# endif
|
|
||||||
# if !defined(TRUE)
|
|
||||||
# define TRUE (!FALSE)
|
|
||||||
# endif
|
|
||||||
# if _MSC_VER >= 1800
|
|
||||||
# include <stdbool.h>
|
|
||||||
# else
|
|
||||||
# define bool int
|
|
||||||
# define true TRUE
|
|
||||||
# define false FALSE
|
|
||||||
# endif
|
|
||||||
# define inline __inline
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* msgpack/sysdep.h */
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
#include "cpp_config.hpp"
|
|
||||||
#include "adaptor/bool.hpp"
|
|
||||||
#include "adaptor/char_ptr.hpp"
|
|
||||||
#include "adaptor/deque.hpp"
|
|
||||||
#include "adaptor/fixint.hpp"
|
|
||||||
#include "adaptor/float.hpp"
|
|
||||||
#include "adaptor/int.hpp"
|
|
||||||
#include "adaptor/list.hpp"
|
|
||||||
#include "adaptor/map.hpp"
|
|
||||||
#include "adaptor/nil.hpp"
|
|
||||||
#include "adaptor/pair.hpp"
|
|
||||||
#include "adaptor/raw.hpp"
|
|
||||||
#include "adaptor/set.hpp"
|
|
||||||
#include "adaptor/string.hpp"
|
|
||||||
#include "adaptor/vector.hpp"
|
|
||||||
#include "adaptor/vector_bool.hpp"
|
|
||||||
#include "adaptor/vector_char.hpp"
|
|
||||||
#include "adaptor/msgpack_tuple.hpp"
|
|
||||||
#include "adaptor/define.hpp"
|
|
||||||
|
|
||||||
#if defined(MSGPACK_USE_CPP03)
|
|
||||||
|
|
||||||
#include "adaptor/tr1/unordered_map.hpp"
|
|
||||||
#include "adaptor/tr1/unordered_set.hpp"
|
|
||||||
|
|
||||||
#else // defined(MSGPACK_USE_CPP03)
|
|
||||||
|
|
||||||
#include "adaptor/cpp11/array.hpp"
|
|
||||||
#include "adaptor/cpp11/array_char.hpp"
|
|
||||||
#include "adaptor/cpp11/forward_list.hpp"
|
|
||||||
#include "adaptor/cpp11/tuple.hpp"
|
|
||||||
#include "adaptor/cpp11/unordered_map.hpp"
|
|
||||||
#include "adaptor/cpp11/unordered_set.hpp"
|
|
||||||
|
|
||||||
#endif // defined(MSGPACK_USE_CPP03)
|
|
||||||
@@ -1,278 +0,0 @@
|
|||||||
/*
|
|
||||||
* MessagePack for C unpacking routine
|
|
||||||
*
|
|
||||||
* Copyright (C) 2008-2009 FURUHASHI Sadayuki
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
#ifndef MSGPACK_UNPACKER_H
|
|
||||||
#define MSGPACK_UNPACKER_H
|
|
||||||
|
|
||||||
#include "zone.h"
|
|
||||||
#include "object.h"
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup msgpack_unpack Deserializer
|
|
||||||
* @ingroup msgpack
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef struct msgpack_unpacked {
|
|
||||||
msgpack_zone* zone;
|
|
||||||
msgpack_object data;
|
|
||||||
} msgpack_unpacked;
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
MSGPACK_UNPACK_SUCCESS = 2,
|
|
||||||
MSGPACK_UNPACK_EXTRA_BYTES = 1,
|
|
||||||
MSGPACK_UNPACK_CONTINUE = 0,
|
|
||||||
MSGPACK_UNPACK_PARSE_ERROR = -1,
|
|
||||||
MSGPACK_UNPACK_NOMEM_ERROR = -2
|
|
||||||
} msgpack_unpack_return;
|
|
||||||
|
|
||||||
|
|
||||||
MSGPACK_DLLEXPORT
|
|
||||||
msgpack_unpack_return
|
|
||||||
msgpack_unpack_next(msgpack_unpacked* result,
|
|
||||||
const char* data, size_t len, size_t* off);
|
|
||||||
|
|
||||||
/** @} */
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @defgroup msgpack_unpacker Streaming deserializer
|
|
||||||
* @ingroup msgpack
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef struct msgpack_unpacker {
|
|
||||||
char* buffer;
|
|
||||||
size_t used;
|
|
||||||
size_t free;
|
|
||||||
size_t off;
|
|
||||||
size_t parsed;
|
|
||||||
msgpack_zone* z;
|
|
||||||
size_t initial_buffer_size;
|
|
||||||
void* ctx;
|
|
||||||
} msgpack_unpacker;
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef MSGPACK_UNPACKER_INIT_BUFFER_SIZE
|
|
||||||
#define MSGPACK_UNPACKER_INIT_BUFFER_SIZE (64*1024)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initializes a streaming deserializer.
|
|
||||||
* The initialized deserializer must be destroyed by msgpack_unpacker_destroy(msgpack_unpacker*).
|
|
||||||
*/
|
|
||||||
MSGPACK_DLLEXPORT
|
|
||||||
bool msgpack_unpacker_init(msgpack_unpacker* mpac, size_t initial_buffer_size);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Destroys a streaming deserializer initialized by msgpack_unpacker_init(msgpack_unpacker*, size_t).
|
|
||||||
*/
|
|
||||||
MSGPACK_DLLEXPORT
|
|
||||||
void msgpack_unpacker_destroy(msgpack_unpacker* mpac);
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a streaming deserializer.
|
|
||||||
* The created deserializer must be destroyed by msgpack_unpacker_free(msgpack_unpacker*).
|
|
||||||
*/
|
|
||||||
MSGPACK_DLLEXPORT
|
|
||||||
msgpack_unpacker* msgpack_unpacker_new(size_t initial_buffer_size);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Frees a streaming deserializer created by msgpack_unpacker_new(size_t).
|
|
||||||
*/
|
|
||||||
MSGPACK_DLLEXPORT
|
|
||||||
void msgpack_unpacker_free(msgpack_unpacker* mpac);
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef MSGPACK_UNPACKER_RESERVE_SIZE
|
|
||||||
#define MSGPACK_UNPACKER_RESERVE_SIZE (32*1024)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Reserves free space of the internal buffer.
|
|
||||||
* Use this function to fill the internal buffer with
|
|
||||||
* msgpack_unpacker_buffer(msgpack_unpacker*),
|
|
||||||
* msgpack_unpacker_buffer_capacity(const msgpack_unpacker*) and
|
|
||||||
* msgpack_unpacker_buffer_consumed(msgpack_unpacker*).
|
|
||||||
*/
|
|
||||||
static inline bool msgpack_unpacker_reserve_buffer(msgpack_unpacker* mpac, size_t size);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets pointer to the free space of the internal buffer.
|
|
||||||
* Use this function to fill the internal buffer with
|
|
||||||
* msgpack_unpacker_reserve_buffer(msgpack_unpacker*, size_t),
|
|
||||||
* msgpack_unpacker_buffer_capacity(const msgpack_unpacker*) and
|
|
||||||
* msgpack_unpacker_buffer_consumed(msgpack_unpacker*).
|
|
||||||
*/
|
|
||||||
static inline char* msgpack_unpacker_buffer(msgpack_unpacker* mpac);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets size of the free space of the internal buffer.
|
|
||||||
* Use this function to fill the internal buffer with
|
|
||||||
* msgpack_unpacker_reserve_buffer(msgpack_unpacker*, size_t),
|
|
||||||
* msgpack_unpacker_buffer(const msgpack_unpacker*) and
|
|
||||||
* msgpack_unpacker_buffer_consumed(msgpack_unpacker*).
|
|
||||||
*/
|
|
||||||
static inline size_t msgpack_unpacker_buffer_capacity(const msgpack_unpacker* mpac);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Notifies the deserializer that the internal buffer filled.
|
|
||||||
* Use this function to fill the internal buffer with
|
|
||||||
* msgpack_unpacker_reserve_buffer(msgpack_unpacker*, size_t),
|
|
||||||
* msgpack_unpacker_buffer(msgpack_unpacker*) and
|
|
||||||
* msgpack_unpacker_buffer_capacity(const msgpack_unpacker*).
|
|
||||||
*/
|
|
||||||
static inline void msgpack_unpacker_buffer_consumed(msgpack_unpacker* mpac, size_t size);
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Deserializes one object.
|
|
||||||
* Returns true if it successes. Otherwise false is returned.
|
|
||||||
* @param pac pointer to an initialized msgpack_unpacked object.
|
|
||||||
*/
|
|
||||||
MSGPACK_DLLEXPORT
|
|
||||||
msgpack_unpack_return msgpack_unpacker_next(msgpack_unpacker* mpac, msgpack_unpacked* pac);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initializes a msgpack_unpacked object.
|
|
||||||
* The initialized object must be destroyed by msgpack_unpacked_destroy(msgpack_unpacker*).
|
|
||||||
* Use the object with msgpack_unpacker_next(msgpack_unpacker*, msgpack_unpacked*) or
|
|
||||||
* msgpack_unpack_next(msgpack_unpacked*, const char*, size_t, size_t*).
|
|
||||||
*/
|
|
||||||
static inline void msgpack_unpacked_init(msgpack_unpacked* result);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Destroys a streaming deserializer initialized by msgpack_unpacked().
|
|
||||||
*/
|
|
||||||
static inline void msgpack_unpacked_destroy(msgpack_unpacked* result);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Releases the memory zone from msgpack_unpacked object.
|
|
||||||
* The released zone must be freed by msgpack_zone_free(msgpack_zone*).
|
|
||||||
*/
|
|
||||||
static inline msgpack_zone* msgpack_unpacked_release_zone(msgpack_unpacked* result);
|
|
||||||
|
|
||||||
|
|
||||||
MSGPACK_DLLEXPORT
|
|
||||||
int msgpack_unpacker_execute(msgpack_unpacker* mpac);
|
|
||||||
|
|
||||||
MSGPACK_DLLEXPORT
|
|
||||||
msgpack_object msgpack_unpacker_data(msgpack_unpacker* mpac);
|
|
||||||
|
|
||||||
MSGPACK_DLLEXPORT
|
|
||||||
msgpack_zone* msgpack_unpacker_release_zone(msgpack_unpacker* mpac);
|
|
||||||
|
|
||||||
MSGPACK_DLLEXPORT
|
|
||||||
void msgpack_unpacker_reset_zone(msgpack_unpacker* mpac);
|
|
||||||
|
|
||||||
MSGPACK_DLLEXPORT
|
|
||||||
void msgpack_unpacker_reset(msgpack_unpacker* mpac);
|
|
||||||
|
|
||||||
static inline size_t msgpack_unpacker_message_size(const msgpack_unpacker* mpac);
|
|
||||||
|
|
||||||
|
|
||||||
/** @} */
|
|
||||||
|
|
||||||
|
|
||||||
// obsolete
|
|
||||||
MSGPACK_DLLEXPORT
|
|
||||||
msgpack_unpack_return
|
|
||||||
msgpack_unpack(const char* data, size_t len, size_t* off,
|
|
||||||
msgpack_zone* result_zone, msgpack_object* result);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static inline size_t msgpack_unpacker_parsed_size(const msgpack_unpacker* mpac);
|
|
||||||
|
|
||||||
MSGPACK_DLLEXPORT
|
|
||||||
bool msgpack_unpacker_flush_zone(msgpack_unpacker* mpac);
|
|
||||||
|
|
||||||
MSGPACK_DLLEXPORT
|
|
||||||
bool msgpack_unpacker_expand_buffer(msgpack_unpacker* mpac, size_t size);
|
|
||||||
|
|
||||||
static inline bool msgpack_unpacker_reserve_buffer(msgpack_unpacker* mpac, size_t size)
|
|
||||||
{
|
|
||||||
if(mpac->free >= size) { return true; }
|
|
||||||
return msgpack_unpacker_expand_buffer(mpac, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline char* msgpack_unpacker_buffer(msgpack_unpacker* mpac)
|
|
||||||
{
|
|
||||||
return mpac->buffer + mpac->used;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline size_t msgpack_unpacker_buffer_capacity(const msgpack_unpacker* mpac)
|
|
||||||
{
|
|
||||||
return mpac->free;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void msgpack_unpacker_buffer_consumed(msgpack_unpacker* mpac, size_t size)
|
|
||||||
{
|
|
||||||
mpac->used += size;
|
|
||||||
mpac->free -= size;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline size_t msgpack_unpacker_message_size(const msgpack_unpacker* mpac)
|
|
||||||
{
|
|
||||||
return mpac->parsed - mpac->off + mpac->used;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline size_t msgpack_unpacker_parsed_size(const msgpack_unpacker* mpac)
|
|
||||||
{
|
|
||||||
return mpac->parsed;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static inline void msgpack_unpacked_init(msgpack_unpacked* result)
|
|
||||||
{
|
|
||||||
memset(result, 0, sizeof(msgpack_unpacked));
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void msgpack_unpacked_destroy(msgpack_unpacked* result)
|
|
||||||
{
|
|
||||||
if(result->zone != NULL) {
|
|
||||||
msgpack_zone_free(result->zone);
|
|
||||||
result->zone = NULL;
|
|
||||||
memset(&result->data, 0, sizeof(msgpack_object));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline msgpack_zone* msgpack_unpacked_release_zone(msgpack_unpacked* result)
|
|
||||||
{
|
|
||||||
if(result->zone != NULL) {
|
|
||||||
msgpack_zone* z = result->zone;
|
|
||||||
result->zone = NULL;
|
|
||||||
return z;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* msgpack/unpack.h */
|
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,97 +0,0 @@
|
|||||||
/*
|
|
||||||
* MessagePack unpacking routine template
|
|
||||||
*
|
|
||||||
* Copyright (C) 2008-2010 FURUHASHI Sadayuki
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
#ifndef MSGPACK_UNPACK_DEFINE_H
|
|
||||||
#define MSGPACK_UNPACK_DEFINE_H
|
|
||||||
|
|
||||||
#include "msgpack/sysdep.h"
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <assert.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef MSGPACK_EMBED_STACK_SIZE
|
|
||||||
#define MSGPACK_EMBED_STACK_SIZE 32
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
MSGPACK_CS_HEADER = 0x00, // nil
|
|
||||||
|
|
||||||
//MSGPACK_CS_ = 0x01,
|
|
||||||
//MSGPACK_CS_ = 0x02, // false
|
|
||||||
//MSGPACK_CS_ = 0x03, // true
|
|
||||||
|
|
||||||
MSGPACK_CS_BIN_8 = 0x04,
|
|
||||||
MSGPACK_CS_BIN_16 = 0x05,
|
|
||||||
MSGPACK_CS_BIN_32 = 0x06,
|
|
||||||
|
|
||||||
MSGPACK_CS_EXT_8 = 0x07,
|
|
||||||
MSGPACK_CS_EXT_16 = 0x08,
|
|
||||||
MSGPACK_CS_EXT_32 = 0x09,
|
|
||||||
|
|
||||||
MSGPACK_CS_FLOAT = 0x0a,
|
|
||||||
MSGPACK_CS_DOUBLE = 0x0b,
|
|
||||||
MSGPACK_CS_UINT_8 = 0x0c,
|
|
||||||
MSGPACK_CS_UINT_16 = 0x0d,
|
|
||||||
MSGPACK_CS_UINT_32 = 0x0e,
|
|
||||||
MSGPACK_CS_UINT_64 = 0x0f,
|
|
||||||
MSGPACK_CS_INT_8 = 0x10,
|
|
||||||
MSGPACK_CS_INT_16 = 0x11,
|
|
||||||
MSGPACK_CS_INT_32 = 0x12,
|
|
||||||
MSGPACK_CS_INT_64 = 0x13,
|
|
||||||
|
|
||||||
MSGPACK_CS_FIXEXT_1 = 0x14,
|
|
||||||
MSGPACK_CS_FIXEXT_2 = 0x15,
|
|
||||||
MSGPACK_CS_FIXEXT_4 = 0x16,
|
|
||||||
MSGPACK_CS_FIXEXT_8 = 0x17,
|
|
||||||
MSGPACK_CS_FIXEXT_16 = 0x18,
|
|
||||||
|
|
||||||
MSGPACK_CS_STR_8 = 0x19, // str8
|
|
||||||
MSGPACK_CS_STR_16 = 0x1a, // str16
|
|
||||||
MSGPACK_CS_STR_32 = 0x1b, // str32
|
|
||||||
MSGPACK_CS_ARRAY_16 = 0x1c,
|
|
||||||
MSGPACK_CS_ARRAY_32 = 0x1d,
|
|
||||||
MSGPACK_CS_MAP_16 = 0x1e,
|
|
||||||
MSGPACK_CS_MAP_32 = 0x1f,
|
|
||||||
|
|
||||||
//MSGPACK_ACS_BIG_INT_VALUE,
|
|
||||||
//MSGPACK_ACS_BIG_FLOAT_VALUE,
|
|
||||||
MSGPACK_ACS_STR_VALUE,
|
|
||||||
MSGPACK_ACS_BIN_VALUE,
|
|
||||||
MSGPACK_ACS_EXT_VALUE
|
|
||||||
} msgpack_unpack_state;
|
|
||||||
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
MSGPACK_CT_ARRAY_ITEM,
|
|
||||||
MSGPACK_CT_MAP_KEY,
|
|
||||||
MSGPACK_CT_MAP_VALUE
|
|
||||||
} msgpack_container_type;
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* msgpack/unpack_define.h */
|
|
||||||
|
|
||||||
@@ -1,480 +0,0 @@
|
|||||||
/*
|
|
||||||
* MessagePack unpacking routine template
|
|
||||||
*
|
|
||||||
* Copyright (C) 2008-2010 FURUHASHI Sadayuki
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef msgpack_unpack_func
|
|
||||||
#error msgpack_unpack_func template is not defined
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef msgpack_unpack_callback
|
|
||||||
#error msgpack_unpack_callback template is not defined
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef msgpack_unpack_struct
|
|
||||||
#error msgpack_unpack_struct template is not defined
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef msgpack_unpack_struct_decl
|
|
||||||
#define msgpack_unpack_struct_decl(name) msgpack_unpack_struct(name)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef msgpack_unpack_object
|
|
||||||
#error msgpack_unpack_object type is not defined
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef msgpack_unpack_user
|
|
||||||
#error msgpack_unpack_user type is not defined
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef USE_CASE_RANGE
|
|
||||||
#if !defined(_MSC_VER)
|
|
||||||
#define USE_CASE_RANGE
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
msgpack_unpack_struct_decl(_stack) {
|
|
||||||
msgpack_unpack_object obj;
|
|
||||||
size_t count;
|
|
||||||
unsigned int ct;
|
|
||||||
msgpack_unpack_object map_key;
|
|
||||||
};
|
|
||||||
|
|
||||||
msgpack_unpack_struct_decl(_context) {
|
|
||||||
msgpack_unpack_user user;
|
|
||||||
unsigned int cs;
|
|
||||||
unsigned int trail;
|
|
||||||
unsigned int top;
|
|
||||||
/*
|
|
||||||
msgpack_unpack_struct(_stack)* stack;
|
|
||||||
unsigned int stack_size;
|
|
||||||
msgpack_unpack_struct(_stack) embed_stack[MSGPACK_EMBED_STACK_SIZE];
|
|
||||||
*/
|
|
||||||
msgpack_unpack_struct(_stack) stack[MSGPACK_EMBED_STACK_SIZE];
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
msgpack_unpack_func(void, _init)(msgpack_unpack_struct(_context)* ctx)
|
|
||||||
{
|
|
||||||
ctx->cs = MSGPACK_CS_HEADER;
|
|
||||||
ctx->trail = 0;
|
|
||||||
ctx->top = 0;
|
|
||||||
/*
|
|
||||||
ctx->stack = ctx->embed_stack;
|
|
||||||
ctx->stack_size = MSGPACK_EMBED_STACK_SIZE;
|
|
||||||
*/
|
|
||||||
ctx->stack[0].obj = msgpack_unpack_callback(_root)(&ctx->user);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
msgpack_unpack_func(void, _destroy)(msgpack_unpack_struct(_context)* ctx)
|
|
||||||
{
|
|
||||||
if(ctx->stack_size != MSGPACK_EMBED_STACK_SIZE) {
|
|
||||||
free(ctx->stack);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
msgpack_unpack_func(msgpack_unpack_object, _data)(msgpack_unpack_struct(_context)* ctx)
|
|
||||||
{
|
|
||||||
return (ctx)->stack[0].obj;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
msgpack_unpack_func(int, _execute)(msgpack_unpack_struct(_context)* ctx, const char* data, size_t len, size_t* off)
|
|
||||||
{
|
|
||||||
assert(len >= *off);
|
|
||||||
{
|
|
||||||
const unsigned char* p = (unsigned char*)data + *off;
|
|
||||||
const unsigned char* const pe = (unsigned char*)data + len;
|
|
||||||
const void* n = NULL;
|
|
||||||
|
|
||||||
unsigned int trail = ctx->trail;
|
|
||||||
unsigned int cs = ctx->cs;
|
|
||||||
unsigned int top = ctx->top;
|
|
||||||
msgpack_unpack_struct(_stack)* stack = ctx->stack;
|
|
||||||
/*
|
|
||||||
unsigned int stack_size = ctx->stack_size;
|
|
||||||
*/
|
|
||||||
msgpack_unpack_user* user = &ctx->user;
|
|
||||||
|
|
||||||
msgpack_unpack_object obj;
|
|
||||||
msgpack_unpack_struct(_stack)* c = NULL;
|
|
||||||
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
#define push_simple_value(func) \
|
|
||||||
if(msgpack_unpack_callback(func)(user, &obj) < 0) { goto _failed; } \
|
|
||||||
goto _push
|
|
||||||
#define push_fixed_value(func, arg) \
|
|
||||||
if(msgpack_unpack_callback(func)(user, arg, &obj) < 0) { goto _failed; } \
|
|
||||||
goto _push
|
|
||||||
#define push_variable_value(func, base, pos, len) \
|
|
||||||
if(msgpack_unpack_callback(func)(user, \
|
|
||||||
(const char*)base, (const char*)pos, len, &obj) < 0) { goto _failed; } \
|
|
||||||
goto _push
|
|
||||||
|
|
||||||
#define again_fixed_trail(_cs, trail_len) \
|
|
||||||
trail = trail_len; \
|
|
||||||
cs = _cs; \
|
|
||||||
goto _fixed_trail_again
|
|
||||||
#define again_fixed_trail_if_zero(_cs, trail_len, ifzero) \
|
|
||||||
trail = trail_len; \
|
|
||||||
if(trail == 0) { goto ifzero; } \
|
|
||||||
cs = _cs; \
|
|
||||||
goto _fixed_trail_again
|
|
||||||
|
|
||||||
#define start_container(func, count_, ct_) \
|
|
||||||
if(top >= MSGPACK_EMBED_STACK_SIZE) { goto _failed; } /* FIXME */ \
|
|
||||||
if(msgpack_unpack_callback(func)(user, count_, &stack[top].obj) < 0) { goto _failed; } \
|
|
||||||
if((count_) == 0) { obj = stack[top].obj; goto _push; } \
|
|
||||||
stack[top].ct = ct_; \
|
|
||||||
stack[top].count = count_; \
|
|
||||||
++top; \
|
|
||||||
/*printf("container %d count %d stack %d\n",stack[top].obj,count_,top);*/ \
|
|
||||||
/*printf("stack push %d\n", top);*/ \
|
|
||||||
/* FIXME \
|
|
||||||
if(top >= stack_size) { \
|
|
||||||
if(stack_size == MSGPACK_EMBED_STACK_SIZE) { \
|
|
||||||
size_t csize = sizeof(msgpack_unpack_struct(_stack)) * MSGPACK_EMBED_STACK_SIZE; \
|
|
||||||
size_t nsize = csize * 2; \
|
|
||||||
msgpack_unpack_struct(_stack)* tmp = (msgpack_unpack_struct(_stack)*)malloc(nsize); \
|
|
||||||
if(tmp == NULL) { goto _failed; } \
|
|
||||||
memcpy(tmp, ctx->stack, csize); \
|
|
||||||
ctx->stack = stack = tmp; \
|
|
||||||
ctx->stack_size = stack_size = MSGPACK_EMBED_STACK_SIZE * 2; \
|
|
||||||
} else { \
|
|
||||||
size_t nsize = sizeof(msgpack_unpack_struct(_stack)) * ctx->stack_size * 2; \
|
|
||||||
msgpack_unpack_struct(_stack)* tmp = (msgpack_unpack_struct(_stack)*)realloc(ctx->stack, nsize); \
|
|
||||||
if(tmp == NULL) { goto _failed; } \
|
|
||||||
ctx->stack = stack = tmp; \
|
|
||||||
ctx->stack_size = stack_size = stack_size * 2; \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
*/ \
|
|
||||||
goto _header_again
|
|
||||||
|
|
||||||
#define NEXT_CS(p) \
|
|
||||||
((unsigned int)*p & 0x1f)
|
|
||||||
|
|
||||||
#ifdef USE_CASE_RANGE
|
|
||||||
#define SWITCH_RANGE_BEGIN switch(*p) {
|
|
||||||
#define SWITCH_RANGE(FROM, TO) case FROM ... TO:
|
|
||||||
#define SWITCH_RANGE_DEFAULT default:
|
|
||||||
#define SWITCH_RANGE_END }
|
|
||||||
#else
|
|
||||||
#define SWITCH_RANGE_BEGIN { if(0) {
|
|
||||||
#define SWITCH_RANGE(FROM, TO) } else if(FROM <= *p && *p <= TO) {
|
|
||||||
#define SWITCH_RANGE_DEFAULT } else {
|
|
||||||
#define SWITCH_RANGE_END } }
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if(p == pe) { goto _out; }
|
|
||||||
do {
|
|
||||||
switch(cs) {
|
|
||||||
case MSGPACK_CS_HEADER:
|
|
||||||
SWITCH_RANGE_BEGIN
|
|
||||||
SWITCH_RANGE(0x00, 0x7f) // Positive Fixnum
|
|
||||||
push_fixed_value(_uint8, *(uint8_t*)p);
|
|
||||||
SWITCH_RANGE(0xe0, 0xff) // Negative Fixnum
|
|
||||||
push_fixed_value(_int8, *(int8_t*)p);
|
|
||||||
SWITCH_RANGE(0xc0, 0xdf) // Variable
|
|
||||||
switch(*p) {
|
|
||||||
case 0xc0: // nil
|
|
||||||
push_simple_value(_nil);
|
|
||||||
//case 0xc1: // string
|
|
||||||
// again_terminal_trail(NEXT_CS(p), p+1);
|
|
||||||
case 0xc2: // false
|
|
||||||
push_simple_value(_false);
|
|
||||||
case 0xc3: // true
|
|
||||||
push_simple_value(_true);
|
|
||||||
case 0xc4: // bin 8
|
|
||||||
case 0xc5: // bin 16
|
|
||||||
case 0xc6: // bin 32
|
|
||||||
again_fixed_trail(NEXT_CS(p), 1 << (((unsigned int)*p) & 0x03));
|
|
||||||
case 0xc7: // ext 8
|
|
||||||
case 0xc8: // ext 16
|
|
||||||
case 0xc9: // ext 32
|
|
||||||
again_fixed_trail(NEXT_CS(p), 1 << ((((unsigned int)*p) + 1) & 0x03));
|
|
||||||
case 0xca: // float
|
|
||||||
case 0xcb: // double
|
|
||||||
case 0xcc: // unsigned int 8
|
|
||||||
case 0xcd: // unsigned int 16
|
|
||||||
case 0xce: // unsigned int 32
|
|
||||||
case 0xcf: // unsigned int 64
|
|
||||||
case 0xd0: // signed int 8
|
|
||||||
case 0xd1: // signed int 16
|
|
||||||
case 0xd2: // signed int 32
|
|
||||||
case 0xd3: // signed int 64
|
|
||||||
again_fixed_trail(NEXT_CS(p), 1 << (((unsigned int)*p) & 0x03));
|
|
||||||
case 0xd4: // fixext 1
|
|
||||||
case 0xd5: // fixext 2
|
|
||||||
case 0xd6: // fixext 4
|
|
||||||
case 0xd7: // fixext 8
|
|
||||||
again_fixed_trail_if_zero(MSGPACK_ACS_EXT_VALUE,
|
|
||||||
(1 << (((unsigned int)*p) & 0x03)) + 1, _ext_zero);
|
|
||||||
case 0xd8: // fixext 16
|
|
||||||
again_fixed_trail_if_zero(MSGPACK_ACS_EXT_VALUE, 16+1, _ext_zero);
|
|
||||||
|
|
||||||
case 0xd9: // str 8
|
|
||||||
case 0xda: // str 16
|
|
||||||
case 0xdb: // str 32
|
|
||||||
again_fixed_trail(NEXT_CS(p), 1 << ((((unsigned int)*p) & 0x03) - 1));
|
|
||||||
case 0xdc: // array 16
|
|
||||||
case 0xdd: // array 32
|
|
||||||
case 0xde: // map 16
|
|
||||||
case 0xdf: // map 32
|
|
||||||
again_fixed_trail(NEXT_CS(p), 2u << (((unsigned int)*p) & 0x01));
|
|
||||||
default:
|
|
||||||
goto _failed;
|
|
||||||
}
|
|
||||||
SWITCH_RANGE(0xa0, 0xbf) // FixStr
|
|
||||||
again_fixed_trail_if_zero(MSGPACK_ACS_STR_VALUE, ((unsigned int)*p & 0x1f), _str_zero);
|
|
||||||
SWITCH_RANGE(0x90, 0x9f) // FixArray
|
|
||||||
start_container(_array, ((unsigned int)*p) & 0x0f, MSGPACK_CT_ARRAY_ITEM);
|
|
||||||
SWITCH_RANGE(0x80, 0x8f) // FixMap
|
|
||||||
start_container(_map, ((unsigned int)*p) & 0x0f, MSGPACK_CT_MAP_KEY);
|
|
||||||
|
|
||||||
SWITCH_RANGE_DEFAULT
|
|
||||||
goto _failed;
|
|
||||||
SWITCH_RANGE_END
|
|
||||||
// end MSGPACK_CS_HEADER
|
|
||||||
|
|
||||||
|
|
||||||
_fixed_trail_again:
|
|
||||||
++p;
|
|
||||||
|
|
||||||
default:
|
|
||||||
if((size_t)(pe - p) < trail) { goto _out; }
|
|
||||||
n = p; p += trail - 1;
|
|
||||||
switch(cs) {
|
|
||||||
//case MSGPACK_CS_
|
|
||||||
//case MSGPACK_CS_
|
|
||||||
case MSGPACK_CS_FLOAT: {
|
|
||||||
union { uint32_t i; float f; } mem;
|
|
||||||
_msgpack_load32(uint32_t, n, &mem.i);
|
|
||||||
push_fixed_value(_float, mem.f); }
|
|
||||||
case MSGPACK_CS_DOUBLE: {
|
|
||||||
union { uint64_t i; double f; } mem;
|
|
||||||
_msgpack_load64(uint64_t, n, &mem.i);
|
|
||||||
#if defined(__arm__) && !(__ARM_EABI__) // arm-oabi
|
|
||||||
// https://github.com/msgpack/msgpack-perl/pull/1
|
|
||||||
mem.i = (mem.i & 0xFFFFFFFFUL) << 32UL | (mem.i >> 32UL);
|
|
||||||
#endif
|
|
||||||
push_fixed_value(_double, mem.f); }
|
|
||||||
case MSGPACK_CS_UINT_8:
|
|
||||||
push_fixed_value(_uint8, *(uint8_t*)n);
|
|
||||||
case MSGPACK_CS_UINT_16:{
|
|
||||||
uint16_t tmp;
|
|
||||||
_msgpack_load16(uint16_t,n,&tmp);
|
|
||||||
push_fixed_value(_uint16, tmp);
|
|
||||||
}
|
|
||||||
case MSGPACK_CS_UINT_32:{
|
|
||||||
uint32_t tmp;
|
|
||||||
_msgpack_load32(uint32_t,n,&tmp);
|
|
||||||
push_fixed_value(_uint32, tmp);
|
|
||||||
}
|
|
||||||
case MSGPACK_CS_UINT_64:{
|
|
||||||
uint64_t tmp;
|
|
||||||
_msgpack_load64(uint64_t,n,&tmp);
|
|
||||||
push_fixed_value(_uint64, tmp);
|
|
||||||
}
|
|
||||||
case MSGPACK_CS_INT_8:
|
|
||||||
push_fixed_value(_int8, *(int8_t*)n);
|
|
||||||
case MSGPACK_CS_INT_16:{
|
|
||||||
int16_t tmp;
|
|
||||||
_msgpack_load16(int16_t,n,&tmp);
|
|
||||||
push_fixed_value(_int16, tmp);
|
|
||||||
}
|
|
||||||
case MSGPACK_CS_INT_32:{
|
|
||||||
int32_t tmp;
|
|
||||||
_msgpack_load32(int32_t,n,&tmp);
|
|
||||||
push_fixed_value(_int32, tmp);
|
|
||||||
}
|
|
||||||
case MSGPACK_CS_INT_64:{
|
|
||||||
int64_t tmp;
|
|
||||||
_msgpack_load64(int64_t,n,&tmp);
|
|
||||||
push_fixed_value(_int64, tmp);
|
|
||||||
}
|
|
||||||
case MSGPACK_CS_FIXEXT_1:
|
|
||||||
again_fixed_trail_if_zero(MSGPACK_ACS_EXT_VALUE, 1+1, _ext_zero);
|
|
||||||
case MSGPACK_CS_FIXEXT_2:
|
|
||||||
again_fixed_trail_if_zero(MSGPACK_ACS_EXT_VALUE, 2+1, _ext_zero);
|
|
||||||
case MSGPACK_CS_FIXEXT_4:
|
|
||||||
again_fixed_trail_if_zero(MSGPACK_ACS_EXT_VALUE, 4+1, _ext_zero);
|
|
||||||
case MSGPACK_CS_FIXEXT_8:
|
|
||||||
again_fixed_trail_if_zero(MSGPACK_ACS_EXT_VALUE, 8+1, _ext_zero);
|
|
||||||
case MSGPACK_CS_FIXEXT_16:
|
|
||||||
again_fixed_trail_if_zero(MSGPACK_ACS_EXT_VALUE, 16+1, _ext_zero);
|
|
||||||
case MSGPACK_CS_STR_8:
|
|
||||||
again_fixed_trail_if_zero(MSGPACK_ACS_STR_VALUE, *(uint8_t*)n, _str_zero);
|
|
||||||
case MSGPACK_CS_BIN_8:
|
|
||||||
again_fixed_trail_if_zero(MSGPACK_ACS_BIN_VALUE, *(uint8_t*)n, _bin_zero);
|
|
||||||
case MSGPACK_CS_EXT_8:
|
|
||||||
again_fixed_trail_if_zero(MSGPACK_ACS_EXT_VALUE, (*(uint8_t*)n) + 1, _ext_zero);
|
|
||||||
case MSGPACK_CS_STR_16:{
|
|
||||||
uint16_t tmp;
|
|
||||||
_msgpack_load16(uint16_t,n,&tmp);
|
|
||||||
again_fixed_trail_if_zero(MSGPACK_ACS_STR_VALUE, tmp, _str_zero);
|
|
||||||
}
|
|
||||||
case MSGPACK_CS_BIN_16:{
|
|
||||||
uint16_t tmp;
|
|
||||||
_msgpack_load16(uint16_t,n,&tmp);
|
|
||||||
again_fixed_trail_if_zero(MSGPACK_ACS_BIN_VALUE, tmp, _bin_zero);
|
|
||||||
}
|
|
||||||
case MSGPACK_CS_EXT_16:{
|
|
||||||
uint16_t tmp;
|
|
||||||
_msgpack_load16(uint16_t,n,&tmp);
|
|
||||||
again_fixed_trail_if_zero(MSGPACK_ACS_EXT_VALUE, tmp + 1, _ext_zero);
|
|
||||||
}
|
|
||||||
case MSGPACK_CS_STR_32:{
|
|
||||||
uint32_t tmp;
|
|
||||||
_msgpack_load32(uint32_t,n,&tmp);
|
|
||||||
again_fixed_trail_if_zero(MSGPACK_ACS_STR_VALUE, tmp, _str_zero);
|
|
||||||
}
|
|
||||||
case MSGPACK_CS_BIN_32:{
|
|
||||||
uint32_t tmp;
|
|
||||||
_msgpack_load32(uint32_t,n,&tmp);
|
|
||||||
again_fixed_trail_if_zero(MSGPACK_ACS_BIN_VALUE, tmp, _bin_zero);
|
|
||||||
}
|
|
||||||
case MSGPACK_CS_EXT_32:{
|
|
||||||
uint32_t tmp;
|
|
||||||
_msgpack_load32(uint32_t,n,&tmp);
|
|
||||||
again_fixed_trail_if_zero(MSGPACK_ACS_EXT_VALUE, tmp + 1, _ext_zero);
|
|
||||||
}
|
|
||||||
case MSGPACK_ACS_STR_VALUE:
|
|
||||||
_str_zero:
|
|
||||||
push_variable_value(_str, data, n, trail);
|
|
||||||
case MSGPACK_ACS_BIN_VALUE:
|
|
||||||
_bin_zero:
|
|
||||||
push_variable_value(_bin, data, n, trail);
|
|
||||||
case MSGPACK_ACS_EXT_VALUE:
|
|
||||||
_ext_zero:
|
|
||||||
push_variable_value(_ext, data, n, trail);
|
|
||||||
|
|
||||||
case MSGPACK_CS_ARRAY_16:{
|
|
||||||
uint16_t tmp;
|
|
||||||
_msgpack_load16(uint16_t,n,&tmp);
|
|
||||||
start_container(_array, tmp, MSGPACK_CT_ARRAY_ITEM);
|
|
||||||
}
|
|
||||||
case MSGPACK_CS_ARRAY_32:{
|
|
||||||
/* FIXME security guard */
|
|
||||||
uint32_t tmp;
|
|
||||||
_msgpack_load32(uint32_t,n,&tmp);
|
|
||||||
start_container(_array, tmp, MSGPACK_CT_ARRAY_ITEM);
|
|
||||||
}
|
|
||||||
|
|
||||||
case MSGPACK_CS_MAP_16:{
|
|
||||||
uint16_t tmp;
|
|
||||||
_msgpack_load16(uint16_t,n,&tmp);
|
|
||||||
start_container(_map, tmp, MSGPACK_CT_MAP_KEY);
|
|
||||||
}
|
|
||||||
case MSGPACK_CS_MAP_32:{
|
|
||||||
/* FIXME security guard */
|
|
||||||
uint32_t tmp;
|
|
||||||
_msgpack_load32(uint32_t,n,&tmp);
|
|
||||||
start_container(_map, tmp, MSGPACK_CT_MAP_KEY);
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
|
||||||
goto _failed;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_push:
|
|
||||||
if(top == 0) { goto _finish; }
|
|
||||||
c = &stack[top-1];
|
|
||||||
switch(c->ct) {
|
|
||||||
case MSGPACK_CT_ARRAY_ITEM:
|
|
||||||
if(msgpack_unpack_callback(_array_item)(user, &c->obj, obj) < 0) { goto _failed; }
|
|
||||||
if(--c->count == 0) {
|
|
||||||
obj = c->obj;
|
|
||||||
--top;
|
|
||||||
/*printf("stack pop %d\n", top);*/
|
|
||||||
goto _push;
|
|
||||||
}
|
|
||||||
goto _header_again;
|
|
||||||
case MSGPACK_CT_MAP_KEY:
|
|
||||||
c->map_key = obj;
|
|
||||||
c->ct = MSGPACK_CT_MAP_VALUE;
|
|
||||||
goto _header_again;
|
|
||||||
case MSGPACK_CT_MAP_VALUE:
|
|
||||||
if(msgpack_unpack_callback(_map_item)(user, &c->obj, c->map_key, obj) < 0) { goto _failed; }
|
|
||||||
if(--c->count == 0) {
|
|
||||||
obj = c->obj;
|
|
||||||
--top;
|
|
||||||
/*printf("stack pop %d\n", top);*/
|
|
||||||
goto _push;
|
|
||||||
}
|
|
||||||
c->ct = MSGPACK_CT_MAP_KEY;
|
|
||||||
goto _header_again;
|
|
||||||
|
|
||||||
default:
|
|
||||||
goto _failed;
|
|
||||||
}
|
|
||||||
|
|
||||||
_header_again:
|
|
||||||
cs = MSGPACK_CS_HEADER;
|
|
||||||
++p;
|
|
||||||
} while(p != pe);
|
|
||||||
goto _out;
|
|
||||||
|
|
||||||
|
|
||||||
_finish:
|
|
||||||
stack[0].obj = obj;
|
|
||||||
++p;
|
|
||||||
ret = 1;
|
|
||||||
/*printf("-- finish --\n"); */
|
|
||||||
goto _end;
|
|
||||||
|
|
||||||
_failed:
|
|
||||||
/*printf("** FAILED **\n"); */
|
|
||||||
ret = -1;
|
|
||||||
goto _end;
|
|
||||||
|
|
||||||
_out:
|
|
||||||
ret = 0;
|
|
||||||
goto _end;
|
|
||||||
|
|
||||||
_end:
|
|
||||||
ctx->cs = cs;
|
|
||||||
ctx->trail = trail;
|
|
||||||
ctx->top = top;
|
|
||||||
*off = (size_t)(p - (const unsigned char*)data);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef msgpack_unpack_func
|
|
||||||
#undef msgpack_unpack_callback
|
|
||||||
#undef msgpack_unpack_struct
|
|
||||||
#undef msgpack_unpack_object
|
|
||||||
#undef msgpack_unpack_user
|
|
||||||
|
|
||||||
#undef push_simple_value
|
|
||||||
#undef push_fixed_value
|
|
||||||
#undef push_variable_value
|
|
||||||
#undef again_fixed_trail
|
|
||||||
#undef again_fixed_trail_if_zero
|
|
||||||
#undef start_container
|
|
||||||
|
|
||||||
#undef NEXT_CS
|
|
||||||
|
|
||||||
#undef SWITCH_RANGE_BEGIN
|
|
||||||
#undef SWITCH_RANGE
|
|
||||||
#undef SWITCH_RANGE_DEFAULT
|
|
||||||
#undef SWITCH_RANGE_END
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
/*
|
|
||||||
* MessagePack for C utilities
|
|
||||||
*
|
|
||||||
* Copyright (C) 2014 FURUHASHI Sadayuki
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
#ifndef MSGPACK_UTIL_H
|
|
||||||
#define MSGPACK_UTIL_H
|
|
||||||
|
|
||||||
#define MSGPACK_UNUSED(a) (void)(a)
|
|
||||||
|
|
||||||
#endif /* MSGPACK_UTIL_H */
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
/*
|
|
||||||
* MessagePack for C version information
|
|
||||||
*
|
|
||||||
* Copyright (C) 2008-2009 FURUHASHI Sadayuki
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
#ifndef MSGPACK_VERSION_H
|
|
||||||
#define MSGPACK_VERSION_H
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
MSGPACK_DLLEXPORT
|
|
||||||
const char* msgpack_version(void);
|
|
||||||
MSGPACK_DLLEXPORT
|
|
||||||
int msgpack_version_major(void);
|
|
||||||
MSGPACK_DLLEXPORT
|
|
||||||
int msgpack_version_minor(void);
|
|
||||||
MSGPACK_DLLEXPORT
|
|
||||||
int msgpack_version_revision(void);
|
|
||||||
|
|
||||||
#include "version_master.h"
|
|
||||||
|
|
||||||
#define MSGPACK_STR(v) #v
|
|
||||||
#define MSGPACK_VERSION_I(maj, min, rev) MSGPACK_STR(maj) "." MSGPACK_STR(min) "." MSGPACK_STR(rev)
|
|
||||||
|
|
||||||
#define MSGPACK_VERSION MSGPACK_VERSION_I(MSGPACK_VERSION_MAJOR, MSGPACK_VERSION_MINOR, MSGPACK_VERSION_REVISION)
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* msgpack/version.h */
|
|
||||||
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user