mirror of
				https://github.com/msgpack/msgpack-c.git
				synced 2025-10-22 08:02:08 +02:00 
			
		
		
		
	Compare commits
	
		
			1354 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 953077b73f | ||
|   | ba15089d86 | ||
|   | b76c8aeb83 | ||
|   | b5599ef3fc | ||
|   | 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 | ||
|   | a277ea7c64 | ||
|   | 285ccfeeea | ||
|   | 232b8039a0 | ||
|   | 10a315e00e | ||
|   | 904dd65965 | ||
|   | dff7af2075 | ||
|   | ed91c18af8 | ||
|   | 616b1d8fb0 | ||
|   | ce98964348 | ||
|   | 07a509a53a | ||
|   | 35483b95ae | ||
|   | a2c8154960 | ||
|   | e8d3c8d6c5 | ||
|   | ae5734e8d1 | ||
|   | 6ec09053b1 | ||
|   | 5401660b07 | ||
|   | f3caa8e160 | ||
|   | 8921f9dcfc | ||
|   | 1911513acb | ||
|   | 7bee573a72 | ||
|   | 5568abb6ab | ||
|   | 67486480ac | ||
|   | 0e3bb789b8 | ||
|   | e1eabbfebf | ||
|   | e416b534b8 | ||
|   | 212ef8eb2b | ||
|   | 7bf06a5885 | ||
|   | 1822523289 | ||
|   | 156a4403ab | ||
|   | ad5da7f131 | ||
|   | 62be3f1212 | ||
|   | 8dbe25a51d | ||
|   | 7cfd4bb1d8 | ||
|   | 037a108c49 | ||
|   | 79a127a8b6 | ||
|   | ace27f6238 | ||
|   | cc2ded6338 | ||
|   | 13a746f6fa | ||
|   | b0ff2802d2 | ||
|   | 4b0c90fc90 | ||
|   | 4b11fb32cd | ||
|   | f707c6b47c | ||
|   | 081ee0e99a | ||
|   | 8eaa2e9e74 | ||
|   | ac1eb6e1d3 | ||
|   | 343ceabe9a | ||
|   | eb765d21f2 | ||
|   | 2d5c68055c | ||
|   | de68fbd6d0 | ||
|   | 118cf7270c | ||
|   | cf1487f8ba | ||
|   | e4cd479bf3 | ||
|   | 8dae63e4c1 | ||
|   | a3f350842c | ||
|   | c1e9f92d7f | ||
|   | 582fe38e78 | ||
|   | 6443738f66 | ||
|   | 45eb2ad0c7 | ||
|   | 37593400c3 | ||
|   | 60648fc3a8 | ||
|   | 0482e4fcd1 | ||
|   | 82a10cba5c | ||
|   | 0d9a21ea08 | ||
|   | f399ec8c30 | ||
|   | 8ad9ce059b | ||
|   | a4aa14d1e2 | ||
|   | f7f2d4b990 | ||
|   | c675881f3b | ||
|   | f6d0cd9a4b | ||
|   | 4ef5894856 | ||
|   | 07ddfa1430 | ||
|   | 252d66a4b2 | ||
|   | b4eba4ba09 | ||
|   | 2266505eed | ||
|   | 46e2398e02 | ||
|   | 3662a17e81 | ||
|   | 66f221d088 | ||
|   | 9ed4e443fb | ||
|   | 15aec0493d | ||
|   | d6a7bd1995 | ||
|   | ff86d61799 | ||
|   | 97886c50e7 | ||
|   | 327b0db626 | ||
|   | 994144dac2 | ||
|   | 023f81ae9c | ||
|   | 83fac26762 | ||
|   | 213ba44b65 | ||
|   | fa231139d7 | ||
|   | 5cd1c6bfa1 | ||
|   | c4fb47c00d | ||
|   | 70e50d9679 | ||
|   | 978e6b9057 | ||
|   | 571f1a27a2 | ||
|   | c3518c0666 | ||
|   | 64ac09c492 | ||
|   | 414da4e8c6 | ||
|   | 3eadb124fc | ||
|   | fd9eb26688 | ||
|   | 6c59e5195a | ||
|   | 3bdf646cc6 | ||
|   | 2bbf10a324 | ||
|   | 737e6703df | ||
|   | 7f48ddc85e | ||
|   | a84f444ce2 | ||
|   | 7e597779e4 | ||
|   | bf8c830eef | ||
|   | 5f52ec5030 | ||
|   | c71ce9eb49 | ||
|   | f105b4bbb0 | ||
|   | f64be3b2d0 | ||
|   | abac9fe90a | ||
|   | 5798fa0e47 | ||
|   | fe4af1125d | ||
|   | ce96ca8bfc | ||
|   | 57732f0c1b | ||
|   | 7ccef5b787 | ||
|   | 1a116fb644 | ||
|   | f79fd82953 | ||
|   | b9a80697bc | ||
|   | 467822c97a | ||
|   | 7ab7eaf61b | ||
|   | 3ed6b673d4 | ||
|   | 469040be6b | ||
|   | 309e96087a | ||
|   | 2d61fdf865 | ||
|   | 6e560e345a | ||
|   | 8b796dc788 | ||
|   | 240b02174d | ||
|   | 38a380684e | ||
|   | 1a615af437 | ||
|   | 9162610682 | ||
|   | c52a58b322 | ||
|   | ac3433f5dd | ||
|   | dab725624e | ||
|   | 037b1c22dc | ||
|   | 0de0b434b3 | ||
|   | 7eb3d2aa59 | ||
|   | 0827d08cd7 | ||
|   | 3d20ec6f21 | ||
|   | bcdbf78542 | ||
|   | a4af97b32c | ||
|   | e00b299fe0 | ||
|   | d6cc5494a9 | ||
|   | 96c688708c | ||
|   | 79e7a9810c | ||
|   | a0ae0289dc | ||
|   | 31a3d34b49 | ||
|   | 1c54d804f5 | ||
|   | 111efdf50f | ||
|   | dac8f6290d | ||
|   | 3bfd142660 | ||
|   | d031162d96 | ||
|   | 8e24d9206a | ||
|   | b78b49a7bd | ||
|   | 561e9ba105 | ||
|   | 6e84266043 | ||
|   | 151c92d08d | ||
|   | 1285470c21 | ||
|   | 837c5ecfc3 | ||
|   | 04aa309f24 | ||
|   | 69b2ea4002 | ||
|   | 8ddc219365 | ||
|   | a9cf916b82 | ||
|   | 8455a2eb70 | ||
|   | 5c0f1db25c | ||
|   | 466986b519 | ||
|   | a6aac482dd | ||
|   | bb984d3445 | ||
|   | f8e2766d28 | ||
|   | 2d5d12f9a6 | ||
|   | 11a2a1b8ec | ||
|   | b5e66150e9 | ||
|   | e21e3245db | ||
|   | 07e7ad6b7e | ||
|   | 44b524529d | ||
|   | fc65bc0682 | ||
|   | ca12e6d39d | ||
|   | db8578a62b | ||
|   | 4a292193f2 | ||
|   | 1e7fbc0349 | ||
|   | 479d50bd93 | ||
|   | 982787865f | ||
|   | bf4a57da34 | ||
|   | 2fcbe6116d | ||
|   | 4c00f448aa | ||
|   | 3ddeb08e6e | ||
|   | 0176dd760a | ||
|   | d30548af3f | ||
|   | ab12b2b2b9 | ||
|   | 7ce69a362f | ||
|   | cc08146b1c | ||
|   | 6896cc602f | ||
|   | d8f366daf2 | ||
|   | ef649009e4 | ||
|   | cd03ab62f8 | ||
|   | 44e41efa0c | ||
|   | ecf4b09acd | ||
|   | d6122b4a18 | ||
|   | 4fcb4777f3 | ||
|   | 03ed30ce03 | ||
|   | 6e810df2a4 | ||
|   | 847a7852e5 | ||
|   | e265beef91 | ||
|   | 0335df55e1 | ||
|   | dd4043a616 | ||
|   | 6a8412d6de | ||
|   | 7491c1996a | ||
|   | 0ab14b4138 | ||
|   | 6e77c6df11 | ||
|   | bcc91d78e9 | ||
|   | 32b65dba47 | ||
|   | aa75e6ecd3 | ||
|   | dc679a2572 | ||
|   | b6bc7f7ecb | ||
|   | 896dead7cc | ||
|   | dfa277a9e0 | ||
|   | 501260eb54 | ||
|   | 370a9251f5 | ||
|   | 7737f1cb77 | ||
|   | f72022037c | ||
|   | 865528f778 | ||
|   | d54048eabe | ||
|   | 103a6c56e4 | ||
|   | 11f1d5fbbd | ||
|   | 7ebdb63131 | ||
|   | a186725213 | ||
|   | 8615358515 | ||
|   | 86ad026f11 | ||
|   | 93d0f0bd00 | ||
|   | a0f5392876 | ||
|   | 5896ff3746 | ||
|   | d15e49cb73 | ||
|   | 2103c12e05 | ||
|   | f0a12a23a1 | ||
|   | 30b946ee85 | ||
|   | a388000d47 | ||
|   | 4c888294b5 | ||
|   | 68bf4acb4b | ||
|   | 2c2df64427 | ||
|   | 4d6e9d6c05 | ||
|   | f969f6f39c | ||
|   | 8920c49597 | ||
|   | e18102d16f | ||
|   | ea23bf843e | ||
|   | e217e72c22 | ||
|   | 0bc4b3f599 | ||
|   | b2f5893669 | ||
|   | 9a1ccaf155 | ||
|   | 0201c21b9a | ||
|   | dee68403df | ||
|   | 0a99b9f933 | ||
|   | 17e696fc0d | ||
|   | b5b459cfca | ||
|   | 7822bc787d | ||
|   | 1f5d6b9cac | ||
|   | ce21ab0ebf | ||
|   | 5af6d36341 | ||
|   | 15a0d61a64 | ||
|   | 66014eebc0 | ||
|   | fd566afeb4 | ||
|   | e4d32b176e | ||
|   | b27c87c9ed | ||
|   | 3729f334a1 | ||
|   | 55bf279a7c | ||
|   | 78e8cbdfb5 | ||
|   | dd083ca933 | ||
|   | 23d670f3bd | ||
|   | 6fab3594a2 | ||
|   | 421aeb5021 | ||
|   | 47f4ffe9f3 | ||
|   | 09325ed846 | ||
|   | bfa428ab13 | ||
|   | ecdeec9948 | ||
|   | f11a811114 | ||
|   | c203928fae | ||
|   | 59b111e026 | ||
|   | 2a694f8c20 | ||
|   | 0380215982 | ||
|   | 0e48f65a4b | ||
|   | aa79fc2ff4 | ||
|   | cc571b8bb1 | ||
|   | b0df21295c | ||
|   | 0889e6117e | ||
|   | 212f025f00 | ||
|   | f6a5402194 | ||
|   | 6a349d0b28 | ||
|   | dac5c60608 | ||
|   | bc33317b7e | ||
|   | 754b1682a5 | ||
|   | cb9eed8ccc | ||
|   | 862905742f | ||
|   | ba98315f65 | ||
|   | 124a871923 | ||
|   | 378f6afccd | ||
|   | 1320863cb3 | ||
|   | a951ea90b8 | ||
|   | 3b7a2f8f32 | ||
|   | 038c3e3518 | ||
|   | c08439ff41 | ||
|   | 59d994ea5f | ||
|   | ed51d23335 | ||
|   | 2be892bfda | ||
|   | 723d900098 | ||
|   | 13404a7444 | ||
|   | a20594dfdc | ||
|   | bff4cadeff | ||
|   | 6515577dc3 | ||
|   | beebccd323 | ||
|   | d70c44b723 | ||
|   | 33d3192ca2 | ||
|   | 0d13931844 | ||
|   | 293c839a22 | ||
|   | f187ae35d9 | ||
|   | 74013e7e7d | ||
|   | e2026c0507 | ||
|   | c375e14705 | ||
|   | fade0644c7 | ||
|   | 5fedaf285b | ||
|   | fe82444db1 | ||
|   | f7692691ca | ||
|   | 7fba3484c5 | ||
|   | 561b6b583d | ||
|   | 7675c15fa9 | ||
|   | 99971abc9b | ||
|   | b7a1ba9ba0 | ||
|   | 63c26cd58b | ||
|   | f8fc03b482 | ||
|   | b0b1a0e9a7 | ||
|   | 4d2a9c23af | ||
|   | c41154989a | ||
|   | 541ece13c0 | ||
|   | b6b2ef5e57 | ||
|   | 4ef69da25d | ||
|   | 9bd339baf8 | ||
|   | 616be1aa60 | ||
|   | 415b14335f | ||
|   | 1fb707f93f | ||
|   | aa4ed82b66 | ||
|   | 7ce8abe5d6 | ||
|   | 27629a8dd6 | ||
|   | 521a4f4190 | ||
|   | bad3801eae | ||
|   | 72b3064a67 | ||
|   | 7593e5ce0e | ||
|   | 8a08548f36 | ||
|   | 56b0ad6809 | ||
|   | f8561fbfd5 | ||
|   | e80cbd4437 | ||
|   | da601e4589 | ||
|   | 36a87b6968 | ||
|   | e0b42939ba | ||
|   | 7d731f83a4 | ||
|   | 40ad7da455 | ||
|   | e0d1e5c722 | ||
|   | 5b3a168b86 | ||
|   | 11afd4820f | ||
|   | ec5c1194fc | ||
|   | 7eccd1029a | ||
|   | c2ca709d68 | ||
|   | 197ed8c983 | ||
|   | 990860fe65 | ||
|   | dbeb6e61c6 | ||
|   | 2b3f37f9e0 | ||
|   | f50148a9cc | ||
|   | 9fc8ec5b61 | ||
|   | 751a6f98fe | ||
|   | 9d8e6b92fc | ||
|   | c868da2879 | ||
|   | e0c40c1c59 | ||
|   | f185284776 | ||
|   | 1656ef0111 | ||
|   | 3cb2e4f7c6 | ||
|   | 3104f7e451 | ||
|   | ab8e7ea822 | ||
|   | 6daef66ea7 | ||
|   | 04286eb9dc | ||
|   | d15e30bf4a | ||
|   | fb1d480faf | ||
|   | c8fa0be345 | ||
|   | 643b0c9523 | ||
|   | 06930616b2 | ||
|   | 6e5fc6d396 | ||
|   | 17b0753023 | ||
|   | 7491348d40 | ||
|   | eef2036c36 | ||
|   | fbec8f4470 | ||
|   | 8e0137e1d2 | ||
|   | 1dac3f890a | ||
|   | 9f33266f23 | ||
|   | d8c7fd5161 | ||
|   | 731bc643d0 | ||
|   | 12e8615ac5 | ||
|   | 22703d2cdb | ||
|   | cb518f472a | ||
|   | 271f1fa319 | ||
|   | 9ecc4f0a1e | ||
|   | 977eab7c4a | ||
|   | c9f342f4b2 | ||
|   | 126e4d8414 | ||
|   | 14ee1e5827 | ||
|   | ecbb9055a2 | ||
|   | 862f04104d | ||
|   | d47f72be0c | ||
|   | 98c5767372 | ||
|   | 97a7b7545a | ||
|   | caf5616573 | ||
|   | b8076fa71f | ||
|   | 2360466aa9 | ||
|   | 28370b36aa | ||
|   | 9d82356ea9 | ||
|   | ca24e040c4 | ||
|   | 0fd629857d | ||
|   | 8eff14db11 | ||
|   | 81e26fe9b9 | ||
|   | 9eb4583dd5 | ||
|   | 5a23c86dc1 | ||
|   | ffd0525607 | ||
|   | 3dc636bf3e | ||
|   | 260ce4aa1d | ||
|   | 8bc827ebf5 | ||
|   | a97f764088 | ||
|   | 143b90af3e | ||
|   | 4e0a6ae624 | ||
|   | 0c60cfc5c0 | ||
|   | deb6b0e334 | ||
|   | 27777dcd31 | ||
|   | bdb397e043 | ||
|   | cb4d851761 | ||
|   | 17aa517e41 | ||
|   | 7ac16f4834 | ||
|   | bf7fece440 | ||
|   | c04ef9efe5 | ||
|   | b774c07d19 | ||
|   | 229467cb29 | ||
|   | 949b472f7e | ||
|   | be67d3e362 | ||
|   | 2c1a1fd4f8 | ||
|   | 3e2ae7cc78 | ||
|   | 505660e1fa | ||
|   | 09d90e1231 | ||
|   | 5a9f89ae1f | ||
|   | 6f56345dd8 | ||
|   | edef040688 | ||
|   | 9fc196e750 | ||
|   | dc1698eaf4 | ||
|   | 53ded063a0 | ||
|   | 8a2c50c374 | ||
|   | f71148f3a6 | ||
|   | 172105828c | ||
|   | 6cca6cb20d | ||
|   | b7336f817c | ||
|   | 88356b79be | ||
|   | ce9e543882 | ||
|   | 3ff3ba83f4 | ||
|   | edb525a030 | ||
|   | ea5314f076 | ||
|   | be8e53163b | ||
|   | 79151f517f | ||
|   | e8ffe7ef96 | ||
|   | b5a7b5e277 | ||
|   | 85b5e1088f | ||
|   | 680ddb1557 | ||
|   | 44fff522bd | ||
|   | 90815f0d27 | ||
|   | f07950c60a | ||
|   | f8c4125892 | ||
|   | 1f30cc203a | ||
|   | 764bfdcb9f | ||
|   | f290814f64 | ||
|   | 3a2508545d | ||
|   | 79a06a338a | ||
|   | 509f27eee1 | ||
|   | e511c32a36 | ||
|   | b463d9b687 | ||
|   | e96e20ccfd | ||
|   | 06ebdbfd37 | ||
|   | df9fd047b4 | ||
|   | 85d65c59d2 | ||
|   | 754126644f | ||
|   | 220436f4f9 | ||
|   | b62a6ae1d0 | ||
|   | eae0532b8c | ||
|   | d642487f99 | ||
|   | 320510506b | ||
|   | b2839ac78b | ||
|   | 834d5a0e72 | ||
|   | 13ce808c47 | ||
|   | 980a6529c1 | ||
|   | c92384fe68 | ||
|   | 9f563f87b9 | ||
|   | 44f37b8d1b | ||
|   | 5f41c1cf3f | ||
|   | 2a664b9ae6 | ||
|   | 5456814199 | ||
|   | 33ceaeb208 | ||
|   | b33e60b3ae | ||
|   | 9dd0a6eb86 | ||
|   | ed6faf4e65 | ||
|   | df2ee5de49 | ||
|   | 36fef91a67 | ||
|   | 3399148d75 | ||
|   | 0eea92de66 | ||
|   | 92975bb21d | ||
|   | bf18e04134 | ||
|   | 4a0d7f18fd | ||
|   | 65c360a2ca | ||
|   | 71919f7523 | ||
|   | 31a49db68b | ||
|   | 0d615442ba | ||
|   | 8f35dbc306 | ||
|   | 154bcbc4f7 | ||
|   | c96a39d315 | ||
|   | 06ba74c366 | ||
|   | 8786a8e6e0 | ||
|   | 748236fef0 | ||
|   | ae1b06f20b | ||
|   | b8aa93ce30 | ||
|   | 49d40a42f1 | ||
|   | 1845f34b81 | ||
|   | 43903d446a | ||
|   | 256da2124b | ||
|   | 7869e96bac | ||
|   | 79b51a6e4b | ||
|   | cad9f6d46e | ||
|   | da2960880a | ||
|   | 0eacc58e29 | ||
|   | 3bec736aee | ||
|   | 3241ffd1b4 | ||
|   | d0d7b266bc | ||
|   | c24948258b | ||
|   | d36666bd98 | ||
|   | 2794b1d310 | ||
|   | f456fa03da | ||
|   | 356b7b43f8 | ||
|   | 92718e2140 | ||
|   | 4021160a64 | ||
|   | 6f043e3326 | ||
|   | 74b0b1da21 | ||
|   | 3a5f676687 | ||
|   | 4fa7cffc37 | ||
|   | 79b83e78a5 | ||
|   | 048a3835e7 | ||
|   | 4a4891036a | ||
|   | ff00c83f15 | ||
|   | 79d31b7452 | ||
|   | 20cc6f7463 | ||
|   | 8acabaa135 | ||
|   | ba7183a5b4 | ||
|   | 28f4338a6c | ||
|   | 800a93a859 | ||
|   | 2e969e3a0a | ||
|   | 3fb31f651d | ||
|   | 682d25b551 | ||
|   | bcad8d4c4c | ||
|   | 96bab8e02e | ||
|   | fa4a615d0f | ||
|   | f1265c4fed | ||
|   | df01cd9a09 | ||
|   | 255bac642d | ||
|   | 6d8c3bd13d | ||
|   | 75b8272710 | ||
|   | 2f80e154f2 | ||
|   | cc0114c482 | ||
|   | e5e2b9095c | ||
|   | 6977edc032 | ||
|   | 177cc55ee5 | ||
|   | feb7ec03ba | ||
|   | 6630a643d3 | ||
|   | d70e64a434 | ||
|   | 896ad51102 | ||
|   | be6d6560a7 | ||
|   | 709d0cc33e | ||
|   | bd73742552 | ||
|   | ed4518e09a | ||
|   | 6c8301eae8 | ||
|   | 6e30d504e3 | ||
|   | cee09a0261 | ||
|   | 76a72558b3 | ||
|   | 22124a33ce | ||
|   | 3731373de1 | ||
|   | bbaf8c2f67 | ||
|   | f50694cc96 | ||
|   | 4930ea7dab | ||
|   | 96bb4cf49d | ||
|   | 5e7563ac5b | ||
|   | f199b80453 | ||
|   | 5de8eec206 | ||
|   | 076bd07f39 | ||
|   | 00e897503b | ||
|   | 2f3c47f385 | ||
|   | 2b28211701 | ||
|   | 46c794fc2e | ||
|   | 0408738b48 | ||
|   | 6cfea98501 | ||
|   | 33498d3673 | ||
|   | ed3ead06fe | ||
|   | eb8a338a0e | ||
|   | 23480bfe8a | ||
|   | 3384dbc92d | ||
|   | 8446549ed8 | ||
|   | 6a9f3ae71d | ||
|   | 94e5b0d78f | ||
|   | 0812eb1c04 | ||
|   | 8cb5ccad99 | ||
|   | 743d69ec0b | ||
|   | f6de4c9479 | ||
|   | fb59927d32 | ||
|   | c58ce1a975 | ||
|   | c6d9bbd7b0 | ||
|   | 08974f00ed | ||
|   | 60643f023f | ||
|   | 65ddd1a455 | ||
|   | 68a98d3dd0 | ||
|   | ca9015452e | ||
|   | 05ac2603e6 | ||
|   | 8e923777b8 | ||
|   | 8949551c2e | ||
|   | 0b45e9442b | ||
|   | 1d1a9d7933 | ||
|   | 58c0fe0f91 | ||
|   | b96b62f2ac | ||
|   | 43fc0a52a6 | ||
|   | 4f3d9a1ded | ||
|   | b50ff920f0 | ||
|   | 983ae0c5a2 | ||
|   | 9d4db84987 | ||
|   | 1f372cf0cc | ||
|   | c43d597aa9 | ||
|   | dfaa281476 | ||
|   | df14629a25 | ||
|   | c1c25c455c | ||
|   | e65197f386 | ||
|   | ecbb8f8711 | ||
|   | 03aa736199 | ||
|   | 821b1f0384 | ||
|   | 233ad3aaff | ||
|   | 9c4812f4d4 | ||
|   | 337cc9fa78 | ||
|   | dfe29a0329 | ||
|   | 85e90aa81e | ||
|   | 86d30fe571 | ||
|   | 173302267f | ||
|   | 8e3ea8d26c | ||
|   | cb065563c2 | ||
|   | 27b89b237b | ||
|   | 21f0d0bfc4 | ||
|   | d5e583b09e | ||
|   | 15fb9bbcb2 | ||
|   | a03418ab12 | ||
|   | 035513844d | ||
|   | 193906b8ce | ||
|   | d354f2e8c2 | ||
|   | 24a8ee436f | ||
|   | 6e5f9404b7 | ||
|   | 64fe90aabb | ||
|   | 7e31d487e0 | ||
|   | ee16e2eb30 | ||
|   | 003fb3392f | ||
|   | 0e82278cd5 | ||
|   | 5b544248bc | ||
|   | d4d7495c0a | ||
|   | 8325cce44c | ||
|   | ee0debc5b3 | ||
|   | 8f1bd12a17 | ||
|   | fccf1016e4 | ||
|   | 1b010a082b | ||
|   | 324f215316 | ||
|   | ace4f1e7f0 | ||
|   | 5c5f16f148 | ||
|   | f50855d5c0 | ||
|   | 86917b0ba7 | ||
|   | 7201fcbe0f | ||
|   | 83f1735fbb | ||
|   | 80fd8e70f0 | ||
|   | 698c1c2b7a | ||
|   | 5d3287f5aa | ||
|   | 6990fe6f51 | ||
|   | 0b81068368 | ||
|   | 5b1851ae22 | ||
|   | 0d5708a01d | ||
|   | 67ab510b5d | ||
|   | d1264a1289 | ||
|   | 3b973021a1 | ||
|   | 182624895f | ||
|   | 548de3739c | ||
|   | 718a3efd64 | ||
|   | 76b8c3250b | ||
|   | dafaa8bd8c | ||
|   | 9c9b2c25ea | ||
|   | e89cd81022 | ||
|   | 5debbd2be8 | ||
|   | fe26df5355 | ||
|   | 85778494e4 | ||
|   | a94ce3c715 | ||
|   | a440ff1117 | ||
|   | 8195137bc5 | ||
|   | 3e2bd25e4e | ||
|   | ffd0c2f624 | ||
|   | 23333c98d7 | ||
|   | 5a12ab98c4 | ||
|   | 0b327a63fc | ||
|   | 15b28a245c | ||
|   | 6ef5684797 | ||
|   | d439b1495b | ||
|   | 9e096a3f0e | ||
|   | 0acf6ec150 | ||
|   | 4b36340474 | ||
|   | 910e642a8b | ||
|   | 9f571146fb | ||
|   | 339725f73d | ||
|   | aff964c58b | ||
|   | 0c07e745f8 | ||
|   | 419d2e9564 | ||
|   | f936a307c6 | ||
|   | 4e4678edfa | ||
|   | cb7a4b3116 | ||
|   | 5ca4c42a74 | ||
|   | 1238a7ca07 | ||
|   | a9db60a73d | ||
|   | bd32ac19d4 | ||
|   | eaf9944e43 | ||
|   | 703fdbc01d | ||
|   | 2daa08b0e7 | ||
|   | 05d9d22d9e | ||
|   | 8b7894f9bd | ||
|   | a71439607f | ||
|   | aca0d7f969 | ||
|   | 310a8e4342 | ||
|   | 24fbe1ef5b | ||
|   | 33d8faa35d | ||
|   | 44be714f65 | ||
|   | 0df3da6b10 | ||
|   | 79197b6ec7 | ||
|   | 353b6b51cb | ||
|   | bd9a2c0d3a | ||
|   | 53b0ee6536 | ||
|   | 78daac0f1b | ||
|   | b970b9b9a8 | ||
|   | 0339db57f1 | ||
|   | 461b147897 | ||
|   | a3cd13b399 | ||
|   | eb5d326a1e | ||
|   | cce6eb94e2 | ||
|   | 8311c72c69 | ||
|   | 9a059285d9 | ||
|   | 469ac7891d | ||
|   | 16264a5693 | ||
|   | 6eedb50f56 | ||
|   | 5f07215662 | ||
|   | d3a02fb2ca | ||
|   | 2c823f1aaa | ||
|   | 706293aadc | ||
|   | dfdceb4258 | ||
|   | 0014b7fdb9 | ||
|   | 3b28f1f8af | ||
|   | c689d476ca | ||
|   | cc534fd21f | ||
|   | 124efcf247 | ||
|   | dd452b05e3 | ||
|   | b5617f7df9 | ||
|   | b73ca1ba3a | ||
|   | 39ad071c4f | ||
|   | fa0b576a45 | ||
|   | c2c7591987 | ||
|   | 3e939e3775 | ||
|   | f6384e10bc | ||
|   | c283842563 | ||
|   | 1135976225 | ||
|   | 76679d33df | ||
|   | e9d44b90bc | ||
|   | 8a7a391166 | ||
|   | d6c5a9eece | ||
|   | 56ad6915d0 | ||
|   | 466c260782 | ||
|   | d8e2d1725a | ||
|   | 33b43d03ac | ||
|   | 517509db6e | ||
|   | 95f01a5976 | ||
|   | d08d3bf56d | ||
|   | 587fd669e8 | ||
|   | e3553b87fe | ||
|   | a078d2360c | ||
|   | 2d3abf8e6e | ||
|   | cacae0fb7d | ||
|   | d7fc215c16 | ||
|   | bb69aa18f2 | ||
|   | e4f515166a | ||
|   | f325acb0ea | ||
|   | d1b6e65dd8 | ||
|   | 4688252bd4 | ||
|   | b1df5d3ad7 | ||
|   | 09bad2938e | ||
|   | bad69fd397 | ||
|   | b4ae6bf82c | ||
|   | eac0f83864 | ||
|   | 3f16f080ac | ||
|   | 5de2b974fb | ||
|   | 6a9cb51828 | ||
|   | f1c294ca50 | ||
|   | c320e44a23 | ||
|   | ea36ef3107 | ||
|   | fedc37d079 | ||
|   | 86ccfcc03c | ||
|   | bc8d8ab65a | ||
|   | a7a23d3bc8 | ||
|   | 82d33944e6 | ||
|   | 8a629ad6fb | ||
|   | e1711ffcf2 | ||
|   | 063d51c662 | ||
|   | d8e3575a46 | ||
|   | 6fa609be3f | ||
|   | 70982e204c | ||
|   | 2af7df5865 | ||
|   | 59610e81de | ||
|   | cdfac703ef | ||
|   | ad5ebd007e | ||
|   | 1bd347d997 | ||
|   | 147056073d | ||
|   | 1b3231e617 | ||
|   | 7ac4ad3e38 | ||
|   | 0a345cb12b | ||
|   | 19ff0dd17f | ||
|   | e3bf8a404b | ||
|   | dbb28d9a8f | ||
|   | 19fd4e755c | ||
|   | 77698cd924 | ||
|   | 945d279f28 | ||
|   | 645d296841 | ||
|   | 57446de875 | ||
|   | 3473800ab6 | ||
|   | 7e5c5153a8 | ||
|   | 1b8979f285 | ||
|   | 2aac51dd20 | ||
|   | 69e32d264c | ||
|   | 71ae75a5bf | ||
|   | 86043fd87e | ||
|   | d8aaef4f04 | ||
|   | 7fc34b6369 | ||
|   | 92b346efa7 | ||
|   | c790735b9f | ||
|   | 64711e615e | ||
|   | 2065affd45 | ||
|   | 4067c56b5d | ||
|   | 65515638aa | ||
|   | 371ba3ffe3 | ||
|   | 5395b62f2f | ||
|   | 3e164eab26 | ||
|   | ad85533975 | ||
|   | d6c2a97931 | ||
|   | 17def94ba4 | ||
|   | cf254ea240 | ||
|   | 2d05110239 | ||
|   | 0017f4fce8 | ||
|   | 02f3dd947a | ||
|   | ef0874feba | ||
|   | 14aa1420f0 | ||
|   | c506cd97e0 | ||
|   | 3761aacb1d | ||
|   | 233f13aac5 | ||
|   | 0ced3ec2d2 | ||
|   | 5b786f65a4 | ||
|   | 770542c8c7 | ||
|   | 4f1207a38c | ||
|   | 2b65f81e23 | ||
|   | c10eb2c17b | ||
|   | 3f5ac54bf5 | ||
|   | 790f9409b1 | ||
|   | a3d831b723 | ||
|   | b9483deea3 | ||
|   | c211d2ac45 | ||
|   | 119a03dd5f | ||
|   | f3fbb7e1f6 | ||
|   | 2be98e8467 | ||
|   | 91b1806e9d | ||
|   | 8548b3645a | ||
|   | 4bbfb3f9a3 | ||
|   | 98eec72522 | ||
|   | 562d50df4d | ||
|   | f3ee5ab372 | ||
|   | aa2a3e5b07 | ||
|   | 8467307239 | ||
|   | 90da951a6f | ||
|   | 59f81b331c | ||
|   | 77a7d3d26a | ||
|   | 4321b80999 | ||
|   | 4b93b06323 | ||
|   | 96fb2e4b7c | ||
|   | 3dc1048dfb | ||
|   | 28f4bd5a67 | ||
|   | b01c270889 | ||
|   | 7c92f8a90b | ||
|   | a4a04872a3 | ||
|   | f2d13cd647 | ||
|   | 9346908485 | ||
|   | b3a7ba14f7 | ||
|   | 524ef9553c | ||
|   | a85f6e72fe | ||
|   | 1ae6a41336 | ||
|   | 3ec55791c6 | ||
|   | a3accd28ea | ||
|   | fc5bc84207 | ||
|   | d8b4051d6d | ||
|   | 804a1cc22d | ||
|   | cdd60e5f9c | ||
|   | 7c76f07384 | ||
|   | a3b1ef9527 | ||
|   | 0bd4150a80 | ||
|   | 7f7f5253f2 | ||
|   | 2a0a847634 | ||
|   | 92ddb37ed3 | ||
|   | 01f944e6bd | ||
|   | 732c8d7350 | ||
|   | 21678aeef5 | ||
|   | cda1ca35a4 | ||
|   | 923580d2cd | ||
|   | 190af1d32b | ||
|   | bffe0443f9 | ||
|   | 29e99e229b | ||
|   | 2736b88dd5 | ||
|   | e739c60e9f | ||
|   | 1c0afbc5c5 | ||
|   | ee1ba5c0f2 | ||
|   | 02342ba540 | ||
|   | 12a130e9bc | ||
|   | dfb97e7961 | ||
|   | 54e03a62bd | ||
|   | ec9659ff25 | ||
|   | 0a41b253f3 | ||
|   | 002b86198c | ||
|   | 7161a235f1 | ||
|   | 391034a785 | ||
|   | 446a7fbd67 | ||
|   | 2ccb09434f | ||
|   | 7974060a40 | ||
|   | e8abcc1765 | ||
|   | 1be1927a1f | ||
|   | 894ff71664 | ||
|   | 93bed9c5df | ||
|   | 34c008adce | ||
|   | 22ddd91b1f | ||
|   | e121f34407 | ||
|   | df8a3e870a | ||
|   | 13b6708a09 | ||
|   | 6aa196cf55 | ||
|   | 142493076a | ||
|   | 3d905a7a4f | ||
|   | 0a8a6ed168 | ||
|   | 68b6fa46e6 | ||
|   | 80f7c54e4d | ||
|   | c0e2041006 | ||
|   | f6d2cd7704 | ||
|   | 6d9a629b15 | ||
|   | ead8edc7cd | ||
|   | 664eefdddb | ||
|   | 220d76c974 | ||
|   | d973192b5e | ||
|   | 978bb5059f | ||
|   | f59178bc33 | ||
|   | 53899cc492 | ||
|   | 6379d0fe0f | ||
|   | a1c4d8696a | ||
|   | 7f42ed86f2 | ||
|   | 6bb8b4c994 | ||
|   | afefbe4e56 | ||
|   | 5cd37e5505 | ||
|   | d6a825981d | ||
|   | a1c01c6722 | ||
|   | 8d182f1d79 | ||
|   | 29707bd2ea | ||
|   | c2bf2a8174 | ||
|   | b402849557 | ||
|   | cb85dcfcb8 | ||
|   | 49379140c7 | ||
|   | 63f6c86b46 | ||
|   | 1865898cd4 | ||
|   | 8935ecfdb8 | ||
|   | 4902bed409 | ||
|   | e6f6aba207 | ||
|   | bab622de25 | ||
|   | a86c1624a7 | ||
|   | c707392a5a | ||
|   | 1f07721ec4 | ||
|   | 4767e45035 | ||
|   | f2a64ed685 | ||
|   | 2c9966a0a3 | ||
|   | 953aa95c64 | ||
|   | 446266776e | ||
|   | 845af014dc | ||
|   | 7c8f8703a1 | ||
|   | a0c18e4380 | ||
|   | e8d8099563 | ||
|   | 2c9d90d463 | ||
|   | 130d2064d5 | ||
|   | a10eb2a0d7 | ||
|   | b71cc5d7ee | ||
|   | 8512f9eda1 | ||
|   | 80058083b8 | ||
|   | d5a17a3c25 | ||
|   | eab7c87781 | ||
|   | d2962d8676 | ||
|   | 5e602fb575 | ||
|   | 599964ea5f | ||
|   | 562de7926b | ||
|   | 8eaed95e02 | ||
|   | 3cffd46008 | ||
|   | e239bfda8a | ||
|   | bd887b660d | ||
|   | 7c1e0ea95d | ||
|   | afbddbfcda | ||
|   | 9eeb702ca5 | ||
|   | 4cb6d6995f | ||
|   | fe7e7a8d07 | ||
|   | f8ee79ab72 | ||
|   | a11165830b | ||
|   | 11cde61eab | ||
|   | cd862409cc | ||
|   | 7644555d6b | ||
|   | 07e68aa694 | ||
|   | 0ae206b1bb | ||
|   | 5bdac96375 | ||
|   | f0e044ecd8 | ||
|   | f32234291e | ||
|   | 83acd6529f | ||
|   | 6a60cb4dc0 | ||
|   | 1de03fbe18 | ||
|   | 0e0a2aa981 | ||
|   | af73b9d11b | ||
|   | 859969241a | ||
|   | 6852a8ca9d | ||
|   | c694f1a4a9 | ||
|   | d36543b204 | ||
|   | 6981234736 | ||
|   | 10bf3ee9de | ||
|   | 9953218de1 | ||
|   | 50c74103aa | ||
|   | c5e15123fd | ||
|   | 4adcdb5ba8 | ||
|   | 60b36ffaa3 | ||
|   | d86104ed5d | ||
|   | 0f02ef20a9 | ||
|   | 0768cf17b6 | ||
|   | 197205853f | ||
|   | bebcc24ab8 | ||
|   | 987248ccbb | ||
|   | 56ece4db0f | ||
|   | c7f8b94ccd | ||
|   | 95b820305a | ||
|   | 599b200ca5 | ||
|   | a9566b31be | ||
|   | f30837d726 | ||
|   | 1242ffa4c6 | ||
|   | 37c0347c47 | ||
|   | 65befb84a0 | ||
|   | a41f7ce3bd | ||
|   | 81ced6bf2a | ||
|   | fa8033f998 | ||
|   | 19e3178d0c | ||
|   | 1e6262f24f | ||
|   | beb2284440 | ||
|   | 0c4f0de13d | ||
|   | 0cd31a4b96 | ||
|   | ef0a86e7cc | ||
|   | b79c1345b9 | ||
|   | 5bb8b6f16c | ||
|   | f6f675d1e1 | ||
|   | 9f684e7670 | ||
|   | a998706452 | ||
|   | 5e19bc6f84 | ||
|   | 169f287970 | ||
|   | c56926428c | ||
|   | 43eab5c4e5 | ||
|   | c6424c2ce7 | ||
|   | dfe19d308c | ||
|   | b75db110dc | ||
|   | 9e50ba6ec6 | ||
|   | aca2ba13c2 | ||
|   | c5afe7a573 | ||
|   | 8b90968cb1 | ||
|   | 9281dba896 | ||
|   | c7555f1c3c | ||
|   | e781831032 | ||
|   | 8025895168 | ||
|   | 799935e44c | ||
|   | 209d8d058c | ||
|   | 0368a70dd7 | ||
|   | c3603426de | ||
|   | 80db9971b5 | ||
|   | e3e771708e | ||
|   | b9bca2a19f | ||
|   | ffae70a99a | ||
|   | 10ec1e48b0 | ||
|   | 84123f5445 | ||
|   | 25531d8393 | ||
|   | adfadc542a | ||
|   | 7682e1cb57 | ||
|   | 1fe4109a42 | ||
|   | b97baf4d47 | ||
|   | f91728561f | ||
|   | 2b75d54ce1 | ||
|   | cdc09a7d30 | ||
|   | 4cc6c3e535 | ||
|   | 8f43e033a4 | ||
|   | 918dbd1926 | ||
|   | 8fc86ce7fa | ||
|   | bf0cb40586 | ||
|   | a62aefe74b | ||
|   | 138d232149 | ||
|   | 8fa64e3ab2 | ||
|   | 8d0d2bd3fc | ||
|   | 2146f5f623 | ||
|   | 623df23570 | ||
|   | 4a15d8b6d2 | ||
|   | af83a62474 | ||
|   | a0705a6c67 | ||
|   | 712b8eec3d | ||
|   | 558e9c21ed | ||
|   | 23a7137e6a | ||
|   | 71a1cb0184 | ||
|   | 09b47cc536 | ||
|   | b5c78de2dd | ||
|   | a1bd14e516 | ||
|   | 9684c8664f | ||
|   | 3c75361e5a | ||
|   | c44c9ab74d | ||
|   | 8cc9c871b7 | ||
|   | 31d211cded | ||
|   | c42cba1d54 | ||
|   | c87f7cb9ac | ||
|   | ff0e1bbbc0 | ||
|   | 18c712cd99 | ||
|   | 8de1f764fd | ||
|   | a91c1ec6d9 | ||
|   | 78f542f6c0 | 
							
								
								
									
										51
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,51 @@ | ||||
| # Files generated by the bootstrap script. | ||||
| /INSTALL | ||||
| /AUTHORS | ||||
| /ChangeLog | ||||
| /NEWS | ||||
| /README | ||||
| /ac/ | ||||
| /aclocal.m4 | ||||
| /autom4te.cache/ | ||||
| /config.h.in | ||||
| /configure | ||||
| /msgpack_vc2008.sln | ||||
| /msgpack_vc2008.vcproj | ||||
| Makefile.in | ||||
|  | ||||
| # Files generated by the configure script. | ||||
|  | ||||
| /config.h | ||||
| /config.log | ||||
| /config.status | ||||
| /libtool | ||||
| /msgpack.pc | ||||
| /src/msgpack/version.h | ||||
| /src/msgpack/version.hpp | ||||
| /stamp-h1 | ||||
| Makefile | ||||
| .deps | ||||
| .libs | ||||
|  | ||||
| # Files generated by make. | ||||
| *.o | ||||
| *.so | ||||
| *.lo | ||||
| *.la | ||||
|  | ||||
| # Files generated by make check. | ||||
| # TODO: Replace these with something like /test/*_test | ||||
| /test/buffer | ||||
| /test/cases | ||||
| /test/convert | ||||
| /test/fixint | ||||
| /test/fixint_c | ||||
| /test/msgpack_test | ||||
| /test/msgpackc_test | ||||
| /test/object | ||||
| /test/pack_unpack | ||||
| /test/pack_unpack_c | ||||
| /test/streaming | ||||
| /test/streaming_c | ||||
| /test/version | ||||
| /test/zone | ||||
							
								
								
									
										6
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| [submodule "external/boost/predef"] | ||||
| 	path = external/boost/predef | ||||
| 	url = https://github.com/boostorg/predef.git | ||||
| [submodule "external/boost/preprocessor"] | ||||
| 	path = external/boost/preprocessor | ||||
| 	url = https://github.com/boostorg/preprocessor.git | ||||
							
								
								
									
										91
									
								
								.travis.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										91
									
								
								.travis.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,91 @@ | ||||
| language: cpp | ||||
| os: | ||||
|   - linux | ||||
|   - osx | ||||
| cache: | ||||
|   - apt | ||||
| compiler: | ||||
|   - clang | ||||
|   - gcc | ||||
| os: | ||||
|   - osx | ||||
|   - linux | ||||
| before_install: | ||||
|   - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test; fi | ||||
|   - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo add-apt-repository -y ppa:h-rayflood/llvm-upper; fi | ||||
|   - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get update -qq; fi | ||||
|   - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get update; fi | ||||
| install: | ||||
|   - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get install -qq gcc-4.8-multilib g++-4.8-multilib; fi | ||||
|   - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get install --allow-unauthenticated -qq clang-3.6; fi | ||||
|   - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 90; fi | ||||
|   - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 90; fi | ||||
|   - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get install -y lib32gcc1; fi | ||||
|   - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get install -y libc6-i386; fi | ||||
|   - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get install -y lib32z1-dev; fi | ||||
|   - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get install -y lib32stdc++6; fi | ||||
|   - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get install -y bzip2; fi | ||||
|   - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get install -y libc6-dbg; fi | ||||
|   - wget https://googletest.googlecode.com/files/gtest-1.7.0.zip | ||||
|   - wget http://valgrind.org/downloads/valgrind-3.10.1.tar.bz2 && tar xjf valgrind-3.10.1.tar.bz2 && cd valgrind-3.10.1 && ./configure && make && sudo make install && cd .. | ||||
|  | ||||
|   - if [ "$TRAVIS_OS_NAME" == "osx" ]; then brew unlink boost; fi | ||||
|   - if [ "$BOOST" == "boost" ]; then wget http://sourceforge.net/projects/boost/files/boost/1.58.0/boost_1_58_0.zip && unzip -q boost_1_58_0.zip && cd boost_1_58_0 && ./bootstrap.sh && ./b2 --with-timer --with-chrono address-model="$ARCH" > /dev/null && sudo ./b2 --with-timer --with-chrono address-model="$ARCH" install > /dev/null && cd ..; fi | ||||
|  | ||||
|   - if [ "$TRAVIS_OS_NAME" == "linux" ]; then unzip -q gtest-1.7.0.zip && cd gtest-1.7.0 && sudo cp -r include/gtest /usr/local/include && g++ src/gtest-all.cc -I. -Iinclude -c && g++ src/gtest_main.cc -I. -Iinclude -c && ar -rv libgtest.a gtest-all.o && ar -rv libgtest_main.a gtest_main.o && sudo mv *.a /usr/local/lib && g++ -m32 src/gtest-all.cc -I. -Iinclude -c && g++ -m32 src/gtest_main.cc -I. -Iinclude -c && ar -rv libgtest.a gtest-all.o && ar -rv libgtest_main.a gtest_main.o && sudo mkdir /usr/local/lib32 && sudo mv *.a /usr/local/lib32 && cd ..; fi | ||||
|   - if [ "$TRAVIS_OS_NAME" == "osx" ]; then unzip -q gtest-1.7.0.zip && cd gtest-1.7.0 && sudo cp -r include/gtest /usr/local/include && clang++ src/gtest-all.cc -I. -Iinclude -c && g++ src/gtest_main.cc -I. -Iinclude -c && ar -rv libgtest.a gtest-all.o && ar -rv libgtest_main.a gtest_main.o && sudo mv *.a /usr/local/lib && cd ..; fi | ||||
|  | ||||
| env: | ||||
|   - ACTION="ci/build_autotools.sh" VERSION="cpp03" ARCH="64" LIBPATH="/usr/local/lib"   BOOST="boost" BOOST_INC="/usr/local/boost" | ||||
|   - ACTION="ci/build_autotools.sh" VERSION="cpp03" ARCH="32" LIBPATH="/usr/local/lib32" BOOST=""      BOOST_INC="" | ||||
|   - ACTION="ci/build_cmake.sh"     VERSION="cpp11" ARCH="64" LIBPATH="/usr/local/lib"   BOOST="boost" BOOST_INC="/usr/local/boost" | ||||
|   - ACTION="ci/build_cmake.sh"     VERSION="cpp11" ARCH="32" LIBPATH="/usr/local/lib32" BOOST=""      BOOST_INC=""                 SHARED="OFF" | ||||
|   - ACTION="ci/build_autotools.sh" VERSION="cpp11" ARCH="64" LIBPATH="/usr/local/lib"   BOOST=""      BOOST_INC="" | ||||
|   - ACTION="ci/build_autotools.sh" VERSION="cpp11" ARCH="32" LIBPATH="/usr/local/lib32" BOOST="boost" BOOST_INC="/usr/local/boost" | ||||
|   - ACTION="ci/build_cmake.sh"     VERSION="cpp03" ARCH="64" LIBPATH="/usr/local/lib"   BOOST=""      BOOST_INC="" | ||||
|   - ACTION="ci/build_cmake.sh"     VERSION="cpp03" ARCH="32" LIBPATH="/usr/local/lib32" BOOST="boost" BOOST_INC="/usr/local/boost" SHARED="OFF" | ||||
|  | ||||
| before_script: | ||||
|  - export PATH=/usr/local/bin:$PATH && rm -rf install | ||||
|  | ||||
| matrix: | ||||
|   exclude: | ||||
|     - os: osx | ||||
|       compiler: gcc | ||||
|     - os: osx | ||||
|       env: ACTION="ci/build_autotools.sh" VERSION="cpp03" ARCH="32" LIBPATH="/usr/local/lib32" BOOST=""      BOOST_INC="" | ||||
|     - os: osx | ||||
|       env: ACTION="ci/build_cmake.sh"     VERSION="cpp11" ARCH="32" LIBPATH="/usr/local/lib32" BOOST=""      BOOST_INC=""                 SHARED="OFF" | ||||
|     - os: osx | ||||
|       env: ACTION="ci/build_autotools.sh" VERSION="cpp11" ARCH="32" LIBPATH="/usr/local/lib32" BOOST="boost" BOOST_INC="/usr/local/boost" | ||||
|     - os: osx | ||||
|       env: ACTION="ci/build_cmake.sh"     VERSION="cpp03" ARCH="32" LIBPATH="/usr/local/lib32" BOOST="boost" BOOST_INC="/usr/local/boost" SHARED="OFF" | ||||
|  | ||||
|     - os: linux | ||||
|       compiler: gcc | ||||
|       env: ACTION="ci/build_autotools.sh" VERSION="cpp03" ARCH="64" LIBPATH="/usr/local/lib"   BOOST="boost" BOOST_INC="/usr/local/boost" | ||||
|     - os: linux | ||||
|       compiler: gcc | ||||
|       env: ACTION="ci/build_autotools.sh" VERSION="cpp03" ARCH="32" LIBPATH="/usr/local/lib32" BOOST=""      BOOST_INC="" | ||||
|     - os: linux | ||||
|       compiler: gcc | ||||
|       env: ACTION="ci/build_cmake.sh"     VERSION="cpp11" ARCH="64" LIBPATH="/usr/local/lib"   BOOST="boost" BOOST_INC="/usr/local/boost" | ||||
|     - os: linux | ||||
|       compiler: gcc | ||||
|       env: ACTION="ci/build_cmake.sh"     VERSION="cpp11" ARCH="32" LIBPATH="/usr/local/lib32" BOOST=""      BOOST_INC=""                 SHARED="OFF" | ||||
|  | ||||
|     - os: linux | ||||
|       compiler: clang | ||||
|       env: ACTION="ci/build_autotools.sh" VERSION="cpp11" ARCH="64" LIBPATH="/usr/local/lib"   BOOST=""      BOOST_INC="" | ||||
|     - os: linux | ||||
|       compiler: clang | ||||
|       env: ACTION="ci/build_autotools.sh" VERSION="cpp11" ARCH="32" LIBPATH="/usr/local/lib32" BOOST="boost" BOOST_INC="/usr/local/boost" | ||||
|     - os: linux | ||||
|       compiler: clang | ||||
|       env: ACTION="ci/build_cmake.sh"     VERSION="cpp03" ARCH="64" LIBPATH="/usr/local/lib"   BOOST=""      BOOST_INC="" | ||||
|     - os: linux | ||||
|       compiler: clang | ||||
|       env: ACTION="ci/build_cmake.sh"     VERSION="cpp03" ARCH="32" LIBPATH="/usr/local/lib32" BOOST="boost" BOOST_INC="/usr/local/boost" SHARED="OFF" | ||||
|  | ||||
| script: | ||||
|   - git clean -xdf && CMAKE_LIBRARY_PATH=${LIBPATH} ${ACTION} ${VERSION} ${ARCH} ${BOOST} ${BOOST_INC} | ||||
							
								
								
									
										169
									
								
								CHANGELOG.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										169
									
								
								CHANGELOG.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,169 @@ | ||||
| 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 change >> | ||||
|   * Change std::vector<unsigned char> and std::array<unsigned char> | ||||
|     mapped to BIN instead of ARRAY (#243) | ||||
|   * Remove redundant copy (#285) | ||||
|  | ||||
|   * 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 change >> | ||||
|   * Remove msgpack_fwd.hpp | ||||
|   * Improve user types adaptation mechanism (#262) | ||||
|     Since version 1.0.0, users need to obey the correct include order. | ||||
|     However, it is very difficult to maintain the correct order in big | ||||
|     projects. version 1.1.0 removed this order. Users don't need to | ||||
|     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 | ||||
|  | ||||
|   * Fix vector<bool> size check (#251) | ||||
|   * Fix inttypes.h inclusion on MSVC (#257) | ||||
|   * Support documents generation by Doxygen (#259) | ||||
|   * Remove C99 style variable declaration (#253) | ||||
|   * Improve documents (https://github.com/msgpack/msgpack-c/wiki) | ||||
| 2015-03-22 version 1.0.1: | ||||
|   * Fix compilation error on Mac 10.9 (#244) | ||||
|   * Fix typos in documents (#240) | ||||
|   * Update CHANGELOG.md for version 1.0.0 (#242) | ||||
|   * Fix erb templates for the next code generation (#239) | ||||
|  | ||||
| 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 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) | ||||
|   * Move include directory (#142) | ||||
|   * Update the name of float format family on msgpack::object from 'dec' to 'f64' (#194) | ||||
|   * Remove existing elements on associative containers when unpacking (#127) | ||||
|   * Add an API versioning functionality https://github.com/msgpack/msgpack-c/wiki/cpp_versioning (#139) | ||||
|   * Add C++11 enum class support (#205) | ||||
|   * Map std::vector<char> and std::array<char> to BIN (#100) | ||||
|   * Map '\0' teminated char* and char const* to STR (#206) | ||||
|   * Add the new parameter on unpacking functions and classes to limit msgpack's bytestream size (https://github.com/msgpack/msgpack-c/wiki/cpp_unpacker#limit-size-of-elements) (#175) | ||||
|   * Add the copy or reference choosing function on unpack() and unpacker (https://github.com/msgpack/msgpack-c/wiki/cpp_unpacker#memory-management) | ||||
|   * Add the new unpack() overloads for C++11 https://github.com/msgpack/msgpack-c/wiki/cpp_unpacker (#128) | ||||
|   * Add a msgpack::object::with_zone (deep) copying function (#133, #163) | ||||
|   * Remove the compile-time defined limit of msgpack nest level on C++ (#218) | ||||
|   * Add the new unpack() overloads that use an existing zone (#201) | ||||
|   * Add the range-based for loop support on msgpack object array and map (#203) | ||||
|   * Add msgpack revision getter function for 'revision' (#237) | ||||
|   * Support EXT for C (#118, #129) | ||||
|   * Fix unpacking buffer allocation problem when malformed data is given (#160, #185) | ||||
|   * Add dll exporting function on MSVC (#162) | ||||
|   * Fix msgpack::zone::allocate_no_align(). Now it allocates the memory that is not aligned as expected (#171) | ||||
|   * 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 | ||||
|  | ||||
| 2014-07-02 version 0.5.9: | ||||
|  | ||||
|   * Support std::tr1 unordered containers by default (#51, #63, #68, #69) | ||||
|   * Remove some warnings (#56) | ||||
|   * Fix segmentation fault after malloc failures (#58, #59) | ||||
|   * Fix alloc/dealloc mismatch (#52, #61) | ||||
|   * Fix sample codes (#60, #64) | ||||
|   * Support implicit conversion from integer to float/double (#54) | ||||
|   * Improve documents (#45, #75, #82, #83) | ||||
|   * Support CMake (#20, #87) | ||||
|   * Remove Ruby dependencies in bootstrap (#86, #87) | ||||
|   * Add FILE* buffer (#40) | ||||
|   * Other bug fixes and refactoring: #39, #73, #77, #79, #80, #81, #84, #90 | ||||
|  | ||||
| 2013-12-23 version 0.5.8: | ||||
|  | ||||
|   * Move to the new github repository msgpack/msgpack-c | ||||
|   * Support the new deserialization specification | ||||
|   * fixes the problem of unpack helpers for array and map with 32bit compilers (#37, #38) | ||||
|   * 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 | ||||
|  | ||||
| 2011-08-08 version 0.5.7: | ||||
|  | ||||
|   * fixes compile error problem with llvm-gcc and Mac OS X Lion | ||||
|  | ||||
| 2011-04-24 version 0.5.6: | ||||
|  | ||||
|   * #42 fixes double-free problem on msgpack_unpacker_release_zone | ||||
|  | ||||
| 2011-02-24 version 0.5.5: | ||||
|  | ||||
|   * eliminates dependency of winsock2.h header | ||||
|   * fixes msgpack_vc.postbuild.bat file | ||||
|   * fixes some implicit cast warnings | ||||
|  | ||||
| 2010-08-29 version 0.5.4: | ||||
|  | ||||
|   * includes msgpack_vc2008.vcproj file in source package | ||||
|   * fixes type::fix_int types | ||||
|  | ||||
| 2010-08-27 version 0.5.3: | ||||
|  | ||||
|   * adds type::fix_{u,}int{8,16,32,64} types | ||||
|   * adds msgpack_pack_fix_{u,}int{8,16,32,64} functions | ||||
|   * adds packer<Stream>::pack_fix_{u,}int{8,16,32,64} functions | ||||
|   * fixes include paths | ||||
|  | ||||
| 2010-07-14 version 0.5.2: | ||||
|  | ||||
|   * type::raw::str(), operator==, operator!=, operator< and operator> are now const | ||||
|   * generates version.h using AC_OUTPUT macro in ./configure | ||||
|  | ||||
| 2010-07-06 version 0.5.1: | ||||
|  | ||||
|   * Add msgpack_vrefbuffer_new and msgpack_vrefbuffer_free | ||||
|   * Add msgpack_sbuffer_new and msgpack_sbuffer_free | ||||
|   * Add msgpack_unpacker_next and msgpack_unpack_next | ||||
|   * msgpack::unpack returns void | ||||
|   * Add MSGPACK_VERSION{,_MAJOR,_MINOR} macros to check header version | ||||
|   * Add msgpack_version{,_major,_minor} functions to check library version | ||||
|   * ./configure supports --disable-cxx option not to build C++ API | ||||
|  | ||||
| 2010-04-29 version 0.5.0: | ||||
|  | ||||
|   * msgpack_object_type is changed. MSGPACK_OBJECT_NIL is now 0x00. | ||||
|   * New safe streaming deserializer API. | ||||
|   * Add object::object(const T&) and object::operator=(const T&) | ||||
|   * Add operator==(object, const T&) | ||||
|   * MSGPACK_DEFINE macro defines msgpack_object(object* obj, zone* z) | ||||
|   * C++ programs doesn't need to link "msgpackc" library. | ||||
							
								
								
									
										362
									
								
								CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										362
									
								
								CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,362 @@ | ||||
| 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) | ||||
| OPTION (MSGPACK_BOOST "Using boost libraries" OFF) | ||||
|  | ||||
| IF (APPLE) | ||||
|     SET(CMAKE_MACOSX_RPATH ON) | ||||
|     SET(CMAKE_SKIP_BUILD_RPATH FALSE) | ||||
|     SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) | ||||
|     SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib") | ||||
|     SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) | ||||
|     LIST(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/lib" isSystemDir) | ||||
|     IF ("${isSystemDir}" STREQUAL "-1") | ||||
|         SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib") | ||||
|     ENDIF () | ||||
| ENDIF () | ||||
|  | ||||
| IF (MSGPACK_CXX11) | ||||
|    IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") | ||||
|       SET (CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}") | ||||
|    ELSEIF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") | ||||
|       SET (CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}") | ||||
|    ELSEIF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") | ||||
|       IF (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 19) | ||||
|           MESSAGE ( FATAL_ERROR "MSVC doesn't support C++11.") | ||||
|       ENDIF () | ||||
|    ENDIF () | ||||
| ELSE () | ||||
|    IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") | ||||
|       SET (CMAKE_CXX_FLAGS "-std=c++03 ${CMAKE_CXX_FLAGS}") | ||||
|    ELSEIF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") | ||||
|       SET (CMAKE_CXX_FLAGS "-std=c++03 ${CMAKE_CXX_FLAGS}") | ||||
|    ELSEIF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") | ||||
|       IF (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 18) | ||||
|           SET (CMAKE_CXX_FLAGS "-DMSGPACK_USE_CPP03 ${CMAKE_CXX_FLAGS}") | ||||
|       ENDIF () | ||||
|    ENDIF () | ||||
| ENDIF () | ||||
|  | ||||
| IF (MSGPACK_32BIT) | ||||
|    IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") | ||||
|       SET (CMAKE_CXX_FLAGS "-m32 ${CMAKE_CXX_FLAGS}") | ||||
|       SET (CMAKE_C_FLAGS "-m32 ${CMAKE_C_FLAGS}") | ||||
|       SET (CMAKE_EXE_LINKER_FLAGS "-m32 ${CMAKE_EXE_LINKER_FLAGS}") | ||||
|    ELSEIF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") | ||||
|       SET (CMAKE_CXX_FLAGS "-m32 ${CMAKE_CXX_FLAGS}") | ||||
|       SET (CMAKE_C_FLAGS "-m32 ${CMAKE_C_FLAGS}") | ||||
|       SET (CMAKE_EXE_LINKER_FLAGS "-m32 ${CMAKE_EXE_LINKER_FLAGS}") | ||||
|    ENDIF () | ||||
| ENDIF () | ||||
|  | ||||
| IF (MSGPACK_BOOST) | ||||
|    SET (CMAKE_CXX_FLAGS "-DMSGPACK_USE_BOOST ${CMAKE_CXX_FLAGS}") | ||||
|    SET (Boost_USE_STATIC_LIBS        ON) # only find static libs | ||||
|    SET (Boost_USE_MULTITHREADED      ON) | ||||
|    SET (Boost_USE_STATIC_RUNTIME    OFF) | ||||
|    FIND_PACKAGE (Boost COMPONENTS chrono timer system) | ||||
|    INCLUDE_DIRECTORIES ( | ||||
|        ${MSGPACK_BOOST_DIR} | ||||
|    ) | ||||
| ENDIF () | ||||
|  | ||||
| FILE (GLOB_RECURSE PREDEF_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/external/boost/predef/include/boost ${CMAKE_CURRENT_SOURCE_DIR}/external/boost/predef/include/boost/*.h) | ||||
| FOREACH (F ${PREDEF_FILES}) | ||||
|    SET(M "Converting ${F}") | ||||
|    MESSAGE(STATUS ${M}) | ||||
|    FILE (READ ${CMAKE_CURRENT_SOURCE_DIR}/external/boost/predef/include/boost/${F} CONTENT) | ||||
|    STRING(REPLACE "BOOST_" "MSGPACK_" CONTENT ${CONTENT}) | ||||
|    STRING(REPLACE "boost/" "msgpack/" CONTENT ${CONTENT}) | ||||
|    FILE (WRITE ${CMAKE_CURRENT_SOURCE_DIR}/include/msgpack/${F} ${CONTENT}) | ||||
| ENDFOREACH () | ||||
|  | ||||
| FILE (GLOB_RECURSE PREPROCESSOR_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/external/boost/preprocessor/include/boost ${CMAKE_CURRENT_SOURCE_DIR}/external/boost/preprocessor/include/boost/*.hpp) | ||||
| FOREACH (F ${PREPROCESSOR_FILES}) | ||||
|    SET(M "Converting ${F}") | ||||
|    MESSAGE(STATUS ${M}) | ||||
|    FILE (READ ${CMAKE_CURRENT_SOURCE_DIR}/external/boost/preprocessor/include/boost/${F} CONTENT) | ||||
|    STRING(REPLACE "BOOST_" "MSGPACK_" CONTENT ${CONTENT}) | ||||
|    STRING(REPLACE "boost/" "msgpack/" CONTENT ${CONTENT}) | ||||
|    FILE (WRITE ${CMAKE_CURRENT_SOURCE_DIR}/include/msgpack/${F} ${CONTENT}) | ||||
| ENDFOREACH () | ||||
|  | ||||
| FIND_PACKAGE (GTest) | ||||
| FIND_PACKAGE (ZLIB) | ||||
| FIND_PACKAGE (Threads) | ||||
| IF (GTEST_FOUND AND ZLIB_FOUND AND THREADS_FOUND) | ||||
|     OPTION (MSGPACK_BUILD_TESTS "Build msgpack tests." ON) | ||||
| ENDIF () | ||||
| OPTION (MSGPACK_BUILD_EXAMPLES "Build msgpack examples." ON) | ||||
|  | ||||
| OPTION (MSGPACK_ENABLE_CXX "Enable C++ interface." ON) | ||||
| OPTION (MSGPACK_ENABLE_SHARED "Build shared libaries in addition to static libraries." ON) | ||||
|  | ||||
| INCLUDE (CheckCXXSourceCompiles) | ||||
| CHECK_CXX_SOURCE_COMPILES (" | ||||
| #include <bits/atomicity.h> | ||||
| int atomic_sub(int i) { return __gnu_cxx::__exchange_and_add(&i, -1) - 1; } | ||||
| int atomic_add(int i) { return __gnu_cxx::__exchange_and_add(&i, 1) + 1; } | ||||
| int main(int argc, char * argv[]) | ||||
| { | ||||
|     atomic_sub(1); | ||||
|     atomic_add(1); | ||||
| } | ||||
| " MSGPACK_ENABLE_GCC_CXX_ATOMIC) | ||||
|  | ||||
| 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.h | ||||
|     include/msgpack/sbuffer.h | ||||
|     include/msgpack/version.h | ||||
|     include/msgpack/version_master.h | ||||
|     include/msgpack/vrefbuffer.h | ||||
|     include/msgpack/zbuffer.h | ||||
|     include/msgpack/fbuffer.h | ||||
|     include/msgpack/pack.h | ||||
|     include/msgpack/unpack.h | ||||
|     include/msgpack/object.h | ||||
|     include/msgpack/zone.h | ||||
| ) | ||||
|  | ||||
| FILE (GLOB_RECURSE PREDEF_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/include/msgpack/predef/*.h) | ||||
|  | ||||
| LIST (APPEND msgpack_HEADERS ${PREDEF_FILES}) | ||||
| LIST (APPEND msgpack_HEADERS include/msgpack/predef.h) | ||||
|  | ||||
| IF (MSGPACK_ENABLE_CXX) | ||||
|     LIST (APPEND msgpack_HEADERS | ||||
|         include/msgpack.hpp | ||||
|         include/msgpack/adaptor/adaptor_base.hpp | ||||
|         include/msgpack/adaptor/array_ref.hpp | ||||
|         include/msgpack/adaptor/bool.hpp | ||||
|         include/msgpack/adaptor/boost/fusion.hpp | ||||
|         include/msgpack/adaptor/boost/msgpack_variant.hpp | ||||
|         include/msgpack/adaptor/boost/optional.hpp | ||||
|         include/msgpack/adaptor/boost/string_ref.hpp | ||||
|         include/msgpack/adaptor/char_ptr.hpp | ||||
|         include/msgpack/adaptor/check_container_size.hpp | ||||
|         include/msgpack/adaptor/cpp11/array.hpp | ||||
|         include/msgpack/adaptor/cpp11/array_char.hpp | ||||
|         include/msgpack/adaptor/cpp11/array_unsigned_char.hpp | ||||
|         include/msgpack/adaptor/cpp11/forward_list.hpp | ||||
|         include/msgpack/adaptor/cpp11/reference_wrapper.hpp | ||||
|         include/msgpack/adaptor/cpp11/shared_ptr.hpp | ||||
|         include/msgpack/adaptor/cpp11/tuple.hpp | ||||
|         include/msgpack/adaptor/cpp11/unique_ptr.hpp | ||||
|         include/msgpack/adaptor/cpp11/unordered_map.hpp | ||||
|         include/msgpack/adaptor/cpp11/unordered_set.hpp | ||||
|         include/msgpack/adaptor/define.hpp | ||||
|         include/msgpack/adaptor/deque.hpp | ||||
|         include/msgpack/adaptor/detail/cpp03_define_array.hpp | ||||
|         include/msgpack/adaptor/detail/cpp03_define_map.hpp | ||||
|         include/msgpack/adaptor/detail/cpp03_msgpack_tuple.hpp | ||||
|         include/msgpack/adaptor/detail/cpp11_define_array.hpp | ||||
|         include/msgpack/adaptor/detail/cpp11_define_map.hpp | ||||
|         include/msgpack/adaptor/detail/cpp11_msgpack_tuple.hpp | ||||
|         include/msgpack/adaptor/ext.hpp | ||||
|         include/msgpack/adaptor/fixint.hpp | ||||
|         include/msgpack/adaptor/float.hpp | ||||
|         include/msgpack/adaptor/int.hpp | ||||
|         include/msgpack/adaptor/list.hpp | ||||
|         include/msgpack/adaptor/map.hpp | ||||
|         include/msgpack/adaptor/msgpack_tuple.hpp | ||||
|         include/msgpack/adaptor/nil.hpp | ||||
|         include/msgpack/adaptor/pair.hpp | ||||
|         include/msgpack/adaptor/raw.hpp | ||||
|         include/msgpack/adaptor/v4raw.hpp | ||||
|         include/msgpack/adaptor/set.hpp | ||||
|         include/msgpack/adaptor/string.hpp | ||||
|         include/msgpack/adaptor/tr1/unordered_map.hpp | ||||
|         include/msgpack/adaptor/tr1/unordered_set.hpp | ||||
|         include/msgpack/adaptor/vector.hpp | ||||
|         include/msgpack/adaptor/vector_bool.hpp | ||||
|         include/msgpack/adaptor/vector_char.hpp | ||||
|         include/msgpack/adaptor/vector_unsigned_char.hpp | ||||
|         include/msgpack/cpp_config.hpp | ||||
|         include/msgpack/detail/cpp03_zone.hpp | ||||
|         include/msgpack/detail/cpp11_zone.hpp | ||||
|         include/msgpack/fbuffer.hpp | ||||
|         include/msgpack/iterator.hpp | ||||
|         include/msgpack/meta.hpp | ||||
|         include/msgpack/object.hpp | ||||
|         include/msgpack/object_fwd.hpp | ||||
|         include/msgpack/pack.hpp | ||||
|         include/msgpack/sbuffer.hpp | ||||
|         include/msgpack/type.hpp | ||||
|         include/msgpack/unpack.hpp | ||||
|         include/msgpack/version.hpp | ||||
|         include/msgpack/versioning.hpp | ||||
|         include/msgpack/vrefbuffer.hpp | ||||
|         include/msgpack/zbuffer.hpp | ||||
|         include/msgpack/zone.hpp | ||||
|     ) | ||||
|     FILE (GLOB_RECURSE PREPROCESSOR_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/include/msgpack/preprocessor/*.hpp) | ||||
|  | ||||
|     LIST (APPEND msgpack_HEADERS ${PREPROCESSOR_FILES}) | ||||
|     LIST (APPEND msgpack_HEADERS include/msgpack/preprocessor.hpp) | ||||
| ENDIF () | ||||
|  | ||||
| EXECUTE_PROCESS ( | ||||
|     COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/src/msgpack | ||||
| ) | ||||
|  | ||||
| CONFIGURE_FILE ( | ||||
|     msgpack.pc.in | ||||
|     msgpack.pc | ||||
|     @ONLY | ||||
| ) | ||||
|  | ||||
| INCLUDE_DIRECTORIES ( | ||||
|     ./ | ||||
|     include/ | ||||
|     ${CMAKE_CURRENT_BINARY_DIR}/include/ | ||||
| ) | ||||
|  | ||||
| IF (MSGPACK_ENABLE_SHARED) | ||||
|     ADD_LIBRARY (msgpack SHARED | ||||
|         ${msgpack_SOURCES} | ||||
|         ${msgpack_HEADERS} | ||||
|     ) | ||||
| ENDIF () | ||||
|  | ||||
| ADD_LIBRARY (msgpack-static STATIC | ||||
|     ${msgpack_SOURCES} | ||||
|     ${msgpack_HEADERS} | ||||
| ) | ||||
|  | ||||
| SET_TARGET_PROPERTIES (msgpack-static PROPERTIES OUTPUT_NAME "msgpack") | ||||
| IF (MSGPACK_ENABLE_SHARED) | ||||
|     SET_TARGET_PROPERTIES (msgpack PROPERTIES IMPORT_SUFFIX "_import.lib") | ||||
|     SET_TARGET_PROPERTIES (msgpack PROPERTIES SOVERSION 3 VERSION 4.0.0) | ||||
| ENDIF () | ||||
|  | ||||
| IF (MSGPACK_BUILD_TESTS) | ||||
|     ENABLE_TESTING () | ||||
|     # MEMORYCHECK_COMMAND_OPTIONS needs to place prior to CTEST_MEMORYCHECK_COMMAND | ||||
|     SET (MEMORYCHECK_COMMAND_OPTIONS "--leak-check=full --show-leak-kinds=definite,possible --error-exitcode=1") | ||||
|     FIND_PROGRAM(CTEST_MEMORYCHECK_COMMAND NAMES valgrind) | ||||
|     INCLUDE(Dart) | ||||
|     ADD_SUBDIRECTORY (test) | ||||
| ENDIF () | ||||
|  | ||||
| IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") | ||||
|     IF (MSGPACK_ENABLE_SHARED) | ||||
|         SET_PROPERTY (TARGET msgpack APPEND_STRING PROPERTY COMPILE_FLAGS "-Wall -Wextra -Wno-mismatched-tags -Werror -g -O3 -DPIC") | ||||
|     ENDIF () | ||||
|     SET_PROPERTY (TARGET msgpack-static APPEND_STRING PROPERTY COMPILE_FLAGS "-Wall -Wextra -Wno-mismatched-tags -Werror -g -O3" ) | ||||
| ENDIF () | ||||
| IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") | ||||
|     IF (CMAKE_CXX_FLAGS MATCHES "/W[0-4]") | ||||
|         STRING(REGEX REPLACE "/W[0-4]" "/W3 /WX" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") | ||||
|     ELSE () | ||||
|         SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3 /WX") | ||||
|     ENDIF () | ||||
| ENDIF () | ||||
|  | ||||
| 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 () | ||||
|  | ||||
| IF (MSGPACK_BUILD_EXAMPLES) | ||||
|     ADD_SUBDIRECTORY (example) | ||||
| ENDIF () | ||||
|  | ||||
| IF (MSGPACK_ENABLE_SHARED) | ||||
|     SET (MSGPACK_INSTALLTARGETS msgpack msgpack-static) | ||||
| ELSE() | ||||
|     SET (MSGPACK_INSTALLTARGETS msgpack-static) | ||||
| ENDIF () | ||||
|  | ||||
| INSTALL (TARGETS ${MSGPACK_INSTALLTARGETS} DESTINATION ${CMAKE_INSTALL_LIBDIR}) | ||||
| INSTALL (DIRECTORY include DESTINATION ${CMAKE_INSTALL_PREFIX}) | ||||
| IF (NOT MSVC) | ||||
|     INSTALL (FILES ${CMAKE_CURRENT_BINARY_DIR}/msgpack.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) | ||||
| ENDIF () | ||||
|  | ||||
| # Doxygen | ||||
| FIND_PACKAGE (Doxygen) | ||||
| IF (DOXYGEN_FOUND) | ||||
|     LIST (APPEND Doxyfile_c_CONTENT | ||||
|         COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_c | ||||
|         COMMAND ${CMAKE_COMMAND} -E echo "FILE_PATTERNS      = *.h" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_c | ||||
|         COMMAND ${CMAKE_COMMAND} -E echo "OUTPUT_DIRECTORY   = doc_c" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_c | ||||
|         COMMAND ${CMAKE_COMMAND} -E echo "INPUT              = ${CMAKE_CURRENT_SOURCE_DIR}/include" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_c | ||||
|         COMMAND ${CMAKE_COMMAND} -E echo "EXTRACT_ALL        = YES" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_c | ||||
|         COMMAND ${CMAKE_COMMAND} -E echo "PROJECT_NAME       = \"MessagePack for C\"" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_c | ||||
|     ) | ||||
|     IF (DOXYGEN_DOT_FOUND) | ||||
|         LIST (APPEND Doxyfile_c_CONTENT | ||||
|             COMMAND ${CMAKE_COMMAND} -E echo "HAVE_DOT       = YES" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_c | ||||
|         ) | ||||
|     ENDIF () | ||||
|     ADD_CUSTOM_TARGET ( | ||||
|         doxygen_c | ||||
|         ${Doxyfile_c_CONTENT} | ||||
|         COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_c | ||||
|         VERBATIM | ||||
|     ) | ||||
|     LIST (APPEND Doxyfile_cpp_CONTENT | ||||
|         COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_cpp | ||||
|         COMMAND ${CMAKE_COMMAND} -E echo "FILE_PATTERNS      = *.hpp" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_cpp | ||||
|         COMMAND ${CMAKE_COMMAND} -E echo "OUTPUT_DIRECTORY   = doc_cpp" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_cpp | ||||
|         COMMAND ${CMAKE_COMMAND} -E echo "INPUT              = ${CMAKE_CURRENT_SOURCE_DIR}/include" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_cpp | ||||
|         COMMAND ${CMAKE_COMMAND} -E echo "EXTRACT_ALL        = YES" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_cpp | ||||
|     ) | ||||
|     IF (DOXYGEN_DOT_FOUND) | ||||
|         LIST (APPEND Doxyfile_cpp_CONTENT | ||||
|             COMMAND ${CMAKE_COMMAND} -E echo "HAVE_DOT       = YES" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_cpp | ||||
|         ) | ||||
|     ENDIF () | ||||
|     ADD_CUSTOM_TARGET ( | ||||
|         doxygen_cpp | ||||
|         ${Doxyfile_cpp_CONTENT} | ||||
|         COMMAND ${CMAKE_COMMAND} -E echo "PROJECT_NAME       = \"MessagePack for C++\"" >> ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_cpp | ||||
|         COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile_cpp | ||||
|         VERBATIM | ||||
|     ) | ||||
|     ADD_CUSTOM_TARGET ( | ||||
|         doxygen | ||||
|         DEPENDS doxygen_c doxygen_cpp | ||||
|     ) | ||||
| ENDIF () | ||||
							
								
								
									
										5
									
								
								COPYING
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								COPYING
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| Copyright (C) 2008-2015 FURUHASHI Sadayuki | ||||
|  | ||||
|    Distributed under the Boost Software License, Version 1.0. | ||||
|    (See accompanying file LICENSE_1_0.txt or copy at | ||||
|    http://www.boost.org/LICENSE_1_0.txt) | ||||
							
								
								
									
										23
									
								
								LICENSE_1_0.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								LICENSE_1_0.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -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. | ||||
| @@ -2,17 +2,18 @@ SUBDIRS = src test | ||||
| 
 | ||||
| DOC_FILES = \
 | ||||
| 		README.md \
 | ||||
| 		LICENSE \
 | ||||
| 		LICENSE_1_0.txt \
 | ||||
| 		NOTICE \
 | ||||
| 		msgpack_vc8.vcproj \
 | ||||
| 		msgpack_vc8.sln \
 | ||||
| 		msgpack_vc8.postbuild.bat | ||||
| 		msgpack_vc8.sln | ||||
| 
 | ||||
| EXTRA_DIST = \
 | ||||
| 		$(DOC_FILES) | ||||
| 		$(DOC_FILES) CMakeLists.txt test/CMakeLists.txt example | ||||
| 
 | ||||
| pkgconfigdir = $(libdir)/pkgconfig | ||||
| pkgconfig_DATA = msgpack.pc | ||||
| 
 | ||||
| doxygen: | ||||
| 	./preprocess clean | ||||
| 	cd src && $(MAKE) doxygen | ||||
| 	./preprocess | ||||
| 
 | ||||
							
								
								
									
										14
									
								
								NOTICE
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								NOTICE
									
									
									
									
									
										Normal file
									
								
							| @@ -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
									
								
								QUICKSTART-C.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										194
									
								
								QUICKSTART-C.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,194 @@ | ||||
| # Implementation Status | ||||
|  | ||||
| The serialization library is production-ready. | ||||
|  | ||||
| Currently, RPC implementation is not available. | ||||
|  | ||||
| # Install | ||||
|  | ||||
|  | ||||
| ## Mac OS X with MacPorts | ||||
|  | ||||
| On Mac OS X, you can install MessagePack for C using MacPorts. | ||||
|  | ||||
| ``` | ||||
| $ sudo port install msgpack | ||||
| ``` | ||||
|  | ||||
| You might need to run `sudo port selfupdate` before installing to update the package repository. | ||||
|  | ||||
| You can also install via Homebrew. | ||||
|  | ||||
| ``` | ||||
| $ sudo brew install msgpack | ||||
| ``` | ||||
|  | ||||
| ## FreeBSD with Ports Collection | ||||
|  | ||||
| On FreeBSD, you can use Ports Collection. Install [net/msgpack|http://www.freebsd.org/cgi/cvsweb.cgi/ports/devel/msgpack/] package. | ||||
|  | ||||
| ## Gentoo Linux with Portage | ||||
|  | ||||
| On Gentoo Linux, you can use emerge. Install [dev-libs/msgpack|http://gentoo-portage.com/dev-libs/msgpack] package. | ||||
|  | ||||
| ## Other UNIX-like platform with ./configure | ||||
|  | ||||
| On the other UNIX-like platforms, download source package from [Releases|http://msgpack.org/releases/cpp/] and run `./configure && make && make install`. | ||||
|  | ||||
| ``` | ||||
| $ wget http://msgpack.org/releases/cpp/msgpack-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 | ||||
|          */ | ||||
| } | ||||
| ``` | ||||
							
								
								
									
										159
									
								
								QUICKSTART-CPP.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										159
									
								
								QUICKSTART-CPP.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,159 @@ | ||||
| # 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); | ||||
| } | ||||
| ``` | ||||
							
								
								
									
										224
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										224
									
								
								README.md
									
									
									
									
									
								
							| @@ -1,37 +1,219 @@ | ||||
| MessagePack | ||||
| =========== | ||||
| Extremely efficient object serialization library. It's like JSON, but very fast and small. | ||||
| `msgpack` for C/C++ | ||||
| =================== | ||||
|  | ||||
| Version 1.3.0 [](https://travis-ci.org/msgpack/msgpack-c) [](https://ci.appveyor.com/project/redboltz/msgpack-c/branch/master) | ||||
|  | ||||
| ## What's MessagePack? | ||||
| It's like JSON but small and fast. | ||||
|  | ||||
| MessagePack is a binary-based efficient object serialization library. It enables to exchange structured objects between many languages like JSON. But unlike JSON, it is very fast and small. | ||||
| Overview | ||||
| -------- | ||||
|  | ||||
| Typical small integer (like flags or error code) is saved only in 1 byte, and typical short string only needs 1 byte except the length of the string itself. \[1,2,3\] (3 elements array) is serialized in 4 bytes using MessagePack as follows: | ||||
| [MessagePack](http://msgpack.org/) is an efficient binary serialization | ||||
| format, which lets you exchange data among multiple languages like JSON, | ||||
| except that it's faster and smaller. Small integers are encoded into a | ||||
| single byte while typical short strings require only one extra byte in | ||||
| addition to the strings themselves. | ||||
|  | ||||
|     require 'msgpack' | ||||
|     msg = [1,2,3].to_msgpack  #=> "\x93\x01\x02\x03" | ||||
|     MessagePack.unpack(msg)   #=> [1,2,3] | ||||
| Example | ||||
| ------- | ||||
|  | ||||
| In C: | ||||
|  | ||||
| ## Performance | ||||
| ```c | ||||
| #include <msgpack.h> | ||||
| #include <stdio.h> | ||||
|  | ||||
|  | ||||
| int main(void) | ||||
| { | ||||
|     /* msgpack::sbuffer is a simple buffer implementation. */ | ||||
|     msgpack_sbuffer sbuf; | ||||
|     msgpack_sbuffer_init(&sbuf); | ||||
|  | ||||
| In this test, it measured the elapsed time of serializing and deserializing 200,000 target objects. The target object consists of the three integers and 512 bytes string. | ||||
| The source code of this test is available from [frsyuki' serializer-speed-test repository.](http://github.com/frsyuki/serializer-speed-test) | ||||
|     /* 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); | ||||
|  | ||||
| ## Getting Started | ||||
|     /* 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); | ||||
|  | ||||
| Usage and other documents about implementations in each language are found at [the web site.](http://msgpack.sourceforge.net/) | ||||
|     msgpack_object deserialized; | ||||
|     msgpack_unpack(sbuf.data, sbuf.size, NULL, &mempool, &deserialized); | ||||
|  | ||||
|     /* print the deserialized object. */ | ||||
|     msgpack_object_print(stdout, deserialized); | ||||
|     puts(""); | ||||
|  | ||||
| ## Learn More | ||||
|     msgpack_zone_destroy(&mempool); | ||||
|     msgpack_sbuffer_destroy(&sbuf); | ||||
|  | ||||
|   - [Project Web Site](http://msgpack.sourceforge.net/) | ||||
|   - [MessagePack format specification](http://msgpack.sourceforge.net/spec) | ||||
|   - [Repository at github](http://github.com/msgpack/msgpack) | ||||
|   - [Wiki](http://msgpack.sourceforge.net/start) | ||||
|   - [MessagePack-RPC](http://github.com/msgpack/msgpack-rpc) | ||||
|     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 | ||||
|  | ||||
| You can get addtional information on the | ||||
| [wiki](https://github.com/msgpack/msgpack-c/wiki). | ||||
|  | ||||
| Contributing | ||||
| ------------ | ||||
|  | ||||
| `msgpack-c` is developed on GitHub at [msgpack/msgpack-c](https://github.com/msgpack/msgpack-c). | ||||
| To report an issue or send a pull request, use the | ||||
| [issue tracker](https://github.com/msgpack/msgpack-c/issues). | ||||
|  | ||||
| Here's the list of [great contributors](https://github.com/msgpack/msgpack-c/graphs/contributors). | ||||
|  | ||||
| License | ||||
| ------- | ||||
|  | ||||
| `msgpack-c` is licensed under the Boost Software License, Version 1.0. See | ||||
| the [`LICENSE_1_0.txt`](./LICENSE_1_0.txt) file for details. | ||||
|   | ||||
							
								
								
									
										42
									
								
								appveyor.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								appveyor.yml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | ||||
| version: 1.1.0.{build} | ||||
| before_build: | ||||
| - appveyor DownloadFile http://googletest.googlecode.com/files/gtest-1.7.0.zip -FileName gtest-1.7.0.zip | ||||
| - 7z x gtest-1.7.0.zip > NUL | ||||
| - cd gtest-1.7.0 | ||||
| - md build | ||||
| - cd build | ||||
| - cmake -DBUILD_SHARED_LIBS=ON .. | ||||
| - cmake --build . --config Release | ||||
| - cd .. | ||||
| - cd .. | ||||
| - appveyor DownloadFile http://zlib.net/zlib-1.2.8.tar.gz -FileName zlib-1.2.8.tar.gz | ||||
| - 7z x zlib-1.2.8.tar.gz > NUL | ||||
| - 7z x zlib-1.2.8.tar > NUL | ||||
| - cd zlib-1.2.8 | ||||
| - md build | ||||
| - cd build | ||||
| - cmake .. | ||||
| - cmake --build . --config Release | ||||
| - copy zconf.h .. | ||||
| - cd .. | ||||
| - cd .. | ||||
|  | ||||
| environment: | ||||
|   matrix: | ||||
|     - cpp11: -DMSGPACK_CXX11=ON | ||||
|       boost: -DMSGPACK_BOOST=ON | ||||
|     - cpp11: -DMSGPACK_CXX11=OFF | ||||
|       boost: -DMSGPACK_BOOST=ON | ||||
|     - cpp11: -DMSGPACK_CXX11=ON | ||||
|       boost: -DMSGPACK_BOOST=OFF | ||||
|     - cpp11: -DMSGPACK_CXX11=OFF | ||||
|       boost: -DMSGPACK_BOOST=OFF | ||||
| build_script: | ||||
| - md build | ||||
| - cd build | ||||
| - cmake %cpp11% %boost% -DMSGPACK_BOOST_DIR=C:\Libraries\\boost_1_58_0 -DGTEST_LIBRARY=%APPVEYOR_BUILD_FOLDER%\gtest-1.7.0\build\Release\gtest.lib -DGTEST_MAIN_LIBRARY=%APPVEYOR_BUILD_FOLDER%\gtest-1.7.0\build\Release\gtest_main.lib -DGTEST_INCLUDE_DIR=%APPVEYOR_BUILD_FOLDER%\gtest-1.7.0\include -DZLIB_LIBRARY=%APPVEYOR_BUILD_FOLDER%\zlib-1.2.8\build\Release\zlib.lib -DZLIB_INCLUDE_DIR=%APPVEYOR_BUILD_FOLDER%\zlib-1.2.8 .. | ||||
| - cmake --build . --config Release | ||||
|  | ||||
| test_script: | ||||
| - set PATH=%PATH%;%APPVEYOR_BUILD_FOLDER%\gtest-1.7.0\build\Release;%APPVEYOR_BUILD_FOLDER%\zlib-1.2.8\build\Release;%APPVEYOR_BUILD_FOLDER%\build\release | ||||
| - ctest -V | ||||
| @@ -36,14 +36,9 @@ 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 | ||||
| 
 | ||||
| if ! ./preprocess; then | ||||
| 	exit 1 | ||||
| fi | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| ACLOCAL="aclocal" | ||||
| ACLOCAL_FILES="aclocal.m4" | ||||
| ALWAYS_CLEAN="config.status config.log config.cache libtool" | ||||
							
								
								
									
										63
									
								
								ci/build_autotools.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										63
									
								
								ci/build_autotools.sh
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,63 @@ | ||||
| #!/bin/sh | ||||
|  | ||||
| ./bootstrap | ||||
| ret=$? | ||||
| if [ $ret -ne 0 ] | ||||
| then | ||||
|     exit $ret | ||||
| fi | ||||
|  | ||||
| if [ $1 = "cpp11" ] | ||||
| then | ||||
|     cpp11="-std=c++11" | ||||
| else | ||||
|     cpp11="" | ||||
| fi | ||||
|  | ||||
| if [ $2 = "32" ] | ||||
| then | ||||
|     bit32="-m32" | ||||
| else | ||||
|     bit32="" | ||||
| fi | ||||
|  | ||||
| if [ $3 = "boost" ] | ||||
| then | ||||
|     boost="-DMSGPACK_USE_BOOST" | ||||
| else | ||||
|     boost="" | ||||
| fi | ||||
|  | ||||
| ./configure CFLAGS="$bit32" CXXFLAGS="$bit32 $cpp11 $boost -I$4" | ||||
|  | ||||
| ret=$? | ||||
| if [ $ret -ne 0 ] | ||||
| then | ||||
|     exit $ret | ||||
| fi | ||||
|  | ||||
| make | ||||
|  | ||||
| ret=$? | ||||
| if [ $ret -ne 0 ] | ||||
| then | ||||
|     exit $ret | ||||
| fi | ||||
|  | ||||
| make check | ||||
|  | ||||
| ret=$? | ||||
| if [ $ret -ne 0 ] | ||||
| then | ||||
|     exit $ret | ||||
| fi | ||||
|  | ||||
| make install DESTDIR=`pwd`/build/install | ||||
|  | ||||
| ret=$? | ||||
| if [ $ret -ne 0 ] | ||||
| then | ||||
|     exit $ret | ||||
| fi | ||||
|  | ||||
| exit 0 | ||||
							
								
								
									
										103
									
								
								ci/build_cmake.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										103
									
								
								ci/build_cmake.sh
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,103 @@ | ||||
| #!/bin/bash | ||||
|  | ||||
| mkdir build | ||||
|  | ||||
| ret=$? | ||||
| if [ $ret -ne 0 ] | ||||
| then | ||||
|     exit $ret | ||||
| fi | ||||
|  | ||||
| cd build | ||||
|  | ||||
| ret=$? | ||||
| if [ $ret -ne 0 ] | ||||
| then | ||||
|     exit $ret | ||||
| fi | ||||
|  | ||||
| if [ $1 = "cpp11" ] | ||||
| then | ||||
|     cpp11="-DMSGPACK_CXX11=ON" | ||||
| else | ||||
|     cpp11="" | ||||
| fi | ||||
|  | ||||
| if [ $2 = "32" ] | ||||
| then | ||||
|     bit32="-DMSGPACK_32BIT=ON" | ||||
| else | ||||
|     bit32="" | ||||
| fi | ||||
|  | ||||
| if [ $3 = "boost" ] | ||||
| then | ||||
|     boost="-DMSGPACK_BOOST=ON" | ||||
| else | ||||
|     boost="" | ||||
| fi | ||||
|  | ||||
| if [ "$4" != "" ] | ||||
| then | ||||
|     boost_dir="-DMSGPACK_BOOST_DIR=$4" | ||||
| else | ||||
|     boost_dir="" | ||||
| fi | ||||
|  | ||||
| if [ "$5" = "OFF" ] | ||||
| then | ||||
|     shared="-DMSGPACK_ENABLE_SHARED=OFF" | ||||
| else | ||||
|     shared="" | ||||
| fi | ||||
|  | ||||
| cmake $cpp11 $bit32 $boost $boost_dir $shared .. | ||||
|  | ||||
| ret=$? | ||||
| if [ $ret -ne 0 ] | ||||
| then | ||||
|     exit $ret | ||||
| fi | ||||
|  | ||||
| make | ||||
|  | ||||
| ret=$? | ||||
| if [ $ret -ne 0 ] | ||||
| then | ||||
|     exit $ret | ||||
| fi | ||||
|  | ||||
| make test | ||||
|  | ||||
| ret=$? | ||||
| if [ $ret -ne 0 ] | ||||
| then | ||||
|     exit $ret | ||||
| fi | ||||
|  | ||||
| make install DESTDIR=`pwd`/install | ||||
|  | ||||
| ret=$? | ||||
| if [ $ret -ne 0 ] | ||||
| then | ||||
|     exit $ret | ||||
| fi | ||||
|  | ||||
| if [ "$2" != "32" ] | ||||
| then | ||||
|     ctest -T memcheck | tee memcheck.log | ||||
|  | ||||
|     ret=${PIPESTATUS[0]} | ||||
|     if [ $ret -ne 0 ] | ||||
|     then | ||||
|         exit $ret | ||||
|     fi | ||||
|     cat memcheck.log | grep "Memory Leak" > /dev/null | ||||
|     ret=$? | ||||
|     if [ $ret -eq 0 ] | ||||
|     then | ||||
|         exit 1 | ||||
|     fi | ||||
| fi | ||||
|  | ||||
| exit 0 | ||||
							
								
								
									
										98
									
								
								configure.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										98
									
								
								configure.in
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,98 @@ | ||||
| AC_INIT(msgpack, m4_esyscmd([cat include/msgpack/version_master.h | tr -d "\n" | sed -e 's/#define MSGPACK_VERSION_MAJOR[[:space:]]*\([[:alnum:]]*\)/\1./g' -e 's/#define MSGPACK_VERSION_MINOR[[:space:]]*\([[:alnum:]]*\)/\1./g' -e 's/#define MSGPACK_VERSION_REVISION[[:space:]]*\([[:alnum:]]*\)/\1/g' | tr -d "\n"])) | ||||
| AC_CONFIG_AUX_DIR(ac) | ||||
| AM_INIT_AUTOMAKE | ||||
| AC_CONFIG_HEADER(config.h) | ||||
| AC_SUBST(CFLAGS) | ||||
| CFLAGS="-O3 -Wall -Wextra -Werror $CFLAGS" | ||||
|  | ||||
| AC_SUBST(CXXFLAGS) | ||||
| CXXFLAGS="-O3 -Wall -Wextra -Wno-mismatched-tags -Werror $CXXFLAGS" | ||||
|  | ||||
|  | ||||
| AC_PROG_CC | ||||
|  | ||||
|  | ||||
| AC_MSG_CHECKING([if C++ API is enabled]) | ||||
| AC_ARG_ENABLE(cxx, | ||||
|     AS_HELP_STRING([--disable-cxx], | ||||
|                    [don't build C++ API]) )   #' | ||||
| AC_MSG_RESULT([$enable_cxx]) | ||||
| if test "$enable_cxx" != "no"; then | ||||
|     AC_PROG_CXX | ||||
|     AM_PROG_CC_C_O | ||||
| fi | ||||
| AM_CONDITIONAL(ENABLE_CXX, test "$enable_cxx" != "no") | ||||
|  | ||||
|  | ||||
| AC_PROG_LIBTOOL | ||||
| AM_PROG_AS | ||||
|  | ||||
|  | ||||
| AC_MSG_CHECKING([if debug option is enabled]) | ||||
| AC_ARG_ENABLE(debug, | ||||
|     AS_HELP_STRING([--disable-debug], | ||||
|                    [disable assert macros and omit -g option]) ) | ||||
| AC_MSG_RESULT([$enable_debug]) | ||||
| if test "$enable_debug" != "no"; then | ||||
|     CXXFLAGS="$CXXFLAGS -g" | ||||
|     CFLAGS="$CFLAGS -g" | ||||
| else | ||||
|     CXXFLAGS="$CXXFLAGS -DNDEBUG" | ||||
|     CFLAGS="$CFLAGS -DNDEBUG" | ||||
| fi | ||||
|  | ||||
|  | ||||
| AC_CACHE_CHECK([for __sync_* atomic operations], msgpack_cv_atomic_ops, [ | ||||
|     AC_TRY_LINK([ | ||||
|         int atomic_sub(int i) { return __sync_sub_and_fetch(&i, 1); } | ||||
|         int atomic_add(int i) { return __sync_add_and_fetch(&i, 1); } | ||||
|     ], [atomic_sub(1); atomic_add(1);], msgpack_cv_atomic_ops="yes") | ||||
| ]) | ||||
| if test "$msgpack_cv_atomic_ops" != "yes"; then | ||||
|     if test "$enable_cxx" = "no"; then | ||||
|         AC_MSG_ERROR([__sync_* atomic operations are not found. Try to enable C++ support. | ||||
| If you are using gcc >= 4.1 and the default target CPU architecture is "i386", try to | ||||
| add CFLAGS="-march=i686" and CXXFLAGS="-march=i686" options to ./configure as follows: | ||||
|  | ||||
|   $ ./configure CFLAGS="-march=i686" CXXFLAGS="-march=i686" | ||||
|         ]) | ||||
|     fi | ||||
|  | ||||
|     AC_LANG_PUSH([C++]) | ||||
|     AC_CACHE_CHECK([for __gnu_cxx::__exchange_and_add], msgpack_cv_gcc_cxx_atomic_ops, [ | ||||
|         AC_TRY_LINK([ | ||||
|             #include <bits/atomicity.h> | ||||
|             int atomic_sub(int i) { return __gnu_cxx::__exchange_and_add(&i, -1) - 1; } | ||||
|             int atomic_add(int i) { return __gnu_cxx::__exchange_and_add(&i, 1) + 1; } | ||||
|         ], [atomic_sub(1); atomic_add(1);], msgpack_cv_gcc_cxx_atomic_ops="yes") | ||||
|     ]) | ||||
|     AC_LANG_POP([C++]) | ||||
|  | ||||
|     if test "$msgpack_cv_gcc_cxx_atomic_ops" != "yes"; then | ||||
|         AC_MSG_ERROR([__sync_* atomic operations nor __gnu_cxx::__exchange_and_add are not found. | ||||
|  | ||||
| If you are using gcc >= 4.1 and the default target CPU architecture is "i386", try to | ||||
| add CFLAGS="-march=i686" and CXXFLAGS="-march=i686" options to ./configure as follows: | ||||
|  | ||||
|   $ ./configure CFLAGS="-march=i686" CXXFLAGS="-march=i686" | ||||
|         ]) | ||||
|  | ||||
|     else | ||||
|         enable_gcc_cxx_atomic=yes | ||||
|     fi | ||||
| fi | ||||
|  | ||||
| AM_CONDITIONAL(ENABLE_GCC_CXX_ATOMIC, test "$enable_gcc_cxx_atomic" = "yes") | ||||
|  | ||||
| major=`echo $VERSION | sed 's/\([[0-9]]*\)\.\([[0-9]]*\).\([[0-9]]*\).*/\1/'` | ||||
| minor=`echo $VERSION | sed 's/\([[0-9]]*\)\.\([[0-9]]*\).\([[0-9]]*\).*/\2/'` | ||||
| revision=`echo $VERSION | sed 's/\([[0-9]]*\)\.\([[0-9]]*\).\([[0-9]]*\).*/\3/'` | ||||
| AC_SUBST(VERSION_MAJOR, $major) | ||||
| AC_SUBST(VERSION_MINOR, $minor) | ||||
| AC_SUBST(VERSION_REVISION, $revision) | ||||
|  | ||||
|  | ||||
| AC_OUTPUT([Makefile | ||||
|            msgpack.pc | ||||
|            src/Makefile | ||||
|            test/Makefile]) | ||||
| @@ -1 +0,0 @@ | ||||
| FURUHASHI Sadayuki <frsyuki _at_ users.sourceforge.jp> | ||||
							
								
								
									
										14
									
								
								cpp/COPYING
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								cpp/COPYING
									
									
									
									
									
								
							| @@ -1,14 +0,0 @@ | ||||
| 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. | ||||
|  | ||||
| @@ -1,32 +0,0 @@ | ||||
|  | ||||
| 2010-07-27 version 0.5.3: | ||||
|  | ||||
|   * adds type::fix_{u,}int{8,16,32,64} types | ||||
|   * adds msgpack_pack_fix_{u,}int{8,16,32,64} functions | ||||
|   * adds packer<Stream>::pack_fix_{u,}int{8,16,32,64} functions | ||||
|   * fixes include paths | ||||
|  | ||||
| 2010-07-14 version 0.5.2: | ||||
|  | ||||
|   * type::raw::str(), operator==, operator!=, operator< and operator> are now const | ||||
|   * generates version.h using AC_OUTPUT macro in ./configure | ||||
|  | ||||
| 2010-07-06 version 0.5.1: | ||||
|  | ||||
|   * Add msgpack_vrefbuffer_new and msgpack_vrefbuffer_free | ||||
|   * Add msgpack_sbuffer_new and msgpack_sbuffer_free | ||||
|   * Add msgpack_unpacker_next and msgpack_unpack_next | ||||
|   * msgpack::unpack returns void | ||||
|   * Add MSGPACK_VERSION{,_MAJOR,_MINOR} macros to check header version | ||||
|   * Add msgpack_version{,_major,_minor} functions to check library version | ||||
|   * ./configure supports --disable-cxx option not to build C++ API | ||||
|  | ||||
| 2010-04-29 version 0.5.0: | ||||
|  | ||||
|   * msgpack_object_type is changed. MSGPACK_OBJECT_NIL is now 0x00. | ||||
|   * New safe streaming deserializer API. | ||||
|   * Add object::object(const T&) and object::operator=(const T&) | ||||
|   * Add operator==(object, const T&) | ||||
|   * MSGPACK_DEFINE macro defines msgpack_object(object* obj, zone* z) | ||||
|   * C++ programs doesn't need to link "msgpackc" library. | ||||
|  | ||||
							
								
								
									
										202
									
								
								cpp/LICENSE
									
									
									
									
									
								
							
							
						
						
									
										202
									
								
								cpp/LICENSE
									
									
									
									
									
								
							| @@ -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. | ||||
| @@ -1,4 +0,0 @@ | ||||
| MessagePack is developed by FURUHASHI Sadayuki, licensed under Apache License, | ||||
| Version 2.0. The original software and related information is available at | ||||
| http://msgpack.sourceforge.jp/. | ||||
|  | ||||
| @@ -1,78 +0,0 @@ | ||||
| MessagePack for C/C++ | ||||
| ===================== | ||||
| Binary-based efficient object serialization library. | ||||
|  | ||||
|  | ||||
| ## Installation | ||||
|  | ||||
| Download latest package from [releases of MessagePack](http://sourceforge.net/projects/msgpack/files/) and extract it. | ||||
|  | ||||
| On UNIX-like platform, run ./configure && make && sudo make install: | ||||
|  | ||||
|     $ ./configure | ||||
|     $ make | ||||
|     $ sudo make install | ||||
|  | ||||
| On Windows, open msgpack_vc8.vcproj file and build it using batch build. DLLs are built on lib folder, and the headers are built on include folder. | ||||
|  | ||||
| To use the library in your program, include msgpack.hpp header and link msgpack and msgpackc library. | ||||
|  | ||||
|  | ||||
| ## Example | ||||
|  | ||||
|     #include <msgpack.hpp> | ||||
|     #include <vector> | ||||
|      | ||||
|     int main(void) { | ||||
|         // This is target object. | ||||
|         std::vector<std::string> target; | ||||
|         target.push_back("Hello,"); | ||||
|         target.push_back("World!"); | ||||
|      | ||||
|         // Serialize it. | ||||
|         msgpack::sbuffer buffer;  // simple buffer | ||||
|         msgpack::pack(&buffer, target); | ||||
|      | ||||
|         // Deserialize the serialized data. | ||||
|         msgpack::zone mempool;    // this manages the life of deserialized object | ||||
|         msgpack::object obj; | ||||
|         msgpack::unpack_return ret = | ||||
|                 msgpack::unpack(buffer.data, buffer.size, NULL, &mempool, &obj); | ||||
|      | ||||
|         if(ret != msgapck::UNPACK_SUCCESS) { | ||||
|             // error check | ||||
|             exit(1); | ||||
|         } | ||||
|      | ||||
|         // Print the deserialized object to stdout. | ||||
|         std::cout << obj << std::endl;    // ["Hello," "World!"] | ||||
|      | ||||
|         // Convert the deserialized object to staticaly typed object. | ||||
|         std::vector<std::string> result; | ||||
|         obj.convert(&result); | ||||
|      | ||||
|         // If the type is mismatched, it throws msgpack::type_error. | ||||
|         obj.as<int>();  // type is mismatched, msgpack::type_error is thrown | ||||
|     } | ||||
|  | ||||
| API document and other example codes are available at the [wiki.](http://msgpack.sourceforge.net/start) | ||||
|  | ||||
|  | ||||
| ## License | ||||
|  | ||||
| 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. | ||||
|  | ||||
| See also NOTICE file. | ||||
|  | ||||
| @@ -1,75 +0,0 @@ | ||||
| AC_INIT(src/object.cpp) | ||||
| AC_CONFIG_AUX_DIR(ac) | ||||
| AM_INIT_AUTOMAKE(msgpack, 0.5.3) | ||||
| AC_CONFIG_HEADER(config.h) | ||||
|  | ||||
| AC_SUBST(CFLAGS) | ||||
| CFLAGS="-O4 -Wall $CFLAGS" | ||||
|  | ||||
| AC_SUBST(CXXFLAGS) | ||||
| CXXFLAGS="-O4 -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); } | ||||
| 	], [], msgpack_cv_atomic_ops="yes") | ||||
| 	]) | ||||
| if test "$msgpack_cv_atomic_ops" != "yes"; then | ||||
| 	AC_MSG_ERROR([__sync_* atomic operations are not supported. | ||||
|  | ||||
| Note that gcc < 4.1 is not supported. | ||||
|  | ||||
| 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 | ||||
|  | ||||
|  | ||||
| major=`echo $VERSION | sed 's/\([[0-9]]*\)\.\([[0-9]]*\).*/\1/'` | ||||
| minor=`echo $VERSION | sed 's/\([[0-9]]*\)\.\([[0-9]]*\).*/\2/'` | ||||
| AC_SUBST(VERSION_MAJOR, $major) | ||||
| AC_SUBST(VERSION_MINOR, $minor) | ||||
|  | ||||
|  | ||||
| AC_OUTPUT([Makefile | ||||
| 		   src/Makefile | ||||
| 		   src/msgpack/version.h | ||||
| 		   test/Makefile]) | ||||
|  | ||||
| @@ -1,45 +0,0 @@ | ||||
| IF NOT EXIST include                  MKDIR include | ||||
| IF NOT EXIST include\msgpack          MKDIR include\msgpack | ||||
| IF NOT EXIST include\msgpack\type     MKDIR include\msgpack\type | ||||
| IF NOT EXIST include\msgpack\type\tr1 MKDIR include\msgpack\type\tr1 | ||||
| copy src\msgpack\pack_define.h      include\msgpack\ | ||||
| copy src\msgpack\pack_template.h    include\msgpack\ | ||||
| copy src\msgpack\unpack_define.h    include\msgpack\ | ||||
| copy src\msgpack\unpack_template.h  include\msgpack\ | ||||
| copy src\msgpack\sysdep.h           include\msgpack\ | ||||
| copy src\msgpack.h                     include\ | ||||
| copy src\msgpack\sbuffer.h             include\msgpack\ | ||||
| copy src\msgpack\version.h             include\msgpack\ | ||||
| copy src\msgpack\vrefbuffer.h          include\msgpack\ | ||||
| copy src\msgpack\zbuffer.h             include\msgpack\ | ||||
| copy src\msgpack\pack.h                include\msgpack\ | ||||
| copy src\msgpack\unpack.h              include\msgpack\ | ||||
| copy src\msgpack\object.h              include\msgpack\ | ||||
| copy src\msgpack\zone.h                include\msgpack\ | ||||
| copy src\msgpack.hpp                   include\ | ||||
| copy src\msgpack\sbuffer.hpp           include\msgpack\ | ||||
| copy src\msgpack\vrefbuffer.hpp        include\msgpack\ | ||||
| copy src\msgpack\zbuffer.hpp           include\msgpack\ | ||||
| copy src\msgpack\pack.hpp              include\msgpack\ | ||||
| copy src\msgpack\unpack.hpp            include\msgpack\ | ||||
| copy src\msgpack\object.hpp            include\msgpack\ | ||||
| copy src\msgpack\zone.hpp              include\msgpack\ | ||||
| copy src\msgpack\type.hpp              include\msgpack\type\ | ||||
| copy src\msgpack\type\bool.hpp         include\msgpack\type\ | ||||
| copy src\msgpack\type\deque.hpp        include\msgpack\type\ | ||||
| copy src\msgpack\type\fixint.hpp       include\msgpack\type\ | ||||
| copy src\msgpack\type\float.hpp        include\msgpack\type\ | ||||
| copy src\msgpack\type\int.hpp          include\msgpack\type\ | ||||
| copy src\msgpack\type\list.hpp         include\msgpack\type\ | ||||
| copy src\msgpack\type\map.hpp          include\msgpack\type\ | ||||
| copy src\msgpack\type\nil.hpp          include\msgpack\type\ | ||||
| copy src\msgpack\type\pair.hpp         include\msgpack\type\ | ||||
| copy src\msgpack\type\raw.hpp          include\msgpack\type\ | ||||
| copy src\msgpack\type\set.hpp          include\msgpack\type\ | ||||
| copy src\msgpack\type\string.hpp       include\msgpack\type\ | ||||
| copy src\msgpack\type\vector.hpp       include\msgpack\type\ | ||||
| copy src\msgpack\type\tuple.hpp        include\msgpack\type\ | ||||
| copy src\msgpack\type\define.hpp       include\msgpack\type\ | ||||
| copy src\msgpack\type\tr1\unordered_map.hpp  include\msgpack\type\ | ||||
| copy src\msgpack\type\tr1\unordered_set.hpp  include\msgpack\type\ | ||||
|  | ||||
| @@ -1,31 +0,0 @@ | ||||
| #!/bin/sh | ||||
|  | ||||
| preprocess() { | ||||
| 	ruby -r erb -e 'puts ERB.new(ARGF.read).result' $1.erb > $1.tmp | ||||
| 	if [ "$?" != 0 ]; then | ||||
| 		echo "" | ||||
| 		echo "** preprocess failed **" | ||||
| 		echo "" | ||||
| 		exit 1 | ||||
| 	else | ||||
| 		mv $1.tmp $1 | ||||
| 	fi | ||||
| } | ||||
|  | ||||
| if [ "$1" == "clean" ];then | ||||
| 	rm -f src/msgpack/type/tuple.hpp | ||||
| 	rm -f src/msgpack/type/define.hpp | ||||
| 	rm -f src/msgpack/zone.hpp | ||||
| else | ||||
| 	preprocess src/msgpack/type/tuple.hpp | ||||
| 	preprocess src/msgpack/type/define.hpp | ||||
| 	preprocess src/msgpack/zone.hpp | ||||
| fi | ||||
| cp -f ../msgpack/sysdep.h          src/msgpack/ | ||||
| cp -f ../msgpack/pack_define.h     src/msgpack/ | ||||
| cp -f ../msgpack/pack_template.h   src/msgpack/ | ||||
| cp -f ../msgpack/unpack_define.h   src/msgpack/ | ||||
| cp -f ../msgpack/unpack_template.h src/msgpack/ | ||||
| cp -f ../test/cases.mpac           test/ | ||||
| cp -f ../test/cases_compact.mpac   test/ | ||||
|  | ||||
| @@ -1,101 +0,0 @@ | ||||
|  | ||||
| lib_LTLIBRARIES = libmsgpack.la | ||||
|  | ||||
| libmsgpack_la_SOURCES = \ | ||||
| 		unpack.c \ | ||||
| 		objectc.c \ | ||||
| 		version.c \ | ||||
| 		vrefbuffer.c \ | ||||
| 		zone.c | ||||
|  | ||||
| if ENABLE_CXX | ||||
| libmsgpack_la_SOURCES += \ | ||||
| 		object.cpp | ||||
| endif | ||||
|  | ||||
| # -version-info CURRENT:REVISION:AGE | ||||
| libmsgpack_la_LDFLAGS = -version-info 3:0:0 | ||||
|  | ||||
|  | ||||
| # backward compatibility | ||||
| lib_LTLIBRARIES += libmsgpackc.la | ||||
|  | ||||
| libmsgpackc_la_SOURCES = \ | ||||
| 		unpack.c \ | ||||
| 		objectc.c \ | ||||
| 		version.c \ | ||||
| 		vrefbuffer.c \ | ||||
| 		zone.c | ||||
|  | ||||
| libmsgpackc_la_LDFLAGS = -version-info 2:0:0 | ||||
|  | ||||
|  | ||||
| nobase_include_HEADERS = \ | ||||
| 		msgpack/pack_define.h \ | ||||
| 		msgpack/pack_template.h \ | ||||
| 		msgpack/unpack_define.h \ | ||||
| 		msgpack/unpack_template.h \ | ||||
| 		msgpack/sysdep.h \ | ||||
| 		msgpack.h \ | ||||
| 		msgpack/sbuffer.h \ | ||||
| 		msgpack/version.h \ | ||||
| 		msgpack/vrefbuffer.h \ | ||||
| 		msgpack/zbuffer.h \ | ||||
| 		msgpack/pack.h \ | ||||
| 		msgpack/unpack.h \ | ||||
| 		msgpack/object.h \ | ||||
| 		msgpack/zone.h | ||||
|  | ||||
| if ENABLE_CXX | ||||
| nobase_include_HEADERS += \ | ||||
| 		msgpack.hpp \ | ||||
| 		msgpack/sbuffer.hpp \ | ||||
| 		msgpack/vrefbuffer.hpp \ | ||||
| 		msgpack/zbuffer.hpp \ | ||||
| 		msgpack/pack.hpp \ | ||||
| 		msgpack/unpack.hpp \ | ||||
| 		msgpack/object.hpp \ | ||||
| 		msgpack/zone.hpp \ | ||||
| 		msgpack/type.hpp \ | ||||
| 		msgpack/type/bool.hpp \ | ||||
| 		msgpack/type/deque.hpp \ | ||||
| 		msgpack/type/float.hpp \ | ||||
| 		msgpack/type/fixint.hpp \ | ||||
| 		msgpack/type/int.hpp \ | ||||
| 		msgpack/type/list.hpp \ | ||||
| 		msgpack/type/map.hpp \ | ||||
| 		msgpack/type/nil.hpp \ | ||||
| 		msgpack/type/pair.hpp \ | ||||
| 		msgpack/type/raw.hpp \ | ||||
| 		msgpack/type/set.hpp \ | ||||
| 		msgpack/type/string.hpp \ | ||||
| 		msgpack/type/vector.hpp \ | ||||
| 		msgpack/type/tuple.hpp \ | ||||
| 		msgpack/type/define.hpp \ | ||||
| 		msgpack/type/tr1/unordered_map.hpp \ | ||||
| 		msgpack/type/tr1/unordered_set.hpp | ||||
| endif | ||||
|  | ||||
| EXTRA_DIST = \ | ||||
| 		msgpack/version.h.in \ | ||||
| 		msgpack/zone.hpp.erb \ | ||||
| 		msgpack/type/define.hpp.erb \ | ||||
| 		msgpack/type/tuple.hpp.erb | ||||
|  | ||||
|  | ||||
| doxygen_c: | ||||
| 	cat ../Doxyfile > Doxyfile_c | ||||
| 	echo "FILE_PATTERNS      = *.h" >> Doxyfile_c | ||||
| 	echo "OUTPUT_DIRECTORY   = doc_c" >> Doxyfile_c | ||||
| 	echo "PROJECT_NAME       = \"MessagePack for C\"" >> Doxyfile_c | ||||
| 	doxygen Doxyfile_c | ||||
|  | ||||
| doxygen_cpp: | ||||
| 	cat ../Doxyfile > Doxyfile_cpp | ||||
| 	echo "FILE_PATTERNS      = *.hpp" >> Doxyfile_cpp | ||||
| 	echo "OUTPUT_DIRECTORY   = doc_cpp" >> Doxyfile_cpp | ||||
| 	echo "PROJECT_NAME       = \"MessagePack for C++\"" >> Doxyfile_cpp | ||||
| 	doxygen Doxyfile_cpp | ||||
|  | ||||
| doxygen: doxygen_c doxygen_cpp | ||||
|  | ||||
| @@ -1,30 +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/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,24 +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/zone.hpp" | ||||
| #include "msgpack/pack.hpp" | ||||
| #include "msgpack/unpack.hpp" | ||||
| #include "msgpack/sbuffer.hpp" | ||||
| #include "msgpack/vrefbuffer.hpp" | ||||
| #include "msgpack.h" | ||||
| @@ -1,98 +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_DOUBLE				= 0x04, | ||||
| 	MSGPACK_OBJECT_RAW					= 0x05, | ||||
| 	MSGPACK_OBJECT_ARRAY				= 0x06, | ||||
| 	MSGPACK_OBJECT_MAP					= 0x07, | ||||
| } 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_raw; | ||||
|  | ||||
| typedef union { | ||||
| 	bool boolean; | ||||
| 	uint64_t u64; | ||||
| 	int64_t  i64; | ||||
| 	double   dec; | ||||
| 	msgpack_object_array array; | ||||
| 	msgpack_object_map map; | ||||
| 	msgpack_object_raw raw; | ||||
| } 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; | ||||
|  | ||||
|  | ||||
| void msgpack_object_print(FILE* out, msgpack_object o); | ||||
|  | ||||
| bool msgpack_object_equal(const msgpack_object x, const msgpack_object y); | ||||
|  | ||||
| /** @} */ | ||||
|  | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif /* msgpack/object.h */ | ||||
|  | ||||
| @@ -1,412 +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_OBJECT_HPP__ | ||||
| #define MSGPACK_OBJECT_HPP__ | ||||
|  | ||||
| #include "object.h" | ||||
| #include "pack.hpp" | ||||
| #include "zone.hpp" | ||||
| #include <string.h> | ||||
| #include <stdexcept> | ||||
| #include <typeinfo> | ||||
| #include <limits> | ||||
| #include <ostream> | ||||
|  | ||||
| namespace msgpack { | ||||
|  | ||||
|  | ||||
| class type_error : public std::bad_cast { }; | ||||
|  | ||||
|  | ||||
| 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, | ||||
| 		DOUBLE				= MSGPACK_OBJECT_DOUBLE, | ||||
| 		RAW					= MSGPACK_OBJECT_RAW, | ||||
| 		ARRAY				= MSGPACK_OBJECT_ARRAY, | ||||
| 		MAP					= MSGPACK_OBJECT_MAP, | ||||
| 	}; | ||||
| } | ||||
|  | ||||
|  | ||||
| struct object; | ||||
| struct object_kv; | ||||
|  | ||||
| struct object_array { | ||||
| 	uint32_t size; | ||||
| 	object* ptr; | ||||
| }; | ||||
|  | ||||
| struct object_map { | ||||
| 	uint32_t size; | ||||
| 	object_kv* ptr; | ||||
| }; | ||||
|  | ||||
| struct object_raw { | ||||
| 	uint32_t size; | ||||
| 	const char* ptr; | ||||
| }; | ||||
|  | ||||
| struct object { | ||||
| 	union union_type { | ||||
| 		bool boolean; | ||||
| 		uint64_t u64; | ||||
| 		int64_t  i64; | ||||
| 		double   dec; | ||||
| 		object_array array; | ||||
| 		object_map map; | ||||
| 		object_raw raw; | ||||
| 		object_raw ref;  // obsolete | ||||
| 	}; | ||||
|  | ||||
| 	type::object_type type; | ||||
| 	union_type via; | ||||
|  | ||||
| 	bool is_nil() const { return type == type::NIL; } | ||||
|  | ||||
| 	template <typename T> | ||||
| 	T as() const; | ||||
|  | ||||
| 	template <typename T> | ||||
| 	void convert(T* v) const; | ||||
|  | ||||
| 	object(); | ||||
|  | ||||
| 	object(msgpack_object o); | ||||
|  | ||||
| 	template <typename T> | ||||
| 	explicit object(const T& v); | ||||
|  | ||||
| 	template <typename T> | ||||
| 	object(const T& v, 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; | ||||
| }; | ||||
|  | ||||
| struct object_kv { | ||||
| 	object key; | ||||
| 	object val; | ||||
| }; | ||||
|  | ||||
| struct object::with_zone : object { | ||||
| 	with_zone(msgpack::zone* zone) : zone(zone) { } | ||||
| 	msgpack::zone* zone; | ||||
| private: | ||||
| 	with_zone(); | ||||
| }; | ||||
|  | ||||
|  | ||||
| bool operator==(const object x, const object y); | ||||
| bool operator!=(const object x, const object y); | ||||
|  | ||||
| template <typename T> | ||||
| bool operator==(const object x, const T& y); | ||||
|  | ||||
| template <typename T> | ||||
| bool operator==(const T& y, const object x); | ||||
|  | ||||
| template <typename T> | ||||
| bool operator!=(const object x, const T& y); | ||||
|  | ||||
| template <typename T> | ||||
| bool operator!=(const T& y, const object x); | ||||
|  | ||||
| std::ostream& operator<< (std::ostream& s, const object o); | ||||
|  | ||||
|  | ||||
| // serialize operator | ||||
| template <typename Stream, typename T> | ||||
| packer<Stream>& operator<< (packer<Stream>& o, const T& v); | ||||
|  | ||||
| // convert operator | ||||
| template <typename T> | ||||
| T& operator>> (object o, T& v); | ||||
|  | ||||
| // deconvert operator | ||||
| template <typename T> | ||||
| void operator<< (object::with_zone& o, const T& v); | ||||
|  | ||||
|  | ||||
| struct object::implicit_type { | ||||
| 	implicit_type(object o) : obj(o) { } | ||||
| 	~implicit_type() { } | ||||
|  | ||||
| 	template <typename T> | ||||
| 	operator T() { return obj.as<T>(); } | ||||
|  | ||||
| private: | ||||
| 	object obj; | ||||
| }; | ||||
|  | ||||
|  | ||||
| // 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 | ||||
| 	{ | ||||
| 		o << static_cast<const msgpack_type&>(*this); | ||||
| 	} | ||||
|  | ||||
| 	void msgpack_unpack(object o) | ||||
| 	{ | ||||
| 		o >> static_cast<msgpack_type&>(*this); | ||||
| 	} | ||||
| }; | ||||
|  | ||||
|  | ||||
| template <typename Stream> | ||||
| template <typename T> | ||||
| inline packer<Stream>& packer<Stream>::pack(const T& v) | ||||
| { | ||||
| 	*this << v; | ||||
| 	return *this; | ||||
| } | ||||
|  | ||||
| inline object& operator>> (object o, object& v) | ||||
| { | ||||
| 	v = o; | ||||
| 	return v; | ||||
| } | ||||
|  | ||||
| template <typename T> | ||||
| inline T& operator>> (object o, T& v) | ||||
| { | ||||
| 	v.msgpack_unpack(o.convert()); | ||||
| 	return v; | ||||
| } | ||||
|  | ||||
| template <typename Stream, typename T> | ||||
| inline packer<Stream>& operator<< (packer<Stream>& o, const T& v) | ||||
| { | ||||
| 	v.msgpack_pack(o); | ||||
| 	return o; | ||||
| } | ||||
|  | ||||
| template <typename T> | ||||
| void operator<< (object::with_zone& o, const T& v) | ||||
| { | ||||
| 	v.msgpack_object(static_cast<object*>(&o), o.zone); | ||||
| } | ||||
|  | ||||
|  | ||||
| inline bool operator==(const object x, const object y) | ||||
| { | ||||
| 	return msgpack_object_equal(x, y); | ||||
| } | ||||
|  | ||||
| template <typename T> | ||||
| inline bool operator==(const object x, const T& y) | ||||
| try { | ||||
| 	return x == object(y); | ||||
| } catch (msgpack::type_error&) { | ||||
| 	return false; | ||||
| } | ||||
|  | ||||
| inline bool operator!=(const object x, const object y) | ||||
| { return !(x == y); } | ||||
|  | ||||
| template <typename T> | ||||
| inline bool operator==(const T& y, const object x) | ||||
| { return x == y; } | ||||
|  | ||||
| template <typename T> | ||||
| inline bool operator!=(const object x, const T& y) | ||||
| { return !(x == y); } | ||||
|  | ||||
| template <typename T> | ||||
| inline bool operator!=(const T& y, const object x) | ||||
| { return x != y; } | ||||
|  | ||||
|  | ||||
| inline object::implicit_type object::convert() const | ||||
| { | ||||
| 	return implicit_type(*this); | ||||
| } | ||||
|  | ||||
| template <typename T> | ||||
| inline void object::convert(T* v) const | ||||
| { | ||||
| 	*this >> *v; | ||||
| } | ||||
|  | ||||
| template <typename T> | ||||
| inline T object::as() const | ||||
| { | ||||
| 	T v; | ||||
| 	convert(&v); | ||||
| 	return v; | ||||
| } | ||||
|  | ||||
|  | ||||
| inline object::object() | ||||
| { | ||||
| 	type = type::NIL; | ||||
| } | ||||
|  | ||||
| template <typename T> | ||||
| inline object::object(const T& v) | ||||
| { | ||||
| 	*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, zone* z) | ||||
| { | ||||
| 	with_zone oz(z); | ||||
| 	oz << v; | ||||
| 	type = oz.type; | ||||
| 	via = oz.via; | ||||
| } | ||||
|  | ||||
|  | ||||
| inline object::object(msgpack_object o) | ||||
| { | ||||
| 	// FIXME beter way? | ||||
| 	::memcpy(this, &o, sizeof(o)); | ||||
| } | ||||
|  | ||||
| inline void operator<< (object& o, msgpack_object v) | ||||
| { | ||||
| 	// FIXME beter way? | ||||
| 	::memcpy(&o, &v, sizeof(v)); | ||||
| } | ||||
|  | ||||
| inline object::operator msgpack_object() const | ||||
| { | ||||
| 	// FIXME beter way? | ||||
| 	msgpack_object obj; | ||||
| 	::memcpy(&obj, this, sizeof(obj)); | ||||
| 	return obj; | ||||
| } | ||||
|  | ||||
|  | ||||
| // obsolete | ||||
| template <typename T> | ||||
| inline void convert(T& v, object o) | ||||
| { | ||||
| 	o.convert(&v); | ||||
| } | ||||
|  | ||||
| // obsolete | ||||
| template <typename Stream, typename T> | ||||
| inline void pack(packer<Stream>& o, const T& v) | ||||
| { | ||||
| 	o.pack(v); | ||||
| } | ||||
|  | ||||
| // obsolete | ||||
| template <typename Stream, typename T> | ||||
| inline void pack_copy(packer<Stream>& o, T v) | ||||
| { | ||||
| 	pack(o, v); | ||||
| } | ||||
|  | ||||
|  | ||||
| template <typename Stream> | ||||
| packer<Stream>& operator<< (packer<Stream>& o, const object& v) | ||||
| { | ||||
| 	switch(v.type) { | ||||
| 	case type::NIL: | ||||
| 		o.pack_nil(); | ||||
| 		return o; | ||||
|  | ||||
| 	case type::BOOLEAN: | ||||
| 		if(v.via.boolean) { | ||||
| 			o.pack_true(); | ||||
| 		} else { | ||||
| 			o.pack_false(); | ||||
| 		} | ||||
| 		return o; | ||||
|  | ||||
| 	case type::POSITIVE_INTEGER: | ||||
| 		o.pack_uint64(v.via.u64); | ||||
| 		return o; | ||||
|  | ||||
| 	case type::NEGATIVE_INTEGER: | ||||
| 		o.pack_int64(v.via.i64); | ||||
| 		return o; | ||||
|  | ||||
| 	case type::DOUBLE: | ||||
| 		o.pack_double(v.via.dec); | ||||
| 		return o; | ||||
|  | ||||
| 	case type::RAW: | ||||
| 		o.pack_raw(v.via.raw.size); | ||||
| 		o.pack_raw_body(v.via.raw.ptr, v.via.raw.size); | ||||
| 		return o; | ||||
|  | ||||
| 	case type::ARRAY: | ||||
| 		o.pack_array(v.via.array.size); | ||||
| 		for(object* p(v.via.array.ptr), | ||||
| 				* const pend(v.via.array.ptr + v.via.array.size); | ||||
| 				p < pend; ++p) { | ||||
| 			o << *p; | ||||
| 		} | ||||
| 		return o; | ||||
|  | ||||
| 	case type::MAP: | ||||
| 		o.pack_map(v.via.map.size); | ||||
| 		for(object_kv* p(v.via.map.ptr), | ||||
| 				* const pend(v.via.map.ptr + v.via.map.size); | ||||
| 				p < pend; ++p) { | ||||
| 			o << p->key; | ||||
| 			o << p->val; | ||||
| 		} | ||||
| 		return o; | ||||
|  | ||||
| 	default: | ||||
| 		throw type_error(); | ||||
| 	} | ||||
| } | ||||
|  | ||||
|  | ||||
| }  // namespace msgpack | ||||
|  | ||||
| #include "msgpack/type.hpp" | ||||
|  | ||||
| #endif /* msgpack/object.hpp */ | ||||
|  | ||||
| @@ -1,318 +0,0 @@ | ||||
| // | ||||
| // MessagePack for C++ serializing routine | ||||
| // | ||||
| // 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_HPP__ | ||||
| #define MSGPACK_PACK_HPP__ | ||||
|  | ||||
| #include "pack_define.h" | ||||
| #include <stdexcept> | ||||
| #include <limits.h> | ||||
|  | ||||
| namespace msgpack { | ||||
|  | ||||
|  | ||||
| template <typename Stream> | ||||
| class packer { | ||||
| public: | ||||
| 	packer(Stream* s); | ||||
| 	packer(Stream& s); | ||||
| 	~packer(); | ||||
|  | ||||
| public: | ||||
| 	template <typename T> | ||||
| 	packer<Stream>& pack(const T& v); | ||||
|  | ||||
| 	packer<Stream>& pack_uint8(uint8_t d); | ||||
| 	packer<Stream>& pack_uint16(uint16_t d); | ||||
| 	packer<Stream>& pack_uint32(uint32_t d); | ||||
| 	packer<Stream>& pack_uint64(uint64_t d); | ||||
| 	packer<Stream>& pack_int8(int8_t d); | ||||
| 	packer<Stream>& pack_int16(int16_t d); | ||||
| 	packer<Stream>& pack_int32(int32_t d); | ||||
| 	packer<Stream>& pack_int64(int64_t d); | ||||
|  | ||||
| 	packer<Stream>& pack_fix_uint8(uint8_t d); | ||||
| 	packer<Stream>& pack_fix_uint16(uint16_t d); | ||||
| 	packer<Stream>& pack_fix_uint32(uint32_t d); | ||||
| 	packer<Stream>& pack_fix_uint64(uint64_t d); | ||||
| 	packer<Stream>& pack_fix_int8(int8_t d); | ||||
| 	packer<Stream>& pack_fix_int16(int16_t d); | ||||
| 	packer<Stream>& pack_fix_int32(int32_t d); | ||||
| 	packer<Stream>& pack_fix_int64(int64_t d); | ||||
|  | ||||
| 	packer<Stream>& pack_short(short d); | ||||
| 	packer<Stream>& pack_int(int d); | ||||
| 	packer<Stream>& pack_long(long d); | ||||
| 	packer<Stream>& pack_long_long(long long d); | ||||
| 	packer<Stream>& pack_unsigned_short(unsigned short d); | ||||
| 	packer<Stream>& pack_unsigned_int(unsigned int d); | ||||
| 	packer<Stream>& pack_unsigned_long(unsigned long d); | ||||
| 	packer<Stream>& pack_unsigned_long_long(unsigned long long d); | ||||
|  | ||||
| 	packer<Stream>& pack_float(float d); | ||||
| 	packer<Stream>& pack_double(double d); | ||||
|  | ||||
| 	packer<Stream>& pack_nil(); | ||||
| 	packer<Stream>& pack_true(); | ||||
| 	packer<Stream>& pack_false(); | ||||
|  | ||||
| 	packer<Stream>& pack_array(unsigned int n); | ||||
|  | ||||
| 	packer<Stream>& pack_map(unsigned int n); | ||||
|  | ||||
| 	packer<Stream>& pack_raw(size_t l); | ||||
| 	packer<Stream>& pack_raw_body(const char* b, size_t l); | ||||
|  | ||||
| private: | ||||
| 	static void _pack_uint8(Stream& x, uint8_t d); | ||||
| 	static void _pack_uint16(Stream& x, uint16_t d); | ||||
| 	static void _pack_uint32(Stream& x, uint32_t d); | ||||
| 	static void _pack_uint64(Stream& x, uint64_t d); | ||||
| 	static void _pack_int8(Stream& x, int8_t d); | ||||
| 	static void _pack_int16(Stream& x, int16_t d); | ||||
| 	static void _pack_int32(Stream& x, int32_t d); | ||||
| 	static void _pack_int64(Stream& x, int64_t d); | ||||
|  | ||||
| 	static void _pack_fix_uint8(Stream& x, uint8_t d); | ||||
| 	static void _pack_fix_uint16(Stream& x, uint16_t d); | ||||
| 	static void _pack_fix_uint32(Stream& x, uint32_t d); | ||||
| 	static void _pack_fix_uint64(Stream& x, uint64_t d); | ||||
| 	static void _pack_fix_int8(Stream& x, int8_t d); | ||||
| 	static void _pack_fix_int16(Stream& x, int16_t d); | ||||
| 	static void _pack_fix_int32(Stream& x, int32_t d); | ||||
| 	static void _pack_fix_int64(Stream& x, int64_t d); | ||||
|  | ||||
| 	static void _pack_short(Stream& x, short d); | ||||
| 	static void _pack_int(Stream& x, int d); | ||||
| 	static void _pack_long(Stream& x, long d); | ||||
| 	static void _pack_long_long(Stream& x, long long d); | ||||
| 	static void _pack_unsigned_short(Stream& x, unsigned short d); | ||||
| 	static void _pack_unsigned_int(Stream& x, unsigned int d); | ||||
| 	static void _pack_unsigned_long(Stream& x, unsigned long d); | ||||
| 	static void _pack_unsigned_long_long(Stream& x, unsigned long long d); | ||||
|  | ||||
| 	static void _pack_float(Stream& x, float d); | ||||
| 	static void _pack_double(Stream& x, double d); | ||||
|  | ||||
| 	static void _pack_nil(Stream& x); | ||||
| 	static void _pack_true(Stream& x); | ||||
| 	static void _pack_false(Stream& x); | ||||
|  | ||||
| 	static void _pack_array(Stream& x, unsigned int n); | ||||
|  | ||||
| 	static void _pack_map(Stream& x, unsigned int n); | ||||
|  | ||||
| 	static void _pack_raw(Stream& x, size_t l); | ||||
| 	static void _pack_raw_body(Stream& x, const void* b, size_t l); | ||||
|  | ||||
| 	static void append_buffer(Stream& x, const unsigned char* buf, unsigned int len) | ||||
| 		{ x.write((const char*)buf, len); } | ||||
|  | ||||
| private: | ||||
| 	Stream& m_stream; | ||||
|  | ||||
| private: | ||||
| 	packer(); | ||||
| }; | ||||
|  | ||||
|  | ||||
| template <typename Stream, typename T> | ||||
| inline void pack(Stream* s, const T& v) | ||||
| { | ||||
| 	packer<Stream>(s).pack(v); | ||||
| } | ||||
|  | ||||
| template <typename Stream, typename T> | ||||
| inline void pack(Stream& s, const T& v) | ||||
| { | ||||
| 	packer<Stream>(s).pack(v); | ||||
| } | ||||
|  | ||||
|  | ||||
| #define msgpack_pack_inline_func(name) \ | ||||
| 	template <typename Stream> \ | ||||
| 	inline void packer<Stream>::_pack ## name | ||||
|  | ||||
| #define msgpack_pack_inline_func_cint(name) \ | ||||
| 	template <typename Stream> \ | ||||
| 	inline void packer<Stream>::_pack ## name | ||||
|  | ||||
| #define msgpack_pack_inline_func_fixint(name) \ | ||||
| 	template <typename Stream> \ | ||||
| 	inline void packer<Stream>::_pack_fix ## name | ||||
|  | ||||
| #define msgpack_pack_user Stream& | ||||
|  | ||||
| #define msgpack_pack_append_buffer append_buffer | ||||
|  | ||||
| #include "pack_template.h" | ||||
|  | ||||
|  | ||||
| template <typename Stream> | ||||
| packer<Stream>::packer(Stream* s) : m_stream(*s) { } | ||||
|  | ||||
| template <typename Stream> | ||||
| packer<Stream>::packer(Stream& s) : m_stream(s) { } | ||||
|  | ||||
| template <typename Stream> | ||||
| packer<Stream>::~packer() { } | ||||
|  | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& packer<Stream>::pack_uint8(uint8_t d) | ||||
| { _pack_uint8(m_stream, d); return *this; } | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& packer<Stream>::pack_uint16(uint16_t d) | ||||
| { _pack_uint16(m_stream, d); return *this; } | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& packer<Stream>::pack_uint32(uint32_t d) | ||||
| { _pack_uint32(m_stream, d); return *this; } | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& packer<Stream>::pack_uint64(uint64_t d) | ||||
| { _pack_uint64(m_stream, d); return *this; } | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& packer<Stream>::pack_int8(int8_t d) | ||||
| { _pack_int8(m_stream, d); return *this; } | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& packer<Stream>::pack_int16(int16_t d) | ||||
| { _pack_int16(m_stream, d); return *this; } | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& packer<Stream>::pack_int32(int32_t d) | ||||
| { _pack_int32(m_stream, d); return *this; } | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& packer<Stream>::pack_int64(int64_t d) | ||||
| { _pack_int64(m_stream, d); return *this;} | ||||
|  | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& packer<Stream>::pack_fix_uint8(uint8_t d) | ||||
| { _pack_fix_uint8(m_stream, d); return *this; } | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& packer<Stream>::pack_fix_uint16(uint16_t d) | ||||
| { _pack_fix_uint16(m_stream, d); return *this; } | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& packer<Stream>::pack_fix_uint32(uint32_t d) | ||||
| { _pack_fix_uint32(m_stream, d); return *this; } | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& packer<Stream>::pack_fix_uint64(uint64_t d) | ||||
| { _pack_fix_uint64(m_stream, d); return *this; } | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& packer<Stream>::pack_fix_int8(int8_t d) | ||||
| { _pack_fix_int8(m_stream, d); return *this; } | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& packer<Stream>::pack_fix_int16(int16_t d) | ||||
| { _pack_fix_int16(m_stream, d); return *this; } | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& packer<Stream>::pack_fix_int32(int32_t d) | ||||
| { _pack_fix_int32(m_stream, d); return *this; } | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& packer<Stream>::pack_fix_int64(int64_t d) | ||||
| { _pack_fix_int64(m_stream, d); return *this;} | ||||
|  | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& packer<Stream>::pack_short(short d) | ||||
| { _pack_short(m_stream, d); return *this; } | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& packer<Stream>::pack_int(int d) | ||||
| { _pack_int(m_stream, d); return *this; } | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& packer<Stream>::pack_long(long d) | ||||
| { _pack_long(m_stream, d); return *this; } | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& packer<Stream>::pack_long_long(long long d) | ||||
| { _pack_long_long(m_stream, d); return *this; } | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& packer<Stream>::pack_unsigned_short(unsigned short d) | ||||
| { _pack_unsigned_short(m_stream, d); return *this; } | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& packer<Stream>::pack_unsigned_int(unsigned int d) | ||||
| { _pack_unsigned_int(m_stream, d); return *this; } | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& packer<Stream>::pack_unsigned_long(unsigned long d) | ||||
| { _pack_unsigned_long(m_stream, d); return *this; } | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& packer<Stream>::pack_unsigned_long_long(unsigned long long d) | ||||
| { _pack_unsigned_long_long(m_stream, d); return *this; } | ||||
|  | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& packer<Stream>::pack_float(float d) | ||||
| { _pack_float(m_stream, d); return *this; } | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& packer<Stream>::pack_double(double d) | ||||
| { _pack_double(m_stream, d); return *this; } | ||||
|  | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& packer<Stream>::pack_nil() | ||||
| { _pack_nil(m_stream); return *this; } | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& packer<Stream>::pack_true() | ||||
| { _pack_true(m_stream); return *this; } | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& packer<Stream>::pack_false() | ||||
| { _pack_false(m_stream); return *this; } | ||||
|  | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& packer<Stream>::pack_array(unsigned int n) | ||||
| { _pack_array(m_stream, n); return *this; } | ||||
|  | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& packer<Stream>::pack_map(unsigned int n) | ||||
| { _pack_map(m_stream, n); return *this; } | ||||
|  | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& packer<Stream>::pack_raw(size_t l) | ||||
| { _pack_raw(m_stream, l); return *this; } | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& packer<Stream>::pack_raw_body(const char* b, size_t l) | ||||
| { _pack_raw_body(m_stream, b, l); return *this; } | ||||
|  | ||||
|  | ||||
| }  // namespace msgpack | ||||
|  | ||||
| #endif /* msgpack/pack.hpp */ | ||||
|  | ||||
| @@ -1,111 +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, unsigned int len) | ||||
| { | ||||
| 	msgpack_sbuffer* sbuf = (msgpack_sbuffer*)data; | ||||
|  | ||||
| 	if(sbuf->alloc - sbuf->size < len) { | ||||
| 		size_t nsize = (sbuf->alloc) ? | ||||
| 				sbuf->alloc * 2 : MSGPACK_SBUFFER_INIT_SIZE; | ||||
|  | ||||
| 		while(nsize < sbuf->size + len) { nsize *= 2; } | ||||
|  | ||||
| 		void* 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,108 +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_HPP__ | ||||
| #define MSGPACK_SBUFFER_HPP__ | ||||
|  | ||||
| #include "sbuffer.h" | ||||
| #include <stdexcept> | ||||
|  | ||||
| namespace msgpack { | ||||
|  | ||||
|  | ||||
| class sbuffer : public msgpack_sbuffer { | ||||
| public: | ||||
| 	sbuffer(size_t initsz = MSGPACK_SBUFFER_INIT_SIZE) | ||||
| 	{ | ||||
| 		base::data = (char*)::malloc(initsz); | ||||
| 		if(!base::data) { | ||||
| 			throw std::bad_alloc(); | ||||
| 		} | ||||
|  | ||||
| 		base::size = 0; | ||||
| 		base::alloc = initsz; | ||||
| 	} | ||||
|  | ||||
| 	~sbuffer() | ||||
| 	{ | ||||
| 		::free(base::data); | ||||
| 	} | ||||
|  | ||||
| public: | ||||
| 	void write(const char* buf, unsigned int len) | ||||
| 	{ | ||||
| 		if(base::alloc - base::size < len) { | ||||
| 			expand_buffer(len); | ||||
| 		} | ||||
| 		memcpy(base::data + base::size, buf, len); | ||||
| 		base::size += len; | ||||
| 	} | ||||
|  | ||||
| 	char* data() | ||||
| 	{ | ||||
| 		return base::data; | ||||
| 	} | ||||
|  | ||||
| 	const char* data() const | ||||
| 	{ | ||||
| 		return base::data; | ||||
| 	} | ||||
|  | ||||
| 	size_t size() const | ||||
| 	{ | ||||
| 		return base::size; | ||||
| 	} | ||||
|  | ||||
| 	char* release() | ||||
| 	{ | ||||
| 		return msgpack_sbuffer_release(this); | ||||
| 	} | ||||
|  | ||||
| 	void clear() | ||||
| 	{ | ||||
| 		msgpack_sbuffer_clear(this); | ||||
| 	} | ||||
|  | ||||
| private: | ||||
| 	void expand_buffer(size_t len) | ||||
| 	{ | ||||
| 		size_t nsize = (base::alloc) ? | ||||
| 				base::alloc * 2 : MSGPACK_SBUFFER_INIT_SIZE; | ||||
| 	 | ||||
| 		while(nsize < base::size + len) { nsize *= 2; } | ||||
| 	 | ||||
| 		void* tmp = realloc(base::data, nsize); | ||||
| 		if(!tmp) { | ||||
| 			throw std::bad_alloc(); | ||||
| 		} | ||||
| 	 | ||||
| 		base::data = (char*)tmp; | ||||
| 		base::alloc = nsize; | ||||
| 	} | ||||
|  | ||||
| private: | ||||
| 	typedef msgpack_sbuffer base; | ||||
|  | ||||
| private: | ||||
| 	sbuffer(const sbuffer&); | ||||
| }; | ||||
|  | ||||
|  | ||||
| }  // namespace msgpack | ||||
|  | ||||
| #endif /* msgpack/sbuffer.hpp */ | ||||
|  | ||||
| @@ -1,16 +0,0 @@ | ||||
| #include "type/bool.hpp" | ||||
| #include "type/deque.hpp" | ||||
| #include "type/fixint.hpp" | ||||
| #include "type/float.hpp" | ||||
| #include "type/int.hpp" | ||||
| #include "type/list.hpp" | ||||
| #include "type/map.hpp" | ||||
| #include "type/nil.hpp" | ||||
| #include "type/pair.hpp" | ||||
| #include "type/raw.hpp" | ||||
| #include "type/set.hpp" | ||||
| #include "type/string.hpp" | ||||
| #include "type/vector.hpp" | ||||
| #include "type/tuple.hpp" | ||||
| #include "type/define.hpp" | ||||
|  | ||||
| @@ -1,55 +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/object.hpp" | ||||
| #include <vector> | ||||
|  | ||||
| namespace msgpack { | ||||
|  | ||||
|  | ||||
| inline bool& operator>> (object o, bool& v) | ||||
| { | ||||
| 	if(o.type != type::BOOLEAN) { throw type_error(); } | ||||
| 	v = o.via.boolean; | ||||
| 	return v; | ||||
| } | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& operator<< (packer<Stream>& o, const bool& v) | ||||
| { | ||||
| 	if(v) { o.pack_true(); } | ||||
| 	else { o.pack_false(); } | ||||
| 	return o; | ||||
| } | ||||
|  | ||||
| inline void operator<< (object& o, bool v) | ||||
| { | ||||
| 	o.type = type::BOOLEAN; | ||||
| 	o.via.boolean = v; | ||||
| } | ||||
|  | ||||
| inline void operator<< (object::with_zone& o, bool v) | ||||
| 	{ static_cast<object&>(o) << v; } | ||||
|  | ||||
|  | ||||
| }  // namespace msgpack | ||||
|  | ||||
| #endif /* msgpack/type/bool.hpp */ | ||||
|  | ||||
| @@ -1,117 +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_DEFINE_HPP__ | ||||
| #define MSGPACK_TYPE_DEFINE_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 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); \ | ||||
| 	} | ||||
|  | ||||
| namespace msgpack { | ||||
| namespace type { | ||||
|  | ||||
|  | ||||
| <% GENERATION_LIMIT = 31 %> | ||||
| template <typename A0 = void<%1.upto(GENERATION_LIMIT+1) {|i|%>, typename A<%=i%> = void<%}%>> | ||||
| struct define; | ||||
|  | ||||
|  | ||||
| template <> | ||||
| struct define<> { | ||||
| 	typedef define<> value_type; | ||||
| 	typedef tuple<> tuple_type; | ||||
| 	template <typename Packer> | ||||
| 	void msgpack_pack(Packer& pk) const | ||||
| 	{ | ||||
| 		pk.pack_array(1); | ||||
| 	} | ||||
| 	void msgpack_unpack(msgpack::object o) | ||||
| 	{ | ||||
| 		if(o.type != type::ARRAY) { throw type_error(); } | ||||
| 	} | ||||
| 	void msgpack_object(msgpack::object* o, msgpack::zone* z) const | ||||
| 	{ | ||||
| 		o->type = type::ARRAY; | ||||
| 		o->via.array.ptr = NULL; | ||||
| 		o->via.array.size = 0; | ||||
| 	} | ||||
| }; | ||||
| <%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 o) | ||||
| 	{ | ||||
| 		if(o.type != type::ARRAY) { throw type_error(); } | ||||
| 		const size_t size = o.via.array.size; | ||||
| 		<%0.upto(i) {|j|%> | ||||
| 		if(size <= <%=j%>) { return; } o.via.array.ptr[<%=j%>].convert(&a<%=j%>);<%}%> | ||||
| 	} | ||||
| 	void msgpack_object(msgpack::object* o, msgpack::zone* z) const | ||||
| 	{ | ||||
| 		o->type = type::ARRAY; | ||||
| 		o->via.array.ptr = (object*)z->malloc(sizeof(object)*<%=i+1%>); | ||||
| 		o->via.array.size = <%=i+1%>; | ||||
| 		<%0.upto(i) {|j|%> | ||||
| 		o->via.array.ptr[<%=j%>] = object(a<%=j%>, z);<%}%> | ||||
| 	} | ||||
| 	<%0.upto(i) {|j|%> | ||||
| 	A<%=j%>& a<%=j%>;<%}%> | ||||
| }; | ||||
| <%}%> | ||||
|  | ||||
| inline define<> make_define() | ||||
| { | ||||
| 	return define<>(); | ||||
| } | ||||
| <%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%><%}%>); | ||||
| } | ||||
| <%}%> | ||||
|  | ||||
| }  // namespace type | ||||
| }  // namespace msgpack | ||||
|  | ||||
|  | ||||
| #endif /* msgpack/type/define.hpp */ | ||||
|  | ||||
| @@ -1,77 +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_DEQUE_HPP__ | ||||
| #define MSGPACK_TYPE_DEQUE_HPP__ | ||||
|  | ||||
| #include "msgpack/object.hpp" | ||||
| #include <deque> | ||||
|  | ||||
| namespace msgpack { | ||||
|  | ||||
|  | ||||
| template <typename T> | ||||
| inline std::deque<T>& operator>> (object o, std::deque<T>& v) | ||||
| { | ||||
| 	if(o.type != type::ARRAY) { throw type_error(); } | ||||
| 	v.resize(o.via.array.size); | ||||
| 	object* p = o.via.array.ptr; | ||||
| 	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 v; | ||||
| } | ||||
|  | ||||
| template <typename Stream, typename T> | ||||
| inline packer<Stream>& operator<< (packer<Stream>& o, const std::deque<T>& v) | ||||
| { | ||||
| 	o.pack_array(v.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> | ||||
| inline void operator<< (object::with_zone& o, const std::deque<T>& v) | ||||
| { | ||||
| 	o.type = type::ARRAY; | ||||
| 	if(v.empty()) { | ||||
| 		o.via.array.ptr = NULL; | ||||
| 		o.via.array.size = 0; | ||||
| 	} else { | ||||
| 		object* p = (object*)o.zone->malloc(sizeof(object)*v.size()); | ||||
| 		object* const pend = p + v.size(); | ||||
| 		o.via.array.ptr = p; | ||||
| 		o.via.array.size = v.size(); | ||||
| 		typename std::deque<T>::const_iterator it(v.begin()); | ||||
| 		do { | ||||
| 			*p = object(*it, o.zone); | ||||
| 			++p; | ||||
| 			++it; | ||||
| 		} while(p < pend); | ||||
| 	} | ||||
| } | ||||
|  | ||||
|  | ||||
| }  // namespace msgpack | ||||
|  | ||||
| #endif /* msgpack/type/deque.hpp */ | ||||
|  | ||||
| @@ -1,89 +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/object.hpp" | ||||
|  | ||||
| namespace msgpack { | ||||
|  | ||||
| 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: | ||||
| 	const 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 | ||||
|  | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& operator<< (packer<Stream>& o, const type::fix_int8& v) | ||||
| 	{ o.pack_fix_int8(v); return o; } | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& operator<< (packer<Stream>& o, const type::fix_int16& v) | ||||
| 	{ o.pack_fix_int16(v); return o; } | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& operator<< (packer<Stream>& o, const type::fix_int32& v) | ||||
| 	{ o.pack_fix_int32(v); return o; } | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& operator<< (packer<Stream>& o, const type::fix_int64& v) | ||||
| 	{ o.pack_fix_int64(v); return o; } | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& operator<< (packer<Stream>& o, const type::fix_uint8& v) | ||||
| 	{ o.pack_fix_uint8(v); return o; } | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& operator<< (packer<Stream>& o, const type::fix_uint16& v) | ||||
| 	{ o.pack_fix_uint16(v); return o; } | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& operator<< (packer<Stream>& o, const type::fix_uint32& v) | ||||
| 	{ o.pack_fix_uint32(v); return o; } | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& operator<< (packer<Stream>& o, const type::fix_uint64& v) | ||||
| 	{ o.pack_fix_uint64(v); return o; } | ||||
|  | ||||
|  | ||||
| }  // namespace msgpack | ||||
|  | ||||
| #endif /* msgpack/type/fixint.hpp */ | ||||
|  | ||||
| @@ -1,82 +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/object.hpp" | ||||
| #include <vector> | ||||
|  | ||||
| namespace msgpack { | ||||
|  | ||||
|  | ||||
| // FIXME check overflow, underflow | ||||
|  | ||||
|  | ||||
| inline float& operator>> (object o, float& v) | ||||
| { | ||||
| 	if(o.type != type::DOUBLE) { throw type_error(); } | ||||
| 	v = o.via.dec; | ||||
| 	return v; | ||||
| } | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& operator<< (packer<Stream>& o, const float& v) | ||||
| { | ||||
| 	o.pack_float(v); | ||||
| 	return o; | ||||
| } | ||||
|  | ||||
|  | ||||
| inline double& operator>> (object o, double& v) | ||||
| { | ||||
| 	if(o.type != type::DOUBLE) { throw type_error(); } | ||||
| 	v = o.via.dec; | ||||
| 	return v; | ||||
| } | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& operator<< (packer<Stream>& o, const double& v) | ||||
| { | ||||
| 	o.pack_double(v); | ||||
| 	return o; | ||||
| } | ||||
|  | ||||
|  | ||||
| inline void operator<< (object& o, float v) | ||||
| { | ||||
| 	o.type = type::DOUBLE; | ||||
| 	o.via.dec = v; | ||||
| } | ||||
|  | ||||
| inline void operator<< (object& o, double v) | ||||
| { | ||||
| 	o.type = type::DOUBLE; | ||||
| 	o.via.dec = v; | ||||
| } | ||||
|  | ||||
| inline void operator<< (object::with_zone& o, float v) | ||||
| 	{ static_cast<object&>(o) << v; } | ||||
|  | ||||
| inline void operator<< (object::with_zone& o, double v) | ||||
| 	{ static_cast<object&>(o) << v; } | ||||
|  | ||||
|  | ||||
| }  // namespace msgpack | ||||
|  | ||||
| #endif /* msgpack/type/float.hpp */ | ||||
|  | ||||
| @@ -1,211 +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/object.hpp" | ||||
| #include <limits> | ||||
|  | ||||
| namespace msgpack { | ||||
|  | ||||
|  | ||||
| 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(object o) { | ||||
| 			if(o.type == type::POSITIVE_INTEGER) { | ||||
| 				if(o.via.u64 > (uint64_t)std::numeric_limits<T>::max()) | ||||
| 					{ throw type_error(); } | ||||
| 				return o.via.u64; | ||||
| 			} else if(o.type == type::NEGATIVE_INTEGER) { | ||||
| 				if(o.via.i64 < (int64_t)std::numeric_limits<T>::min()) | ||||
| 					{ throw type_error(); } | ||||
| 				return o.via.i64; | ||||
| 			} | ||||
| 			throw type_error(); | ||||
| 		} | ||||
| 	}; | ||||
| 	 | ||||
| 	template <typename T> | ||||
| 	struct convert_integer_sign<T, false> { | ||||
| 		static inline T convert(object o) { | ||||
| 			if(o.type == type::POSITIVE_INTEGER) { | ||||
| 				if(o.via.u64 > (uint64_t)std::numeric_limits<T>::max()) | ||||
| 					{ throw type_error(); } | ||||
| 				return o.via.u64; | ||||
| 			} | ||||
| 			throw type_error(); | ||||
| 		} | ||||
| 	}; | ||||
|  | ||||
| 	template <typename T> | ||||
| 	static inline T convert_integer(object o) | ||||
| 	{ | ||||
| 		return detail::convert_integer_sign<T, std::numeric_limits<T>::is_signed>::convert(o); | ||||
| 	} | ||||
|  | ||||
| }  // namespace detail | ||||
| }  // namespace type | ||||
|  | ||||
|  | ||||
| inline signed char& operator>> (object o, signed char& v) | ||||
| 	{ v = type::detail::convert_integer<signed char>(o); return v; } | ||||
|  | ||||
| inline signed short& operator>> (object o, signed short& v) | ||||
| 	{ v = type::detail::convert_integer<signed short>(o); return v; } | ||||
|  | ||||
| inline signed int& operator>> (object o, signed int& v) | ||||
| 	{ v = type::detail::convert_integer<signed int>(o); return v; } | ||||
|  | ||||
| inline signed long& operator>> (object o, signed long& v) | ||||
| 	{ v = type::detail::convert_integer<signed long>(o); return v; } | ||||
|  | ||||
| inline signed long long& operator>> (object o, signed long long& v) | ||||
| 	{ v = type::detail::convert_integer<signed long long>(o); return v; } | ||||
|  | ||||
|  | ||||
| inline unsigned char& operator>> (object o, unsigned char& v) | ||||
| 	{ v = type::detail::convert_integer<unsigned char>(o); return v; } | ||||
|  | ||||
| inline unsigned short& operator>> (object o, unsigned short& v) | ||||
| 	{ v = type::detail::convert_integer<unsigned short>(o); return v; } | ||||
|  | ||||
| inline unsigned int& operator>> (object o, unsigned int& v) | ||||
| 	{ v = type::detail::convert_integer<unsigned int>(o); return v; } | ||||
|  | ||||
| inline unsigned long& operator>> (object o, unsigned long& v) | ||||
| 	{ v = type::detail::convert_integer<unsigned long>(o); return v; } | ||||
|  | ||||
| inline unsigned long long& operator>> (object o, unsigned long long& v) | ||||
| 	{ v = type::detail::convert_integer<unsigned long long>(o); return v; } | ||||
|  | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& operator<< (packer<Stream>& o, const signed char& v) | ||||
| 	{ o.pack_int8(v); return o; } | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& operator<< (packer<Stream>& o, const signed short& v) | ||||
| 	{ o.pack_short(v); return o; } | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& operator<< (packer<Stream>& o, const signed int& v) | ||||
| 	{ o.pack_int(v); return o; } | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& operator<< (packer<Stream>& o, const signed long& v) | ||||
| 	{ o.pack_long(v); return o; } | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& operator<< (packer<Stream>& o, const signed long long& v) | ||||
| 	{ o.pack_long_long(v); return o; } | ||||
|  | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& operator<< (packer<Stream>& o, const unsigned char& v) | ||||
| 	{ o.pack_uint8(v); return o; } | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& operator<< (packer<Stream>& o, const unsigned short& v) | ||||
| 	{ o.pack_unsigned_short(v); return o; } | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& operator<< (packer<Stream>& o, const unsigned int& v) | ||||
| 	{ o.pack_unsigned_int(v); return o; } | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& operator<< (packer<Stream>& o, const unsigned long& v) | ||||
| 	{ o.pack_unsigned_long(v); return o; } | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& operator<< (packer<Stream>& o, const unsigned long long& v) | ||||
| 	{ o.pack_unsigned_long_long(v); return o; } | ||||
|  | ||||
|  | ||||
| inline void operator<< (object& o, signed char v) | ||||
| 	{ v < 0 ? o.type = type::NEGATIVE_INTEGER, o.via.i64 = v : o.type = type::POSITIVE_INTEGER, o.via.u64 = v; } | ||||
|  | ||||
| inline void operator<< (object& o, signed short v) | ||||
| 	{ v < 0 ? o.type = type::NEGATIVE_INTEGER, o.via.i64 = v : o.type = type::POSITIVE_INTEGER, o.via.u64 = v; } | ||||
|  | ||||
| inline void operator<< (object& o, signed int v) | ||||
| 	{ v < 0 ? o.type = type::NEGATIVE_INTEGER, o.via.i64 = v : o.type = type::POSITIVE_INTEGER, o.via.u64 = v; } | ||||
|  | ||||
| inline void operator<< (object& o, signed long v) | ||||
| 	{ v < 0 ? o.type = type::NEGATIVE_INTEGER, o.via.i64 = v : o.type = type::POSITIVE_INTEGER, o.via.u64 = v; } | ||||
|  | ||||
| inline void operator<< (object& o, signed long long v) | ||||
| 	{ v < 0 ? o.type = type::NEGATIVE_INTEGER, o.via.i64 = v : o.type = type::POSITIVE_INTEGER, o.via.u64 = v; } | ||||
|  | ||||
|  | ||||
| inline void operator<< (object& o, unsigned char v) | ||||
| 	{ o.type = type::POSITIVE_INTEGER, o.via.u64 = v; } | ||||
|  | ||||
| inline void operator<< (object& o, unsigned short v) | ||||
| 	{ o.type = type::POSITIVE_INTEGER, o.via.u64 = v; } | ||||
|  | ||||
| inline void operator<< (object& o, unsigned int v) | ||||
| 	{ o.type = type::POSITIVE_INTEGER, o.via.u64 = v; } | ||||
|  | ||||
| inline void operator<< (object& o, unsigned long v) | ||||
| 	{ o.type = type::POSITIVE_INTEGER, o.via.u64 = v; } | ||||
|  | ||||
| inline void operator<< (object& o, unsigned long long v) | ||||
| 	{ o.type = type::POSITIVE_INTEGER, o.via.u64 = v; } | ||||
|  | ||||
|  | ||||
| inline void operator<< (object::with_zone& o, signed char v) | ||||
| 	{ static_cast<object&>(o) << v; } | ||||
|  | ||||
| inline void operator<< (object::with_zone& o, signed short v) | ||||
| 	{ static_cast<object&>(o) << v; } | ||||
|  | ||||
| inline void operator<< (object::with_zone& o, signed int v) | ||||
| 	{ static_cast<object&>(o) << v; } | ||||
|  | ||||
| inline void operator<< (object::with_zone& o, signed long v) | ||||
| 	{ static_cast<object&>(o) << v; } | ||||
|  | ||||
| inline void operator<< (object::with_zone& o, signed long long v) | ||||
| 	{ static_cast<object&>(o) << v; } | ||||
|  | ||||
|  | ||||
| inline void operator<< (object::with_zone& o, unsigned char v) | ||||
| 	{ static_cast<object&>(o) << v; } | ||||
|  | ||||
| inline void operator<< (object::with_zone& o, unsigned short v) | ||||
| 	{ static_cast<object&>(o) << v; } | ||||
|  | ||||
| inline void operator<< (object::with_zone& o, unsigned int v) | ||||
| 	{ static_cast<object&>(o) << v; } | ||||
|  | ||||
| inline void operator<< (object::with_zone& o, unsigned long v) | ||||
| 	{ static_cast<object&>(o) << v; } | ||||
|  | ||||
| inline void operator<< (object::with_zone& o, unsigned long long v) | ||||
| 	{ static_cast<object&>(o) << v; } | ||||
|  | ||||
|  | ||||
| }  // namespace msgpack | ||||
|  | ||||
| #endif /* msgpack/type/int.hpp */ | ||||
|  | ||||
| @@ -1,77 +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_LIST_HPP__ | ||||
| #define MSGPACK_TYPE_LIST_HPP__ | ||||
|  | ||||
| #include "msgpack/object.hpp" | ||||
| #include <list> | ||||
|  | ||||
| namespace msgpack { | ||||
|  | ||||
|  | ||||
| template <typename T> | ||||
| inline std::list<T>& operator>> (object o, std::list<T>& v) | ||||
| { | ||||
| 	if(o.type != type::ARRAY) { throw type_error(); } | ||||
| 	v.resize(o.via.array.size); | ||||
| 	object* p = o.via.array.ptr; | ||||
| 	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 v; | ||||
| } | ||||
|  | ||||
| template <typename Stream, typename T> | ||||
| inline packer<Stream>& operator<< (packer<Stream>& o, const std::list<T>& v) | ||||
| { | ||||
| 	o.pack_array(v.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> | ||||
| inline void operator<< (object::with_zone& o, const std::list<T>& v) | ||||
| { | ||||
| 	o.type = type::ARRAY; | ||||
| 	if(v.empty()) { | ||||
| 		o.via.array.ptr = NULL; | ||||
| 		o.via.array.size = 0; | ||||
| 	} else { | ||||
| 		object* p = (object*)o.zone->malloc(sizeof(object)*v.size()); | ||||
| 		object* const pend = p + v.size(); | ||||
| 		o.via.array.ptr = p; | ||||
| 		o.via.array.size = v.size(); | ||||
| 		typename std::list<T>::const_iterator it(v.begin()); | ||||
| 		do { | ||||
| 			*p = object(*it, o.zone); | ||||
| 			++p; | ||||
| 			++it; | ||||
| 		} while(p < pend); | ||||
| 	} | ||||
| } | ||||
|  | ||||
|  | ||||
| }  // namespace msgpack | ||||
|  | ||||
| #endif /* msgpack/type/list.hpp */ | ||||
|  | ||||
| @@ -1,205 +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_MAP_HPP__ | ||||
| #define MSGPACK_TYPE_MAP_HPP__ | ||||
|  | ||||
| #include "msgpack/object.hpp" | ||||
| #include <map> | ||||
| #include <vector> | ||||
| #include <algorithm> | ||||
|  | ||||
| namespace msgpack { | ||||
|  | ||||
|  | ||||
| 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 | ||||
|  | ||||
|  | ||||
| template <typename K, typename V> | ||||
| inline type::assoc_vector<K,V>& operator>> (object o, type::assoc_vector<K,V>& v) | ||||
| { | ||||
| 	if(o.type != type::MAP) { throw type_error(); } | ||||
| 	v.resize(o.via.map.size); | ||||
| 	object_kv* p = o.via.map.ptr; | ||||
| 	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 v; | ||||
| } | ||||
|  | ||||
| template <typename Stream, typename K, typename V> | ||||
| inline packer<Stream>& operator<< (packer<Stream>& o, const type::assoc_vector<K,V>& v) | ||||
| { | ||||
| 	o.pack_map(v.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> | ||||
| inline void operator<< (object::with_zone& o, const type::assoc_vector<K,V>& v) | ||||
| { | ||||
| 	o.type = type::MAP; | ||||
| 	if(v.empty()) { | ||||
| 		o.via.map.ptr  = NULL; | ||||
| 		o.via.map.size = 0; | ||||
| 	} else { | ||||
| 		object_kv* p = (object_kv*)o.zone->malloc(sizeof(object_kv)*v.size()); | ||||
| 		object_kv* const pend = p + v.size(); | ||||
| 		o.via.map.ptr  = p; | ||||
| 		o.via.map.size = v.size(); | ||||
| 		typename type::assoc_vector<K,V>::const_iterator it(v.begin()); | ||||
| 		do { | ||||
| 			p->key = object(it->first, o.zone); | ||||
| 			p->val = object(it->second, o.zone); | ||||
| 			++p; | ||||
| 			++it; | ||||
| 		} while(p < pend); | ||||
| 	} | ||||
| } | ||||
|  | ||||
|  | ||||
| template <typename K, typename V> | ||||
| inline std::map<K, V> operator>> (object o, std::map<K, V>& v) | ||||
| { | ||||
| 	if(o.type != type::MAP) { throw type_error(); } | ||||
| 	object_kv* p(o.via.map.ptr); | ||||
| 	object_kv* const pend(o.via.map.ptr + o.via.map.size); | ||||
| 	for(; p != pend; ++p) { | ||||
| 		K key; | ||||
| 		p->key.convert(&key); | ||||
| 		typename std::map<K,V>::iterator it(v.lower_bound(key)); | ||||
| 		if(it != v.end() && !(key < it->first)) { | ||||
| 			p->val.convert(&it->second); | ||||
| 		} else { | ||||
| 			V val; | ||||
| 			p->val.convert(&val); | ||||
| 			v.insert(it, std::pair<K,V>(key, val)); | ||||
| 		} | ||||
| 	} | ||||
| 	return v; | ||||
| } | ||||
|  | ||||
| template <typename Stream, typename K, typename V> | ||||
| inline packer<Stream>& operator<< (packer<Stream>& o, const std::map<K,V>& v) | ||||
| { | ||||
| 	o.pack_map(v.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> | ||||
| inline void operator<< (object::with_zone& o, const std::map<K,V>& v) | ||||
| { | ||||
| 	o.type = type::MAP; | ||||
| 	if(v.empty()) { | ||||
| 		o.via.map.ptr  = NULL; | ||||
| 		o.via.map.size = 0; | ||||
| 	} else { | ||||
| 		object_kv* p = (object_kv*)o.zone->malloc(sizeof(object_kv)*v.size()); | ||||
| 		object_kv* const pend = p + v.size(); | ||||
| 		o.via.map.ptr  = p; | ||||
| 		o.via.map.size = v.size(); | ||||
| 		typename std::map<K,V>::const_iterator it(v.begin()); | ||||
| 		do { | ||||
| 			p->key = object(it->first, o.zone); | ||||
| 			p->val = object(it->second, o.zone); | ||||
| 			++p; | ||||
| 			++it; | ||||
| 		} while(p < pend); | ||||
| 	} | ||||
| } | ||||
|  | ||||
|  | ||||
| template <typename K, typename V> | ||||
| inline std::multimap<K, V> operator>> (object o, std::multimap<K, V>& v) | ||||
| { | ||||
| 	if(o.type != type::MAP) { throw type_error(); } | ||||
| 	object_kv* p(o.via.map.ptr); | ||||
| 	object_kv* const pend(o.via.map.ptr + o.via.map.size); | ||||
| 	for(; p != pend; ++p) { | ||||
| 		std::pair<K, V> value; | ||||
| 		p->key.convert(&value.first); | ||||
| 		p->val.convert(&value.second); | ||||
| 		v.insert(value); | ||||
| 	} | ||||
| 	return v; | ||||
| } | ||||
|  | ||||
| template <typename Stream, typename K, typename V> | ||||
| inline packer<Stream>& operator<< (packer<Stream>& o, const std::multimap<K,V>& v) | ||||
| { | ||||
| 	o.pack_map(v.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> | ||||
| inline void operator<< (object::with_zone& o, const std::multimap<K,V>& v) | ||||
| { | ||||
| 	o.type = type::MAP; | ||||
| 	if(v.empty()) { | ||||
| 		o.via.map.ptr  = NULL; | ||||
| 		o.via.map.size = 0; | ||||
| 	} else { | ||||
| 		object_kv* p = (object_kv*)o.zone->malloc(sizeof(object_kv)*v.size()); | ||||
| 		object_kv* const pend = p + v.size(); | ||||
| 		o.via.map.ptr  = p; | ||||
| 		o.via.map.size = v.size(); | ||||
| 		typename std::multimap<K,V>::const_iterator it(v.begin()); | ||||
| 		do { | ||||
| 			p->key = object(it->first, o.zone); | ||||
| 			p->val = object(it->second, o.zone); | ||||
| 			++p; | ||||
| 			++it; | ||||
| 		} while(p < pend); | ||||
| 	} | ||||
| } | ||||
|  | ||||
|  | ||||
| }  // namespace msgpack | ||||
|  | ||||
| #endif /* msgpack/type/map.hpp */ | ||||
|  | ||||
| @@ -1,65 +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/object.hpp" | ||||
|  | ||||
| namespace msgpack { | ||||
|  | ||||
| namespace type { | ||||
|  | ||||
| struct nil { }; | ||||
|  | ||||
| }  // namespace type | ||||
|  | ||||
|  | ||||
| inline type::nil& operator>> (object o, type::nil& v) | ||||
| { | ||||
| 	if(o.type != type::NIL) { throw type_error(); } | ||||
| 	return v; | ||||
| } | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& operator<< (packer<Stream>& o, const type::nil& v) | ||||
| { | ||||
| 	o.pack_nil(); | ||||
| 	return o; | ||||
| } | ||||
|  | ||||
| inline void operator<< (object& o, type::nil v) | ||||
| { | ||||
| 	o.type = type::NIL; | ||||
| } | ||||
|  | ||||
| inline void operator<< (object::with_zone& o, type::nil v) | ||||
| 	{ static_cast<object&>(o) << v; } | ||||
|  | ||||
|  | ||||
| template <> | ||||
| inline void object::as<void>() const | ||||
| { | ||||
| 	msgpack::type::nil v; | ||||
| 	convert(&v); | ||||
| } | ||||
|  | ||||
|  | ||||
| }  // namespace msgpack | ||||
|  | ||||
| #endif /* msgpack/type/nil.hpp */ | ||||
|  | ||||
| @@ -1,61 +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/object.hpp" | ||||
| #include <utility> | ||||
|  | ||||
| namespace msgpack { | ||||
|  | ||||
|  | ||||
| template <typename T1, typename T2> | ||||
| inline std::pair<T1, T2>& operator>> (object o, std::pair<T1, T2>& v) | ||||
| { | ||||
| 	if(o.type != type::ARRAY) { throw type_error(); } | ||||
| 	if(o.via.array.size != 2) { throw type_error(); } | ||||
| 	o.via.array.ptr[0].convert(&v.first); | ||||
| 	o.via.array.ptr[1].convert(&v.second); | ||||
| 	return v; | ||||
| } | ||||
|  | ||||
| template <typename Stream, typename T1, typename T2> | ||||
| inline packer<Stream>& operator<< (packer<Stream>& o, const std::pair<T1, T2>& v) | ||||
| { | ||||
| 	o.pack_array(2); | ||||
| 	o.pack(v.first); | ||||
| 	o.pack(v.second); | ||||
| 	return o; | ||||
| } | ||||
|  | ||||
| template <typename T1, typename T2> | ||||
| inline void operator<< (object::with_zone& o, const std::pair<T1, T2>& v) | ||||
| { | ||||
| 	o.type = type::ARRAY; | ||||
| 	object* p = (object*)o.zone->malloc(sizeof(object)*2); | ||||
| 	o.via.array.ptr = p; | ||||
| 	o.via.array.size = 2; | ||||
| 	p[0] = object(v.first, o.zone); | ||||
| 	p[1] = object(v.second, o.zone); | ||||
| } | ||||
|  | ||||
|  | ||||
| }  // namespace msgpack | ||||
|  | ||||
| #endif /* msgpack/type/pair.hpp */ | ||||
|  | ||||
| @@ -1,94 +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/object.hpp" | ||||
| #include <string.h> | ||||
| #include <string> | ||||
|  | ||||
| namespace msgpack { | ||||
|  | ||||
| namespace type { | ||||
|  | ||||
| struct raw_ref { | ||||
| 	raw_ref() : size(0), ptr(NULL) {} | ||||
| 	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 && 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 memcmp(ptr, x.ptr, size) < 0; } | ||||
| 		else { return size < x.size; } | ||||
| 	} | ||||
|  | ||||
| 	bool operator> (const raw_ref& x) const | ||||
| 	{ | ||||
| 		if(size == x.size) { return memcmp(ptr, x.ptr, size) > 0; } | ||||
| 		else { return size > x.size; } | ||||
| 	} | ||||
| }; | ||||
|  | ||||
| }  // namespace type | ||||
|  | ||||
|  | ||||
| inline type::raw_ref& operator>> (object o, type::raw_ref& v) | ||||
| { | ||||
| 	if(o.type != type::RAW) { throw type_error(); } | ||||
| 	v.ptr  = o.via.raw.ptr; | ||||
| 	v.size = o.via.raw.size; | ||||
| 	return v; | ||||
| } | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& operator<< (packer<Stream>& o, const type::raw_ref& v) | ||||
| { | ||||
| 	o.pack_raw(v.size); | ||||
| 	o.pack_raw_body(v.ptr, v.size); | ||||
| 	return o; | ||||
| } | ||||
|  | ||||
| inline void operator<< (object& o, const type::raw_ref& v) | ||||
| { | ||||
| 	o.type = type::RAW; | ||||
| 	o.via.raw.ptr = v.ptr; | ||||
| 	o.via.raw.size = v.size; | ||||
| } | ||||
|  | ||||
| inline void operator<< (object::with_zone& o, const type::raw_ref& v) | ||||
| 	{ static_cast<object&>(o) << v; } | ||||
|  | ||||
|  | ||||
| }  // namespace msgpack | ||||
|  | ||||
| #endif /* msgpack/type/raw.hpp */ | ||||
|  | ||||
| @@ -1,122 +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_SET_HPP__ | ||||
| #define MSGPACK_TYPE_SET_HPP__ | ||||
|  | ||||
| #include "msgpack/object.hpp" | ||||
| #include <set> | ||||
|  | ||||
| namespace msgpack { | ||||
|  | ||||
|  | ||||
| template <typename T> | ||||
| inline std::set<T>& operator>> (object o, std::set<T>& v) | ||||
| { | ||||
| 	if(o.type != type::ARRAY) { throw type_error(); } | ||||
| 	object* p = o.via.array.ptr + o.via.array.size; | ||||
| 	object* const pbegin = o.via.array.ptr; | ||||
| 	while(p > pbegin) { | ||||
| 		--p; | ||||
| 		v.insert(p->as<T>()); | ||||
| 	} | ||||
| 	return v; | ||||
| } | ||||
|  | ||||
| template <typename Stream, typename T> | ||||
| inline packer<Stream>& operator<< (packer<Stream>& o, const std::set<T>& v) | ||||
| { | ||||
| 	o.pack_array(v.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> | ||||
| inline void operator<< (object::with_zone& o, const std::set<T>& v) | ||||
| { | ||||
| 	o.type = type::ARRAY; | ||||
| 	if(v.empty()) { | ||||
| 		o.via.array.ptr = NULL; | ||||
| 		o.via.array.size = 0; | ||||
| 	} else { | ||||
| 		object* p = (object*)o.zone->malloc(sizeof(object)*v.size()); | ||||
| 		object* const pend = p + v.size(); | ||||
| 		o.via.array.ptr = p; | ||||
| 		o.via.array.size = v.size(); | ||||
| 		typename std::set<T>::const_iterator it(v.begin()); | ||||
| 		do { | ||||
| 			*p = object(*it, o.zone); | ||||
| 			++p; | ||||
| 			++it; | ||||
| 		} while(p < pend); | ||||
| 	} | ||||
| } | ||||
|  | ||||
|  | ||||
| template <typename T> | ||||
| inline std::multiset<T>& operator>> (object o, std::multiset<T>& v) | ||||
| { | ||||
| 	if(o.type != type::ARRAY) { throw type_error(); } | ||||
| 	object* p = o.via.array.ptr + o.via.array.size; | ||||
| 	object* const pbegin = o.via.array.ptr; | ||||
| 	while(p > pbegin) { | ||||
| 		--p; | ||||
| 		v.insert(p->as<T>()); | ||||
| 	} | ||||
| 	return v; | ||||
| } | ||||
|  | ||||
| template <typename Stream, typename T> | ||||
| inline packer<Stream>& operator<< (packer<Stream>& o, const std::multiset<T>& v) | ||||
| { | ||||
| 	o.pack_array(v.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> | ||||
| inline void operator<< (object::with_zone& o, const std::multiset<T>& v) | ||||
| { | ||||
| 	o.type = type::ARRAY; | ||||
| 	if(v.empty()) { | ||||
| 		o.via.array.ptr = NULL; | ||||
| 		o.via.array.size = 0; | ||||
| 	} else { | ||||
| 		object* p = (object*)o.zone->malloc(sizeof(object)*v.size()); | ||||
| 		object* const pend = p + v.size(); | ||||
| 		o.via.array.ptr = p; | ||||
| 		o.via.array.size = v.size(); | ||||
| 		typename std::multiset<T>::const_iterator it(v.begin()); | ||||
| 		do { | ||||
| 			*p = object(*it, o.zone); | ||||
| 			++p; | ||||
| 			++it; | ||||
| 		} while(p < pend); | ||||
| 	} | ||||
| } | ||||
|  | ||||
|  | ||||
| }  // namespace msgpack | ||||
|  | ||||
| #endif /* msgpack/type/set.hpp */ | ||||
|  | ||||
| @@ -1,62 +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_STRING_HPP__ | ||||
| #define MSGPACK_TYPE_STRING_HPP__ | ||||
|  | ||||
| #include "msgpack/object.hpp" | ||||
| #include <string> | ||||
|  | ||||
| namespace msgpack { | ||||
|  | ||||
|  | ||||
| inline std::string& operator>> (object o, std::string& v) | ||||
| { | ||||
| 	if(o.type != type::RAW) { throw type_error(); } | ||||
| 	v.assign(o.via.raw.ptr, o.via.raw.size); | ||||
| 	return v; | ||||
| } | ||||
|  | ||||
| template <typename Stream> | ||||
| inline packer<Stream>& operator<< (packer<Stream>& o, const std::string& v) | ||||
| { | ||||
| 	o.pack_raw(v.size()); | ||||
| 	o.pack_raw_body(v.data(), v.size()); | ||||
| 	return o; | ||||
| } | ||||
|  | ||||
| inline void operator<< (object::with_zone& o, const std::string& v) | ||||
| { | ||||
| 	o.type = type::RAW; | ||||
| 	char* ptr = (char*)o.zone->malloc(v.size()); | ||||
| 	o.via.raw.ptr = ptr; | ||||
| 	o.via.raw.size = v.size(); | ||||
| 	memcpy(ptr, v.data(), v.size()); | ||||
| } | ||||
|  | ||||
| inline void operator<< (object& o, const std::string& v) | ||||
| { | ||||
| 	o.type = type::RAW; | ||||
| 	o.via.raw.ptr = v.data(); | ||||
| 	o.via.raw.size = v.size(); | ||||
| } | ||||
|  | ||||
|  | ||||
| }  // namespace msgpack | ||||
|  | ||||
| #endif /* msgpack/type/string.hpp */ | ||||
|  | ||||
| @@ -1,129 +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_TR1_UNORDERED_MAP_HPP__ | ||||
| #define MSGPACK_TYPE_TR1_UNORDERED_MAP_HPP__ | ||||
|  | ||||
| #include "msgpack/object.hpp" | ||||
| #include <tr1/unordered_map> | ||||
|  | ||||
| namespace msgpack { | ||||
|  | ||||
|  | ||||
| template <typename K, typename V> | ||||
| inline std::tr1::unordered_map<K, V> operator>> (object o, std::tr1::unordered_map<K, V>& v) | ||||
| { | ||||
| 	if(o.type != type::MAP) { throw type_error(); } | ||||
| 	object_kv* p(o.via.map.ptr); | ||||
| 	object_kv* const pend(o.via.map.ptr + o.via.map.size); | ||||
| 	for(; p != pend; ++p) { | ||||
| 		K key; | ||||
| 		p->key.convert(&key); | ||||
| 		p->val.convert(&v[key]); | ||||
| 	} | ||||
| 	return v; | ||||
| } | ||||
|  | ||||
| template <typename Stream, typename K, typename V> | ||||
| inline packer<Stream>& operator<< (packer<Stream>& o, const std::tr1::unordered_map<K,V>& v) | ||||
| { | ||||
| 	o.pack_map(v.size()); | ||||
| 	for(typename 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> | ||||
| inline void operator<< (object::with_zone& o, const std::tr1::unordered_map<K,V>& v) | ||||
| { | ||||
| 	o.type = type::MAP; | ||||
| 	if(v.empty()) { | ||||
| 		o.via.map.ptr  = NULL; | ||||
| 		o.via.map.size = 0; | ||||
| 	} else { | ||||
| 		object_kv* p = (object_kv*)o.zone->malloc(sizeof(object_kv)*v.size()); | ||||
| 		object_kv* const pend = p + v.size(); | ||||
| 		o.via.map.ptr  = p; | ||||
| 		o.via.map.size = v.size(); | ||||
| 		typename std::tr1::unordered_map<K,V>::const_iterator it(v.begin()); | ||||
| 		do { | ||||
| 			p->key = object(it->first, o.zone); | ||||
| 			p->val = object(it->second, o.zone); | ||||
| 			++p; | ||||
| 			++it; | ||||
| 		} while(p < pend); | ||||
| 	} | ||||
| } | ||||
|  | ||||
|  | ||||
| template <typename K, typename V> | ||||
| inline std::tr1::unordered_multimap<K, V> operator>> (object o, std::tr1::unordered_multimap<K, V>& v) | ||||
| { | ||||
| 	if(o.type != type::MAP) { throw type_error(); } | ||||
| 	object_kv* p(o.via.map.ptr); | ||||
| 	object_kv* const pend(o.via.map.ptr + o.via.map.size); | ||||
| 	for(; p != pend; ++p) { | ||||
| 		std::pair<K, V> value; | ||||
| 		p->key.convert(&value.first); | ||||
| 		p->val.convert(&value.second); | ||||
| 		v.insert(value); | ||||
| 	} | ||||
| 	return v; | ||||
| } | ||||
|  | ||||
| template <typename Stream, typename K, typename V> | ||||
| inline packer<Stream>& operator<< (packer<Stream>& o, const std::tr1::unordered_multimap<K,V>& v) | ||||
| { | ||||
| 	o.pack_map(v.size()); | ||||
| 	for(typename 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> | ||||
| inline void operator<< (object::with_zone& o, const std::tr1::unordered_multimap<K,V>& v) | ||||
| { | ||||
| 	o.type = type::MAP; | ||||
| 	if(v.empty()) { | ||||
| 		o.via.map.ptr  = NULL; | ||||
| 		o.via.map.size = 0; | ||||
| 	} else { | ||||
| 		object_kv* p = (object_kv*)o.zone->malloc(sizeof(object_kv)*v.size()); | ||||
| 		object_kv* const pend = p + v.size(); | ||||
| 		o.via.map.ptr  = p; | ||||
| 		o.via.map.size = v.size(); | ||||
| 		typename std::tr1::unordered_multimap<K,V>::const_iterator it(v.begin()); | ||||
| 		do { | ||||
| 			p->key = object(it->first, o.zone); | ||||
| 			p->val = object(it->second, o.zone); | ||||
| 			++p; | ||||
| 			++it; | ||||
| 		} while(p < pend); | ||||
| 	} | ||||
| } | ||||
|  | ||||
|  | ||||
| }  // namespace msgpack | ||||
|  | ||||
| #endif /* msgpack/type/map.hpp */ | ||||
|  | ||||
| @@ -1,122 +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_TR1_UNORDERED_SET_HPP__ | ||||
| #define MSGPACK_TYPE_TR1_UNORDERED_SET_HPP__ | ||||
|  | ||||
| #include "msgpack/object.hpp" | ||||
| #include <tr1/unordered_set> | ||||
|  | ||||
| namespace msgpack { | ||||
|  | ||||
|  | ||||
| template <typename T> | ||||
| inline std::tr1::unordered_set<T>& operator>> (object o, std::tr1::unordered_set<T>& v) | ||||
| { | ||||
| 	if(o.type != type::ARRAY) { throw type_error(); } | ||||
| 	object* p = o.via.array.ptr + o.via.array.size; | ||||
| 	object* const pbegin = o.via.array.ptr; | ||||
| 	while(p > pbegin) { | ||||
| 		--p; | ||||
| 		v.insert(p->as<T>()); | ||||
| 	} | ||||
| 	return v; | ||||
| } | ||||
|  | ||||
| template <typename Stream, typename T> | ||||
| inline packer<Stream>& operator<< (packer<Stream>& o, const std::tr1::unordered_set<T>& v) | ||||
| { | ||||
| 	o.pack_array(v.size()); | ||||
| 	for(typename 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> | ||||
| inline void operator<< (object::with_zone& o, const std::tr1::unordered_set<T>& v) | ||||
| { | ||||
| 	o.type = type::ARRAY; | ||||
| 	if(v.empty()) { | ||||
| 		o.via.array.ptr = NULL; | ||||
| 		o.via.array.size = 0; | ||||
| 	} else { | ||||
| 		object* p = (object*)o.zone->malloc(sizeof(object)*v.size()); | ||||
| 		object* const pend = p + v.size(); | ||||
| 		o.via.array.ptr = p; | ||||
| 		o.via.array.size = v.size(); | ||||
| 		typename std::tr1::unordered_set<T>::const_iterator it(v.begin()); | ||||
| 		do { | ||||
| 			*p = object(*it, o.zone); | ||||
| 			++p; | ||||
| 			++it; | ||||
| 		} while(p < pend); | ||||
| 	} | ||||
| } | ||||
|  | ||||
|  | ||||
| template <typename T> | ||||
| inline std::tr1::unordered_multiset<T>& operator>> (object o, std::tr1::unordered_multiset<T>& v) | ||||
| { | ||||
| 	if(o.type != type::ARRAY) { throw type_error(); } | ||||
| 	object* p = o.via.array.ptr + o.via.array.size; | ||||
| 	object* const pbegin = o.via.array.ptr; | ||||
| 	while(p > pbegin) { | ||||
| 		--p; | ||||
| 		v.insert(p->as<T>()); | ||||
| 	} | ||||
| 	return v; | ||||
| } | ||||
|  | ||||
| template <typename Stream, typename T> | ||||
| inline packer<Stream>& operator<< (packer<Stream>& o, const std::tr1::unordered_multiset<T>& v) | ||||
| { | ||||
| 	o.pack_array(v.size()); | ||||
| 	for(typename 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> | ||||
| inline void operator<< (object::with_zone& o, const std::tr1::unordered_multiset<T>& v) | ||||
| { | ||||
| 	o.type = type::ARRAY; | ||||
| 	if(v.empty()) { | ||||
| 		o.via.array.ptr = NULL; | ||||
| 		o.via.array.size = 0; | ||||
| 	} else { | ||||
| 		object* p = (object*)o.zone->malloc(sizeof(object)*v.size()); | ||||
| 		object* const pend = p + v.size(); | ||||
| 		o.via.array.ptr = p; | ||||
| 		o.via.array.size = v.size(); | ||||
| 		typename std::tr1::unordered_multiset<T>::const_iterator it(v.begin()); | ||||
| 		do { | ||||
| 			*p = object(*it, o.zone); | ||||
| 			++p; | ||||
| 			++it; | ||||
| 		} while(p < pend); | ||||
| 	} | ||||
| } | ||||
|  | ||||
|  | ||||
| }  // namespace msgpack | ||||
|  | ||||
| #endif /* msgpack/type/set.hpp */ | ||||
|  | ||||
| @@ -1,206 +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_TUPLE_HPP__ | ||||
| #define MSGPACK_TYPE_TUPLE_HPP__ | ||||
|  | ||||
| #include "msgpack/object.hpp" | ||||
|  | ||||
| namespace msgpack { | ||||
|  | ||||
| namespace type { | ||||
|  | ||||
| // FIXME operator== | ||||
| // FIXME operator!= | ||||
| <% GENERATION_LIMIT = 31 %> | ||||
|  | ||||
| template <typename A0 = void<%1.upto(GENERATION_LIMIT+1) {|i|%>, typename A<%=i%> = void<%}%>> | ||||
| struct tuple; | ||||
|  | ||||
| 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; | ||||
| }; | ||||
|  | ||||
| <%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) : _x(x.a<%=j%>) {} | ||||
| 	typename tuple_type<A<%=j%>>::reference get() { return _x; } | ||||
| 	typename tuple_type<A<%=j%>>::const_reference get() const { return _x; } | ||||
| private: | ||||
| 	typename tuple_type<A<%=j%>>::reference _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) : _x(x.a<%=j%>) {} | ||||
| 	typename tuple_type<A<%=j%>>::const_reference get() const { return _x; } | ||||
| private: | ||||
| 	typename tuple_type<A<%=j%>>::const_reference _x; | ||||
| }; | ||||
| <%}%> | ||||
| <%}%> | ||||
|  | ||||
| template <> | ||||
| struct tuple<> { | ||||
| 	tuple() {} | ||||
| 	tuple(object o) { o.convert(this); } | ||||
| 	typedef tuple<> value_type; | ||||
| }; | ||||
| <%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(object 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%>;<%}%> | ||||
| }; | ||||
| <%}%> | ||||
|  | ||||
| inline tuple<> make_tuple() | ||||
| { | ||||
| 	return tuple<>(); | ||||
| } | ||||
| <%0.upto(GENERATION_LIMIT) {|i|%> | ||||
| template <typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>> | ||||
| tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> make_tuple(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%><%}%>); | ||||
| } | ||||
| <%}%> | ||||
|  | ||||
| }  // namespace type | ||||
|  | ||||
|  | ||||
| inline type::tuple<>& operator>> ( | ||||
| 		object o, | ||||
| 		type::tuple<>& v) { | ||||
| 	if(o.type != type::ARRAY) { throw type_error(); } | ||||
| 	return v; | ||||
| } | ||||
| <%0.upto(GENERATION_LIMIT) {|i|%> | ||||
| template <typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>> | ||||
| type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>>& operator>> ( | ||||
| 		object o, | ||||
| 		type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>>& v) { | ||||
| 	if(o.type != type::ARRAY) { throw type_error(); } | ||||
| 	if(o.via.array.size < <%=i+1%>) { throw type_error(); } | ||||
| 	<%0.upto(i) {|j|%> | ||||
| 	o.via.array.ptr[<%=j%>].convert<typename type::tuple_type<A<%=j%>>::type>(&v.template get<<%=j%>>());<%}%> | ||||
| 	return v; | ||||
| } | ||||
| <%}%> | ||||
|  | ||||
| template <typename Stream> | ||||
| const packer<Stream>& operator<< ( | ||||
| 		packer<Stream>& o, | ||||
| 		const type::tuple<>& v) { | ||||
| 	o.pack_array(0); | ||||
| 	return o; | ||||
| } | ||||
| <%0.upto(GENERATION_LIMIT) {|i|%> | ||||
| template <typename Stream, typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>> | ||||
| const packer<Stream>& operator<< ( | ||||
| 		packer<Stream>& o, | ||||
| 		const type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>>& v) { | ||||
| 	o.pack_array(<%=i+1%>); | ||||
| 	<%0.upto(i) {|j|%> | ||||
| 	o.pack(v.template get<<%=j%>>());<%}%> | ||||
| 	return o; | ||||
| } | ||||
| <%}%> | ||||
|  | ||||
| inline void operator<< ( | ||||
| 		object::with_zone& o, | ||||
| 		const type::tuple<>& v) { | ||||
| 	o.type = type::ARRAY; | ||||
| 	o.via.array.ptr = NULL; | ||||
| 	o.via.array.size = 0; | ||||
| } | ||||
| <%0.upto(GENERATION_LIMIT) {|i|%> | ||||
| template <typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>> | ||||
| inline void operator<< ( | ||||
| 		object::with_zone& o, | ||||
| 		const type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>>& v) { | ||||
| 	o.type = type::ARRAY; | ||||
| 	o.via.array.ptr = (object*)o.zone->malloc(sizeof(object)*<%=i+1%>); | ||||
| 	o.via.array.size = <%=i+1%>; | ||||
| 	<%0.upto(i) {|j|%> | ||||
| 	o.via.array.ptr[<%=j%>] = object(v.template get<<%=j%>>(), o.zone);<%}%> | ||||
| } | ||||
| <%}%> | ||||
|  | ||||
| }  // namespace msgpack | ||||
|  | ||||
|  | ||||
| //inline std::ostream& operator<< (std::ostream& o, const msgpack::type::tuple<>& v) { | ||||
| //  return o << "[]"; | ||||
| //} | ||||
| //<%0.upto(GENERATION_LIMIT) {|i|%> | ||||
| //template <typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>> | ||||
| //inline std::ostream& operator<< (std::ostream& o, | ||||
| //		const msgpack::type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>>& v) { | ||||
| //	return o << "[" | ||||
| //	<%0.upto(i) {|j|%> | ||||
| //	<<<%if j != 0 then%> ", " <<<%end%> v.template get<<%=j%>>()<%}%> | ||||
| //	<< "]"; | ||||
| //} | ||||
| //<%}%> | ||||
|  | ||||
| #endif /* msgpack/type/tuple.hpp */ | ||||
|  | ||||
| @@ -1,81 +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/object.hpp" | ||||
| #include <vector> | ||||
|  | ||||
| namespace msgpack { | ||||
|  | ||||
|  | ||||
| template <typename T> | ||||
| inline std::vector<T>& operator>> (object o, std::vector<T>& v) | ||||
| { | ||||
| 	if(o.type != type::ARRAY) { throw type_error(); } | ||||
| 	v.resize(o.via.array.size); | ||||
| 	if(o.via.array.size > 0) { | ||||
| 		object* p = o.via.array.ptr; | ||||
| 		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 v; | ||||
| } | ||||
|  | ||||
| template <typename Stream, typename T> | ||||
| inline packer<Stream>& operator<< (packer<Stream>& o, const std::vector<T>& v) | ||||
| { | ||||
| 	o.pack_array(v.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> | ||||
| inline void operator<< (object::with_zone& o, const std::vector<T>& v) | ||||
| { | ||||
| 	o.type = type::ARRAY; | ||||
| 	if(v.empty()) { | ||||
| 		o.via.array.ptr = NULL; | ||||
| 		o.via.array.size = 0; | ||||
| 	} else { | ||||
| 		object* p = (object*)o.zone->malloc(sizeof(object)*v.size()); | ||||
| 		object* const pend = p + v.size(); | ||||
| 		o.via.array.ptr = p; | ||||
| 		o.via.array.size = v.size(); | ||||
| 		typename std::vector<T>::const_iterator it(v.begin()); | ||||
| 		do { | ||||
| 			*p = object(*it, o.zone); | ||||
| 			++p; | ||||
| 			++it; | ||||
| 		} while(p < pend); | ||||
| 	} | ||||
| } | ||||
|  | ||||
|  | ||||
| }  // namespace msgpack | ||||
|  | ||||
| #endif /* msgpack/type/vector.hpp */ | ||||
|  | ||||
| @@ -1,384 +0,0 @@ | ||||
| // | ||||
| // MessagePack for C++ deserializing 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_UNPACK_HPP__ | ||||
| #define MSGPACK_UNPACK_HPP__ | ||||
|  | ||||
| #include "unpack.h" | ||||
| #include "object.hpp" | ||||
| #include "zone.hpp" | ||||
| #include <memory> | ||||
| #include <stdexcept> | ||||
|  | ||||
| // backward compatibility | ||||
| #ifndef MSGPACK_UNPACKER_DEFAULT_INITIAL_BUFFER_SIZE | ||||
| #define MSGPACK_UNPACKER_DEFAULT_INITIAL_BUFFER_SIZE MSGPACK_UNPACKER_INIT_BUFFER_SIZE | ||||
| #endif | ||||
|  | ||||
| namespace msgpack { | ||||
|  | ||||
|  | ||||
| struct unpack_error : public std::runtime_error { | ||||
| 	unpack_error(const std::string& msg) : | ||||
| 		std::runtime_error(msg) { } | ||||
| }; | ||||
|  | ||||
|  | ||||
| class unpacked { | ||||
| public: | ||||
| 	unpacked() { } | ||||
|  | ||||
| 	unpacked(object obj, std::auto_ptr<msgpack::zone> z) : | ||||
| 		m_obj(obj), m_zone(z) { } | ||||
|  | ||||
| 	object& get() | ||||
| 		{ return m_obj; } | ||||
|  | ||||
| 	const object& get() const | ||||
| 		{ return m_obj; } | ||||
|  | ||||
| 	std::auto_ptr<msgpack::zone>& zone() | ||||
| 		{ return m_zone; } | ||||
|  | ||||
| 	const std::auto_ptr<msgpack::zone>& zone() const | ||||
| 		{ return m_zone; } | ||||
|  | ||||
| private: | ||||
| 	object m_obj; | ||||
| 	std::auto_ptr<msgpack::zone> m_zone; | ||||
| }; | ||||
|  | ||||
|  | ||||
| class unpacker : public msgpack_unpacker { | ||||
| public: | ||||
| 	unpacker(size_t init_buffer_size = MSGPACK_UNPACKER_INIT_BUFFER_SIZE); | ||||
| 	~unpacker(); | ||||
|  | ||||
| public: | ||||
| 	/*! 1. reserve buffer. at least `size' bytes of capacity will be ready */ | ||||
| 	void reserve_buffer(size_t size = MSGPACK_UNPACKER_RESERVE_SIZE); | ||||
|  | ||||
| 	/*! 2. read data to the buffer() up to buffer_capacity() bytes */ | ||||
| 	char* buffer(); | ||||
| 	size_t buffer_capacity() const; | ||||
|  | ||||
| 	/*! 3. specify the number of bytes actually copied */ | ||||
| 	void buffer_consumed(size_t size); | ||||
|  | ||||
| 	/*! 4. repeat next() until it retunrs false */ | ||||
| 	bool next(unpacked* result); | ||||
|  | ||||
| 	/*! 5. check if the size of message doesn't exceed assumption. */ | ||||
| 	size_t message_size() const; | ||||
|  | ||||
| 	// Basic usage of the unpacker is as following: | ||||
| 	// | ||||
| 	// msgpack::unpacker pac; | ||||
| 	// while( /* input is readable */ ) { | ||||
| 	// | ||||
| 	//     // 1. | ||||
| 	//     pac.reserve_buffer(32*1024); | ||||
| 	// | ||||
| 	//     // 2. | ||||
| 	//     size_t bytes = input.readsome(pac.buffer(), pac.buffer_capacity()); | ||||
| 	// | ||||
| 	//     // error handling ... | ||||
| 	// | ||||
| 	//     // 3. | ||||
| 	//     pac.buffer_consumed(bytes); | ||||
| 	// | ||||
| 	//     // 4. | ||||
| 	//     msgpack::unpacked result; | ||||
| 	//     while(pac.next(&result)) { | ||||
| 	//         // do some with the object with the zone. | ||||
| 	//         msgpack::object obj = result.get(); | ||||
| 	//         std::auto_ptr<msgpack:zone> z = result.zone(); | ||||
| 	//         on_message(obj, z); | ||||
| 	// | ||||
| 	//         //// boost::shared_ptr is also usable: | ||||
| 	//         // boost::shared_ptr<msgpack::zone> life(z.release()); | ||||
| 	//         // on_message(result.get(), life); | ||||
| 	//     } | ||||
| 	// | ||||
| 	//     // 5. | ||||
| 	//     if(pac.message_size() > 10*1024*1024) { | ||||
| 	//         throw std::runtime_error("message is too large"); | ||||
| 	//     } | ||||
| 	// } | ||||
| 	// | ||||
|  | ||||
| 	/*! for backward compatibility */ | ||||
| 	bool execute(); | ||||
|  | ||||
| 	/*! for backward compatibility */ | ||||
| 	object data(); | ||||
|  | ||||
| 	/*! for backward compatibility */ | ||||
| 	zone* release_zone(); | ||||
|  | ||||
| 	/*! for backward compatibility */ | ||||
| 	void reset_zone(); | ||||
|  | ||||
| 	/*! for backward compatibility */ | ||||
| 	void reset(); | ||||
|  | ||||
| public: | ||||
| 	// These functions are usable when non-MessagePack message follows after | ||||
| 	// MessagePack message. | ||||
| 	size_t parsed_size() const; | ||||
|  | ||||
| 	/*! get address of the buffer that is not parsed */ | ||||
| 	char* nonparsed_buffer(); | ||||
| 	size_t nonparsed_size() const; | ||||
|  | ||||
| 	/*! skip specified size of non-parsed buffer, leaving the buffer */ | ||||
| 	// Note that the `size' argument must be smaller than nonparsed_size() | ||||
| 	void skip_nonparsed_buffer(size_t size); | ||||
|  | ||||
| 	/*! remove unparsed buffer from unpacker */ | ||||
| 	// Note that reset() leaves non-parsed buffer. | ||||
| 	void remove_nonparsed_buffer(); | ||||
|  | ||||
| private: | ||||
| 	typedef msgpack_unpacker base; | ||||
|  | ||||
| private: | ||||
| 	unpacker(const unpacker&); | ||||
| }; | ||||
|  | ||||
|  | ||||
| static void unpack(unpacked* result, | ||||
| 		const char* data, size_t len, size_t* offset = NULL); | ||||
|  | ||||
|  | ||||
| // obsolete | ||||
| typedef enum { | ||||
| 	UNPACK_SUCCESS				=  2, | ||||
| 	UNPACK_EXTRA_BYTES			=  1, | ||||
| 	UNPACK_CONTINUE				=  0, | ||||
| 	UNPACK_PARSE_ERROR			= -1, | ||||
| } unpack_return; | ||||
|  | ||||
| // obsolete | ||||
| static unpack_return unpack(const char* data, size_t len, size_t* off, | ||||
| 		zone* z, object* result); | ||||
|  | ||||
|  | ||||
| // obsolete | ||||
| static object unpack(const char* data, size_t len, zone& z, size_t* off = NULL); | ||||
|  | ||||
|  | ||||
| inline unpacker::unpacker(size_t initial_buffer_size) | ||||
| { | ||||
| 	if(!msgpack_unpacker_init(this, initial_buffer_size)) { | ||||
| 		throw std::bad_alloc(); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| inline unpacker::~unpacker() | ||||
| { | ||||
| 	msgpack_unpacker_destroy(this); | ||||
| } | ||||
|  | ||||
|  | ||||
| inline void unpacker::reserve_buffer(size_t size) | ||||
| { | ||||
| 	if(!msgpack_unpacker_reserve_buffer(this, size)) { | ||||
| 		throw std::bad_alloc(); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| inline char* unpacker::buffer() | ||||
| { | ||||
| 	return msgpack_unpacker_buffer(this); | ||||
| } | ||||
|  | ||||
| inline size_t unpacker::buffer_capacity() const | ||||
| { | ||||
| 	return msgpack_unpacker_buffer_capacity(this); | ||||
| } | ||||
|  | ||||
| inline void unpacker::buffer_consumed(size_t size) | ||||
| { | ||||
| 	return msgpack_unpacker_buffer_consumed(this, size); | ||||
| } | ||||
|  | ||||
| inline bool unpacker::next(unpacked* result) | ||||
| { | ||||
| 	int ret = msgpack_unpacker_execute(this); | ||||
|  | ||||
| 	if(ret < 0) { | ||||
| 		throw unpack_error("parse error"); | ||||
| 	} | ||||
|  | ||||
| 	if(ret == 0) { | ||||
| 		result->zone().reset(); | ||||
| 		result->get() = object(); | ||||
| 		return false; | ||||
|  | ||||
| 	} else { | ||||
| 		result->zone().reset( release_zone() ); | ||||
| 		result->get() = data(); | ||||
| 		reset(); | ||||
| 		return true; | ||||
| 	} | ||||
| } | ||||
|  | ||||
|  | ||||
| inline bool unpacker::execute() | ||||
| { | ||||
| 	int ret = msgpack_unpacker_execute(this); | ||||
| 	if(ret < 0) { | ||||
| 		throw unpack_error("parse error"); | ||||
| 	} else if(ret == 0) { | ||||
| 		return false; | ||||
| 	} else { | ||||
| 		return true; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| inline object unpacker::data() | ||||
| { | ||||
| 	return msgpack_unpacker_data(this); | ||||
| } | ||||
|  | ||||
| inline zone* unpacker::release_zone() | ||||
| { | ||||
| 	if(!msgpack_unpacker_flush_zone(this)) { | ||||
| 		throw std::bad_alloc(); | ||||
| 	} | ||||
|  | ||||
| 	zone* r = new zone(); | ||||
|  | ||||
| 	msgpack_zone old = *base::z; | ||||
| 	*base::z = *r; | ||||
| 	*static_cast<msgpack_zone*>(r) = old; | ||||
|  | ||||
| 	return r; | ||||
| } | ||||
|  | ||||
| inline void unpacker::reset_zone() | ||||
| { | ||||
| 	msgpack_unpacker_reset_zone(this); | ||||
| } | ||||
|  | ||||
| inline void unpacker::reset() | ||||
| { | ||||
| 	msgpack_unpacker_reset(this); | ||||
| } | ||||
|  | ||||
|  | ||||
| inline size_t unpacker::message_size() const | ||||
| { | ||||
| 	return msgpack_unpacker_message_size(this); | ||||
| } | ||||
|  | ||||
| inline size_t unpacker::parsed_size() const | ||||
| { | ||||
| 	return msgpack_unpacker_parsed_size(this); | ||||
| } | ||||
|  | ||||
| inline char* unpacker::nonparsed_buffer() | ||||
| { | ||||
| 	return base::buffer + base::off; | ||||
| } | ||||
|  | ||||
| inline size_t unpacker::nonparsed_size() const | ||||
| { | ||||
| 	return base::used - base::off; | ||||
| } | ||||
|  | ||||
| inline void unpacker::skip_nonparsed_buffer(size_t size) | ||||
| { | ||||
| 	base::off += size; | ||||
| } | ||||
|  | ||||
| inline void unpacker::remove_nonparsed_buffer() | ||||
| { | ||||
| 	base::used = base::off; | ||||
| } | ||||
|  | ||||
|  | ||||
| inline void unpack(unpacked* result, | ||||
| 		const char* data, size_t len, size_t* offset) | ||||
| { | ||||
| 	msgpack::object obj; | ||||
| 	std::auto_ptr<msgpack::zone> z(new zone()); | ||||
|  | ||||
| 	unpack_return ret = (unpack_return)msgpack_unpack( | ||||
| 			data, len, offset, z.get(), | ||||
| 			reinterpret_cast<msgpack_object*>(&obj)); | ||||
|  | ||||
| 	switch(ret) { | ||||
| 	case UNPACK_SUCCESS: | ||||
| 		result->get() = obj; | ||||
| 		result->zone() = z; | ||||
| 		return; | ||||
|  | ||||
| 	case UNPACK_EXTRA_BYTES: | ||||
| 		result->get() = obj; | ||||
| 		result->zone() = z; | ||||
| 		return; | ||||
|  | ||||
| 	case UNPACK_CONTINUE: | ||||
| 		throw unpack_error("insufficient bytes"); | ||||
|  | ||||
| 	case UNPACK_PARSE_ERROR: | ||||
| 	default: | ||||
| 		throw unpack_error("parse error"); | ||||
| 	} | ||||
| } | ||||
|  | ||||
|  | ||||
| // obsolete | ||||
| inline unpack_return unpack(const char* data, size_t len, size_t* off, | ||||
| 		zone* z, object* result) | ||||
| { | ||||
| 	return (unpack_return)msgpack_unpack(data, len, off, | ||||
| 			z, reinterpret_cast<msgpack_object*>(result)); | ||||
| } | ||||
|  | ||||
| // obsolete | ||||
| inline object unpack(const char* data, size_t len, zone& z, size_t* off) | ||||
| { | ||||
| 	object result; | ||||
|  | ||||
| 	switch( msgpack::unpack(data, len, off, &z, &result) ) { | ||||
| 	case UNPACK_SUCCESS: | ||||
| 		return result; | ||||
|  | ||||
| 	case UNPACK_EXTRA_BYTES: | ||||
| 		if(off) { | ||||
| 			return result; | ||||
| 		} else { | ||||
| 			throw unpack_error("extra bytes"); | ||||
| 		} | ||||
|  | ||||
| 	case UNPACK_CONTINUE: | ||||
| 		throw unpack_error("insufficient bytes"); | ||||
|  | ||||
| 	case UNPACK_PARSE_ERROR: | ||||
| 	default: | ||||
| 		throw unpack_error("parse error"); | ||||
| 	} | ||||
| } | ||||
|  | ||||
|  | ||||
| }  // namespace msgpack | ||||
|  | ||||
| #endif /* msgpack/unpack.hpp */ | ||||
|  | ||||
| @@ -1,40 +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 | ||||
|  | ||||
|  | ||||
| const char* msgpack_version(void); | ||||
| int msgpack_version_major(void); | ||||
| int msgpack_version_minor(void); | ||||
|  | ||||
| #define MSGPACK_VERSION "@VERSION@" | ||||
| #define MSGPACK_VERSION_MAJOR @VERSION_MAJOR@ | ||||
| #define MSGPACK_VERSION_MINOR @VERSION_MINOR@ | ||||
|  | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif /* msgpack/version.h */ | ||||
|  | ||||
| @@ -1,142 +0,0 @@ | ||||
| /* | ||||
|  * MessagePack for C zero-copy 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_VREFBUFFER_H__ | ||||
| #define MSGPACK_VREFBUFFER_H__ | ||||
|  | ||||
| #include "zone.h" | ||||
| #include <stdlib.h> | ||||
|  | ||||
| #ifndef _WIN32 | ||||
| #include <sys/uio.h> | ||||
| #else | ||||
| struct iovec { | ||||
| 	void  *iov_base; | ||||
| 	size_t iov_len; | ||||
| }; | ||||
| #endif | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * @defgroup msgpack_vrefbuffer Vectored Referencing buffer | ||||
|  * @ingroup msgpack_buffer | ||||
|  * @{ | ||||
|  */ | ||||
|  | ||||
| struct msgpack_vrefbuffer_chunk; | ||||
| typedef struct msgpack_vrefbuffer_chunk msgpack_vrefbuffer_chunk; | ||||
|  | ||||
| typedef struct msgpack_vrefbuffer_inner_buffer { | ||||
| 	size_t free; | ||||
| 	char*  ptr; | ||||
| 	msgpack_vrefbuffer_chunk* head; | ||||
| } msgpack_vrefbuffer_inner_buffer; | ||||
|  | ||||
| typedef struct msgpack_vrefbuffer { | ||||
| 	struct iovec* tail; | ||||
| 	struct iovec* end; | ||||
| 	struct iovec* array; | ||||
|  | ||||
| 	size_t chunk_size; | ||||
| 	size_t ref_size; | ||||
|  | ||||
| 	msgpack_vrefbuffer_inner_buffer inner_buffer; | ||||
| } msgpack_vrefbuffer; | ||||
|  | ||||
|  | ||||
| #ifndef MSGPACK_VREFBUFFER_REF_SIZE | ||||
| #define MSGPACK_VREFBUFFER_REF_SIZE 32 | ||||
| #endif | ||||
|  | ||||
| #ifndef MSGPACK_VREFBUFFER_CHUNK_SIZE | ||||
| #define MSGPACK_VREFBUFFER_CHUNK_SIZE 8192 | ||||
| #endif | ||||
|  | ||||
| bool msgpack_vrefbuffer_init(msgpack_vrefbuffer* vbuf, | ||||
| 		size_t ref_size, size_t chunk_size); | ||||
| void msgpack_vrefbuffer_destroy(msgpack_vrefbuffer* vbuf); | ||||
|  | ||||
| static inline msgpack_vrefbuffer* msgpack_vrefbuffer_new(size_t ref_size, size_t chunk_size); | ||||
| static inline void msgpack_vrefbuffer_free(msgpack_vrefbuffer* vbuf); | ||||
|  | ||||
| static inline int msgpack_vrefbuffer_write(void* data, const char* buf, unsigned int len); | ||||
|  | ||||
| static inline const struct iovec* msgpack_vrefbuffer_vec(const msgpack_vrefbuffer* vref); | ||||
| static inline size_t msgpack_vrefbuffer_veclen(const msgpack_vrefbuffer* vref); | ||||
|  | ||||
| int msgpack_vrefbuffer_append_copy(msgpack_vrefbuffer* vbuf, | ||||
| 		const char* buf, unsigned int len); | ||||
|  | ||||
| int msgpack_vrefbuffer_append_ref(msgpack_vrefbuffer* vbuf, | ||||
| 		const char* buf, unsigned int len); | ||||
|  | ||||
| int msgpack_vrefbuffer_migrate(msgpack_vrefbuffer* vbuf, msgpack_vrefbuffer* to); | ||||
|  | ||||
| void msgpack_vrefbuffer_clear(msgpack_vrefbuffer* vref); | ||||
|  | ||||
| /** @} */ | ||||
|  | ||||
|  | ||||
| msgpack_vrefbuffer* msgpack_vrefbuffer_new(size_t ref_size, size_t chunk_size) | ||||
| { | ||||
| 	msgpack_vrefbuffer* vbuf = (msgpack_vrefbuffer*)malloc(sizeof(msgpack_vrefbuffer)); | ||||
| 	if(!msgpack_vrefbuffer_init(vbuf, ref_size, chunk_size)) { | ||||
| 		free(vbuf); | ||||
| 		return NULL; | ||||
| 	} | ||||
| 	return vbuf; | ||||
| } | ||||
|  | ||||
| void msgpack_vrefbuffer_free(msgpack_vrefbuffer* vbuf) | ||||
| { | ||||
| 	if(vbuf == NULL) { return; } | ||||
| 	msgpack_vrefbuffer_destroy(vbuf); | ||||
| 	free(vbuf); | ||||
| } | ||||
|  | ||||
| int msgpack_vrefbuffer_write(void* data, const char* buf, unsigned int len) | ||||
| { | ||||
| 	msgpack_vrefbuffer* vbuf = (msgpack_vrefbuffer*)data; | ||||
|  | ||||
| 	if(len < vbuf->ref_size) { | ||||
| 		return msgpack_vrefbuffer_append_copy(vbuf, buf, len); | ||||
| 	} else { | ||||
| 		return msgpack_vrefbuffer_append_ref(vbuf, buf, len); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const struct iovec* msgpack_vrefbuffer_vec(const msgpack_vrefbuffer* vref) | ||||
| { | ||||
| 	return vref->array; | ||||
| } | ||||
|  | ||||
| size_t msgpack_vrefbuffer_veclen(const msgpack_vrefbuffer* vref) | ||||
| { | ||||
| 	return vref->tail - vref->array; | ||||
| } | ||||
|  | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif /* msgpack/vrefbuffer.h */ | ||||
|  | ||||
| @@ -1,97 +0,0 @@ | ||||
| // | ||||
| // MessagePack for C++ zero-copy 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_VREFBUFFER_HPP__ | ||||
| #define MSGPACK_VREFBUFFER_HPP__ | ||||
|  | ||||
| #include "vrefbuffer.h" | ||||
| #include <stdexcept> | ||||
|  | ||||
| namespace msgpack { | ||||
|  | ||||
|  | ||||
| class vrefbuffer : public msgpack_vrefbuffer { | ||||
| public: | ||||
| 	vrefbuffer(size_t ref_size = MSGPACK_VREFBUFFER_REF_SIZE, | ||||
| 			size_t chunk_size = MSGPACK_VREFBUFFER_CHUNK_SIZE) | ||||
| 	{ | ||||
| 		msgpack_vrefbuffer_init(this, ref_size, chunk_size); | ||||
| 	} | ||||
|  | ||||
| 	~vrefbuffer() | ||||
| 	{ | ||||
| 		msgpack_vrefbuffer_destroy(this); | ||||
| 	} | ||||
|  | ||||
| public: | ||||
| 	void write(const char* buf, unsigned int len) | ||||
| 	{ | ||||
| 		if(len < base::ref_size) { | ||||
| 			append_copy(buf, len); | ||||
| 		} else { | ||||
| 			append_ref(buf, len); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	void append_ref(const char* buf, size_t len) | ||||
| 	{ | ||||
| 		if(msgpack_vrefbuffer_append_ref(this, buf, len) < 0) { | ||||
| 			throw std::bad_alloc(); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	void append_copy(const char* buf, size_t len) | ||||
| 	{ | ||||
| 		if(msgpack_vrefbuffer_append_copy(this, buf, len) < 0) { | ||||
| 			throw std::bad_alloc(); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	const struct iovec* vector() const | ||||
| 	{ | ||||
| 		return msgpack_vrefbuffer_vec(this); | ||||
| 	} | ||||
|  | ||||
| 	size_t vector_size() const | ||||
| 	{ | ||||
| 		return msgpack_vrefbuffer_veclen(this); | ||||
| 	} | ||||
|  | ||||
| 	void migrate(vrefbuffer* to) | ||||
| 	{ | ||||
| 		if(msgpack_vrefbuffer_migrate(this, to) < 0) { | ||||
| 			throw std::bad_alloc(); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	void clear() | ||||
| 	{ | ||||
| 		msgpack_vrefbuffer_clear(this); | ||||
| 	} | ||||
|  | ||||
| private: | ||||
| 	typedef msgpack_vrefbuffer base; | ||||
|  | ||||
| private: | ||||
| 	vrefbuffer(const vrefbuffer&); | ||||
| }; | ||||
|  | ||||
|  | ||||
| }  // namespace msgpack | ||||
|  | ||||
| #endif /* msgpack/vrefbuffer.hpp */ | ||||
|  | ||||
| @@ -1,207 +0,0 @@ | ||||
| /* | ||||
|  * MessagePack for C deflate buffer implementation | ||||
|  * | ||||
|  * Copyright (C) 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_ZBUFFER_H__ | ||||
| #define MSGPACK_ZBUFFER_H__ | ||||
|  | ||||
| #include "sysdep.h" | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include <zlib.h> | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * @defgroup msgpack_zbuffer Compressed buffer | ||||
|  * @ingroup msgpack_buffer | ||||
|  * @{ | ||||
|  */ | ||||
|  | ||||
| typedef struct msgpack_zbuffer { | ||||
| 	z_stream stream; | ||||
| 	char* data; | ||||
| 	size_t init_size; | ||||
| } msgpack_zbuffer; | ||||
|  | ||||
| #ifndef MSGPACK_ZBUFFER_INIT_SIZE | ||||
| #define MSGPACK_ZBUFFER_INIT_SIZE 8192 | ||||
| #endif | ||||
|  | ||||
| static inline bool msgpack_zbuffer_init(msgpack_zbuffer* zbuf, | ||||
| 		int level, size_t init_size); | ||||
| static inline void msgpack_zbuffer_destroy(msgpack_zbuffer* zbuf); | ||||
|  | ||||
| static inline msgpack_zbuffer* msgpack_zbuffer_new(int level, size_t init_size); | ||||
| static inline void msgpack_zbuffer_free(msgpack_zbuffer* zbuf); | ||||
|  | ||||
| static inline char* msgpack_zbuffer_flush(msgpack_zbuffer* zbuf); | ||||
|  | ||||
| static inline const char* msgpack_zbuffer_data(const msgpack_zbuffer* zbuf); | ||||
| static inline size_t msgpack_zbuffer_size(const msgpack_zbuffer* zbuf); | ||||
|  | ||||
| static inline bool msgpack_zbuffer_reset(msgpack_zbuffer* zbuf); | ||||
| static inline void msgpack_zbuffer_reset_buffer(msgpack_zbuffer* zbuf); | ||||
| static inline char* msgpack_zbuffer_release_buffer(msgpack_zbuffer* zbuf); | ||||
|  | ||||
|  | ||||
| #ifndef MSGPACK_ZBUFFER_RESERVE_SIZE | ||||
| #define MSGPACK_ZBUFFER_RESERVE_SIZE 512 | ||||
| #endif | ||||
|  | ||||
| static inline int msgpack_zbuffer_write(void* data, const char* buf, unsigned int len); | ||||
|  | ||||
| static inline bool msgpack_zbuffer_expand(msgpack_zbuffer* zbuf); | ||||
|  | ||||
|  | ||||
| bool msgpack_zbuffer_init(msgpack_zbuffer* zbuf, | ||||
| 		int level, size_t init_size) | ||||
| { | ||||
| 	memset(zbuf, 0, sizeof(msgpack_zbuffer)); | ||||
| 	zbuf->init_size = init_size; | ||||
| 	if(deflateInit(&zbuf->stream, level) != Z_OK) { | ||||
| 		free(zbuf->data); | ||||
| 		return false; | ||||
| 	} | ||||
| 	return true; | ||||
| } | ||||
|  | ||||
| void msgpack_zbuffer_destroy(msgpack_zbuffer* zbuf) | ||||
| { | ||||
| 	deflateEnd(&zbuf->stream); | ||||
| 	free(zbuf->data); | ||||
| } | ||||
|  | ||||
| msgpack_zbuffer* msgpack_zbuffer_new(int level, size_t init_size) | ||||
| { | ||||
| 	msgpack_zbuffer* zbuf = (msgpack_zbuffer*)malloc(sizeof(msgpack_zbuffer)); | ||||
| 	if(!msgpack_zbuffer_init(zbuf, level, init_size)) { | ||||
| 		free(zbuf); | ||||
| 		return NULL; | ||||
| 	} | ||||
| 	return zbuf; | ||||
| } | ||||
|  | ||||
| void msgpack_zbuffer_free(msgpack_zbuffer* zbuf) | ||||
| { | ||||
| 	if(zbuf == NULL) { return; } | ||||
| 	msgpack_zbuffer_destroy(zbuf); | ||||
| 	free(zbuf); | ||||
| } | ||||
|  | ||||
| bool msgpack_zbuffer_expand(msgpack_zbuffer* zbuf) | ||||
| { | ||||
| 	size_t used = (char*)zbuf->stream.next_out - zbuf->data; | ||||
| 	size_t csize = used + zbuf->stream.avail_out; | ||||
| 	size_t nsize = (csize == 0) ? zbuf->init_size : csize * 2; | ||||
|  | ||||
| 	char* tmp = (char*)realloc(zbuf->data, nsize); | ||||
| 	if(tmp == NULL) { | ||||
| 		return false; | ||||
| 	} | ||||
|  | ||||
| 	zbuf->data = tmp; | ||||
| 	zbuf->stream.next_out  = (Bytef*)(tmp + used); | ||||
| 	zbuf->stream.avail_out = nsize - used; | ||||
|  | ||||
| 	return true; | ||||
| } | ||||
|  | ||||
| int msgpack_zbuffer_write(void* data, const char* buf, unsigned int len) | ||||
| { | ||||
| 	msgpack_zbuffer* zbuf = (msgpack_zbuffer*)data; | ||||
|  | ||||
| 	zbuf->stream.next_in = (Bytef*)buf; | ||||
| 	zbuf->stream.avail_in = len; | ||||
|  | ||||
| 	do { | ||||
| 		if(zbuf->stream.avail_out < MSGPACK_ZBUFFER_RESERVE_SIZE) { | ||||
| 			if(!msgpack_zbuffer_expand(zbuf)) { | ||||
| 				return -1; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if(deflate(&zbuf->stream, Z_NO_FLUSH) != Z_OK) { | ||||
| 			return -1; | ||||
| 		} | ||||
| 	} while(zbuf->stream.avail_in > 0); | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| char* msgpack_zbuffer_flush(msgpack_zbuffer* zbuf) | ||||
| { | ||||
| 	while(true) { | ||||
| 		switch(deflate(&zbuf->stream, Z_FINISH)) { | ||||
| 		case Z_STREAM_END: | ||||
| 			return zbuf->data; | ||||
| 		case Z_OK: | ||||
| 			if(!msgpack_zbuffer_expand(zbuf)) { | ||||
| 				return NULL; | ||||
| 			} | ||||
| 			break; | ||||
| 		default: | ||||
| 			return NULL; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| const char* msgpack_zbuffer_data(const msgpack_zbuffer* zbuf) | ||||
| { | ||||
| 	return zbuf->data; | ||||
| } | ||||
|  | ||||
| size_t msgpack_zbuffer_size(const msgpack_zbuffer* zbuf) | ||||
| { | ||||
| 	return (char*)zbuf->stream.next_out - zbuf->data; | ||||
| } | ||||
|  | ||||
| void msgpack_zbuffer_reset_buffer(msgpack_zbuffer* zbuf) | ||||
| { | ||||
| 	zbuf->stream.avail_out += (char*)zbuf->stream.next_out - zbuf->data; | ||||
| 	zbuf->stream.next_out = (Bytef*)zbuf->data; | ||||
| } | ||||
|  | ||||
| bool msgpack_zbuffer_reset(msgpack_zbuffer* zbuf) | ||||
| { | ||||
| 	if(deflateReset(&zbuf->stream) != Z_OK) { | ||||
| 		return false; | ||||
| 	} | ||||
| 	msgpack_zbuffer_reset_buffer(zbuf); | ||||
| 	return true; | ||||
| } | ||||
|  | ||||
| char* msgpack_zbuffer_release_buffer(msgpack_zbuffer* zbuf) | ||||
| { | ||||
| 	char* tmp = zbuf->data; | ||||
| 	zbuf->data = NULL; | ||||
| 	zbuf->stream.next_out = NULL; | ||||
| 	zbuf->stream.avail_out = 0; | ||||
| 	return tmp; | ||||
| } | ||||
|  | ||||
| /** @} */ | ||||
|  | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif /* msgpack/zbuffer.h */ | ||||
|  | ||||
| @@ -1,100 +0,0 @@ | ||||
| // | ||||
| // MessagePack for C++ deflate buffer implementation | ||||
| // | ||||
| // Copyright (C) 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_ZBUFFER_HPP__ | ||||
| #define MSGPACK_ZBUFFER_HPP__ | ||||
|  | ||||
| #include "zbuffer.h" | ||||
| #include <stdexcept> | ||||
|  | ||||
| namespace msgpack { | ||||
|  | ||||
|  | ||||
| class zbuffer : public msgpack_zbuffer { | ||||
| public: | ||||
| 	zbuffer(int level = Z_DEFAULT_COMPRESSION, | ||||
| 			size_t init_size = MSGPACK_ZBUFFER_INIT_SIZE) | ||||
| 	{ | ||||
| 		msgpack_zbuffer_init(this, level, init_size); | ||||
| 	} | ||||
|  | ||||
| 	~zbuffer() | ||||
| 	{ | ||||
| 		msgpack_zbuffer_destroy(this); | ||||
| 	} | ||||
|  | ||||
| public: | ||||
| 	void write(const char* buf, unsigned int len) | ||||
| 	{ | ||||
| 		if(msgpack_zbuffer_write(this, buf, len) < 0) { | ||||
| 			throw std::bad_alloc(); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	char* flush() | ||||
| 	{ | ||||
| 		char* buf = msgpack_zbuffer_flush(this); | ||||
| 		if(!buf) { | ||||
| 			throw std::bad_alloc(); | ||||
| 		} | ||||
| 		return buf; | ||||
| 	} | ||||
|  | ||||
| 	char* data() | ||||
| 	{ | ||||
| 		return base::data; | ||||
| 	} | ||||
|  | ||||
| 	const char* data() const | ||||
| 	{ | ||||
| 		return base::data; | ||||
| 	} | ||||
|  | ||||
| 	size_t size() const | ||||
| 	{ | ||||
| 		return msgpack_zbuffer_size(this); | ||||
| 	} | ||||
|  | ||||
| 	void reset() | ||||
| 	{ | ||||
| 		if(!msgpack_zbuffer_reset(this)) { | ||||
| 			throw std::bad_alloc(); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	void reset_buffer() | ||||
| 	{ | ||||
| 		msgpack_zbuffer_reset_buffer(this); | ||||
| 	} | ||||
|  | ||||
| 	char* release_buffer() | ||||
| 	{ | ||||
| 		return msgpack_zbuffer_release_buffer(this); | ||||
| 	} | ||||
|  | ||||
| private: | ||||
| 	typedef msgpack_zbuffer base; | ||||
|  | ||||
| private: | ||||
| 	zbuffer(const zbuffer&); | ||||
| }; | ||||
|  | ||||
|  | ||||
| }  // namespace msgpack | ||||
|  | ||||
| #endif /* msgpack/zbuffer.hpp */ | ||||
|  | ||||
| @@ -1,138 +0,0 @@ | ||||
| /* | ||||
|  * MessagePack for C memory pool 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_ZONE_H__ | ||||
| #define MSGPACK_ZONE_H__ | ||||
|  | ||||
| #include "sysdep.h" | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * @defgroup msgpack_zone Memory zone | ||||
|  * @ingroup msgpack | ||||
|  * @{ | ||||
|  */ | ||||
|  | ||||
| typedef struct msgpack_zone_finalizer { | ||||
| 	void (*func)(void* data); | ||||
| 	void* data; | ||||
| } msgpack_zone_finalizer; | ||||
|  | ||||
| typedef struct msgpack_zone_finalizer_array { | ||||
| 	msgpack_zone_finalizer* tail; | ||||
| 	msgpack_zone_finalizer* end; | ||||
| 	msgpack_zone_finalizer* array; | ||||
| } msgpack_zone_finalizer_array; | ||||
|  | ||||
| struct msgpack_zone_chunk; | ||||
| typedef struct msgpack_zone_chunk msgpack_zone_chunk; | ||||
|  | ||||
| typedef struct msgpack_zone_chunk_list { | ||||
| 	size_t free; | ||||
| 	char* ptr; | ||||
| 	msgpack_zone_chunk* head; | ||||
| } msgpack_zone_chunk_list; | ||||
|  | ||||
| typedef struct msgpack_zone { | ||||
| 	msgpack_zone_chunk_list chunk_list; | ||||
| 	msgpack_zone_finalizer_array finalizer_array; | ||||
| 	size_t chunk_size; | ||||
| } msgpack_zone; | ||||
|  | ||||
| #ifndef MSGPACK_ZONE_CHUNK_SIZE | ||||
| #define MSGPACK_ZONE_CHUNK_SIZE 8192 | ||||
| #endif | ||||
|  | ||||
| bool msgpack_zone_init(msgpack_zone* zone, size_t chunk_size); | ||||
| void msgpack_zone_destroy(msgpack_zone* zone); | ||||
|  | ||||
| msgpack_zone* msgpack_zone_new(size_t chunk_size); | ||||
| void msgpack_zone_free(msgpack_zone* zone); | ||||
|  | ||||
| static inline void* msgpack_zone_malloc(msgpack_zone* zone, size_t size); | ||||
| static inline void* msgpack_zone_malloc_no_align(msgpack_zone* zone, size_t size); | ||||
|  | ||||
| static inline bool msgpack_zone_push_finalizer(msgpack_zone* zone, | ||||
| 		void (*func)(void* data), void* data); | ||||
|  | ||||
| bool msgpack_zone_is_empty(msgpack_zone* zone); | ||||
|  | ||||
| void msgpack_zone_clear(msgpack_zone* zone); | ||||
|  | ||||
| /** @} */ | ||||
|  | ||||
|  | ||||
| #ifndef MSGPACK_ZONE_ALIGN | ||||
| #define MSGPACK_ZONE_ALIGN sizeof(int) | ||||
| #endif | ||||
|  | ||||
| void* msgpack_zone_malloc_expand(msgpack_zone* zone, size_t size); | ||||
|  | ||||
| void* msgpack_zone_malloc_no_align(msgpack_zone* zone, size_t size) | ||||
| { | ||||
| 	msgpack_zone_chunk_list* cl = &zone->chunk_list; | ||||
|  | ||||
| 	if(zone->chunk_list.free < size) { | ||||
| 		return msgpack_zone_malloc_expand(zone, size); | ||||
| 	} | ||||
|  | ||||
| 	char* ptr = cl->ptr; | ||||
| 	cl->free -= size; | ||||
| 	cl->ptr  += size; | ||||
|  | ||||
| 	return ptr; | ||||
| } | ||||
|  | ||||
| void* msgpack_zone_malloc(msgpack_zone* zone, size_t size) | ||||
| { | ||||
| 	return msgpack_zone_malloc_no_align(zone, | ||||
| 			((size)+((MSGPACK_ZONE_ALIGN)-1)) & ~((MSGPACK_ZONE_ALIGN)-1)); | ||||
| } | ||||
|  | ||||
|  | ||||
| bool msgpack_zone_push_finalizer_expand(msgpack_zone* zone, | ||||
| 		void (*func)(void* data), void* data); | ||||
|  | ||||
| bool msgpack_zone_push_finalizer(msgpack_zone* zone, | ||||
| 		void (*func)(void* data), void* data) | ||||
| { | ||||
| 	msgpack_zone_finalizer_array* const fa = &zone->finalizer_array; | ||||
| 	msgpack_zone_finalizer* fin = fa->tail; | ||||
|  | ||||
| 	if(fin == fa->end) { | ||||
| 		return msgpack_zone_push_finalizer_expand(zone, func, data); | ||||
| 	} | ||||
|  | ||||
| 	fin->func = func; | ||||
| 	fin->data = data; | ||||
|  | ||||
| 	++fa->tail; | ||||
|  | ||||
| 	return true; | ||||
| } | ||||
|  | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif /* msgpack/zone.h */ | ||||
|  | ||||
| @@ -1,148 +0,0 @@ | ||||
| // | ||||
| // MessagePack for C++ memory pool | ||||
| // | ||||
| // 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_ZONE_HPP__ | ||||
| #define MSGPACK_ZONE_HPP__ | ||||
|  | ||||
| #include "zone.h" | ||||
| #include <cstdlib> | ||||
| #include <memory> | ||||
| #include <vector> | ||||
|  | ||||
| <% GENERATION_LIMIT = 15 %> | ||||
| namespace msgpack { | ||||
|  | ||||
|  | ||||
| class zone : public msgpack_zone { | ||||
| public: | ||||
| 	zone(size_t chunk_size = MSGPACK_ZONE_CHUNK_SIZE); | ||||
| 	~zone(); | ||||
|  | ||||
| public: | ||||
| 	void* malloc(size_t size); | ||||
| 	void* malloc_no_align(size_t size); | ||||
|  | ||||
| 	void push_finalizer(void (*func)(void*), void* data); | ||||
|  | ||||
| 	template <typename T> | ||||
| 	void push_finalizer(std::auto_ptr<T> obj); | ||||
|  | ||||
| 	void clear(); | ||||
|  | ||||
| 	<%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(', ')%>); | ||||
| 	<%}%> | ||||
|  | ||||
| private: | ||||
| 	void undo_malloc(size_t size); | ||||
|  | ||||
| 	template <typename T> | ||||
| 	static void object_destructor(void* obj); | ||||
|  | ||||
| 	typedef msgpack_zone base; | ||||
|  | ||||
| private: | ||||
| 	zone(const zone&); | ||||
| }; | ||||
|  | ||||
|  | ||||
|  | ||||
| inline zone::zone(size_t chunk_size) | ||||
| { | ||||
| 	msgpack_zone_init(this, chunk_size); | ||||
| } | ||||
|  | ||||
| inline zone::~zone() | ||||
| { | ||||
| 	msgpack_zone_destroy(this); | ||||
| } | ||||
|  | ||||
| inline void* zone::malloc(size_t size) | ||||
| { | ||||
| 	void* ptr = msgpack_zone_malloc(this, size); | ||||
| 	if(!ptr) { | ||||
| 		throw std::bad_alloc(); | ||||
| 	} | ||||
| 	return ptr; | ||||
| } | ||||
|  | ||||
| inline void* zone::malloc_no_align(size_t size) | ||||
| { | ||||
| 	void* ptr = msgpack_zone_malloc_no_align(this, size); | ||||
| 	if(!ptr) { | ||||
| 		throw std::bad_alloc(); | ||||
| 	} | ||||
| 	return ptr; | ||||
| } | ||||
|  | ||||
| inline void zone::push_finalizer(void (*func)(void*), void* data) | ||||
| { | ||||
| 	if(!msgpack_zone_push_finalizer(this, func, data)) { | ||||
| 		throw std::bad_alloc(); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| template <typename T> | ||||
| inline void zone::push_finalizer(std::auto_ptr<T> obj) | ||||
| { | ||||
| 	if(!msgpack_zone_push_finalizer(this, &zone::object_destructor<T>, obj.get())) { | ||||
| 		throw std::bad_alloc(); | ||||
| 	} | ||||
| 	obj.release(); | ||||
| } | ||||
|  | ||||
| inline void zone::clear() | ||||
| { | ||||
| 	msgpack_zone_clear(this); | ||||
| } | ||||
|  | ||||
| template <typename T> | ||||
| void zone::object_destructor(void* obj) | ||||
| { | ||||
| 	reinterpret_cast<T*>(obj)->~T(); | ||||
| } | ||||
|  | ||||
| inline void zone::undo_malloc(size_t size) | ||||
| { | ||||
| 	base::chunk_list.ptr  -= size; | ||||
| 	base::chunk_list.free += size; | ||||
| } | ||||
|  | ||||
| <%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 = malloc(sizeof(T)); | ||||
| 	if(!msgpack_zone_push_finalizer(this, &zone::object_destructor<T>, x)) { | ||||
| 		undo_malloc(sizeof(T)); | ||||
| 		throw std::bad_alloc(); | ||||
| 	} | ||||
| 	try { | ||||
| 		return new (x) T(<%=(1..i).map{|j|"a#{j}"}.join(', ')%>); | ||||
| 	} catch (...) { | ||||
| 		--base::finalizer_array.tail; | ||||
| 		undo_malloc(sizeof(T)); | ||||
| 		throw; | ||||
| 	} | ||||
| } | ||||
| <%}%> | ||||
|  | ||||
| }  // namespace msgpack | ||||
|  | ||||
| #endif /* msgpack/zone.hpp */ | ||||
|  | ||||
| @@ -1,87 +0,0 @@ | ||||
| // | ||||
| // MessagePack for C++ dynamic typed objects | ||||
| // | ||||
| // 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" | ||||
|  | ||||
| namespace msgpack { | ||||
|  | ||||
|  | ||||
| std::ostream& operator<< (std::ostream& s, const object o) | ||||
| { | ||||
| 	switch(o.type) { | ||||
| 	case type::NIL: | ||||
| 		s << "nil"; | ||||
| 		break; | ||||
|  | ||||
| 	case type::BOOLEAN: | ||||
| 		s << (o.via.boolean ? "true" : "false"); | ||||
| 		break; | ||||
|  | ||||
| 	case type::POSITIVE_INTEGER: | ||||
| 		s << o.via.u64; | ||||
| 		break; | ||||
|  | ||||
| 	case type::NEGATIVE_INTEGER: | ||||
| 		s << o.via.i64; | ||||
| 		break; | ||||
|  | ||||
| 	case type::DOUBLE: | ||||
| 		s << o.via.dec; | ||||
| 		break; | ||||
|  | ||||
| 	case type::RAW: | ||||
| 		(s << '"').write(o.via.raw.ptr, o.via.raw.size) << '"'; | ||||
| 		break; | ||||
|  | ||||
| 	case type::ARRAY: | ||||
| 		s << "["; | ||||
| 		if(o.via.array.size != 0) { | ||||
| 			object* p(o.via.array.ptr); | ||||
| 			s << *p; | ||||
| 			++p; | ||||
| 			for(object* const pend(o.via.array.ptr + o.via.array.size); | ||||
| 					p < pend; ++p) { | ||||
| 				s << ", " << *p; | ||||
| 			} | ||||
| 		} | ||||
| 		s << "]"; | ||||
| 		break; | ||||
|  | ||||
| 	case type::MAP: | ||||
| 		s << "{"; | ||||
| 		if(o.via.map.size != 0) { | ||||
| 			object_kv* p(o.via.map.ptr); | ||||
| 			s << p->key << "=>" << p->val; | ||||
| 			++p; | ||||
| 			for(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 " << (uint16_t)o.type << ">"; | ||||
| 	} | ||||
| 	return s; | ||||
| } | ||||
|  | ||||
|  | ||||
| }  // namespace msgpack | ||||
|  | ||||
| @@ -1,237 +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. | ||||
|  */ | ||||
| #include "msgpack/object.h" | ||||
| #include "msgpack/pack.h" | ||||
| #include <stdio.h> | ||||
| #include <string.h> | ||||
|  | ||||
| #ifndef _MSC_VER | ||||
| #include <inttypes.h> | ||||
| #else | ||||
| #ifndef PRIu64 | ||||
| #define PRIu64 "I64u" | ||||
| #endif | ||||
| #ifndef PRIi64 | ||||
| #define PRIi64 "I64d" | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
|  | ||||
| int msgpack_pack_object(msgpack_packer* pk, msgpack_object d) | ||||
| { | ||||
| 	switch(d.type) { | ||||
| 	case MSGPACK_OBJECT_NIL: | ||||
| 		return msgpack_pack_nil(pk); | ||||
|  | ||||
| 	case MSGPACK_OBJECT_BOOLEAN: | ||||
| 		if(d.via.boolean) { | ||||
| 			return msgpack_pack_true(pk); | ||||
| 		} else { | ||||
| 			return msgpack_pack_false(pk); | ||||
| 		} | ||||
|  | ||||
| 	case MSGPACK_OBJECT_POSITIVE_INTEGER: | ||||
| 		return msgpack_pack_uint64(pk, d.via.u64); | ||||
|  | ||||
| 	case MSGPACK_OBJECT_NEGATIVE_INTEGER: | ||||
| 		return msgpack_pack_int64(pk, d.via.i64); | ||||
|  | ||||
| 	case MSGPACK_OBJECT_DOUBLE: | ||||
| 		return msgpack_pack_double(pk, d.via.dec); | ||||
|  | ||||
| 	case MSGPACK_OBJECT_RAW: | ||||
| 		{ | ||||
| 			int ret = msgpack_pack_raw(pk, d.via.raw.size); | ||||
| 			if(ret < 0) { return ret; } | ||||
| 			return msgpack_pack_raw_body(pk, d.via.raw.ptr, d.via.raw.size); | ||||
| 		} | ||||
|  | ||||
| 	case MSGPACK_OBJECT_ARRAY: | ||||
| 		{ | ||||
| 			int ret = msgpack_pack_array(pk, d.via.array.size); | ||||
| 			if(ret < 0) { return ret; } | ||||
|  | ||||
| 			msgpack_object* o = d.via.array.ptr; | ||||
| 			msgpack_object* const oend = d.via.array.ptr + d.via.array.size; | ||||
| 			for(; o != oend; ++o) { | ||||
| 				ret = msgpack_pack_object(pk, *o); | ||||
| 				if(ret < 0) { return ret; } | ||||
| 			} | ||||
|  | ||||
| 			return 0; | ||||
| 		} | ||||
|  | ||||
| 	case MSGPACK_OBJECT_MAP: | ||||
| 		{ | ||||
| 			int ret = msgpack_pack_map(pk, d.via.map.size); | ||||
| 			if(ret < 0) { return ret; } | ||||
|  | ||||
| 			msgpack_object_kv* kv = d.via.map.ptr; | ||||
| 			msgpack_object_kv* const kvend = d.via.map.ptr + d.via.map.size; | ||||
| 			for(; kv != kvend; ++kv) { | ||||
| 				ret = msgpack_pack_object(pk, kv->key); | ||||
| 				if(ret < 0) { return ret; } | ||||
| 				ret = msgpack_pack_object(pk, kv->val); | ||||
| 				if(ret < 0) { return ret; } | ||||
| 			} | ||||
|  | ||||
| 			return 0; | ||||
| 		} | ||||
|  | ||||
| 	default: | ||||
| 		return -1; | ||||
| 	} | ||||
| } | ||||
|  | ||||
|  | ||||
| void msgpack_object_print(FILE* out, msgpack_object o) | ||||
| { | ||||
| 	switch(o.type) { | ||||
| 	case MSGPACK_OBJECT_NIL: | ||||
| 		fprintf(out, "nil"); | ||||
| 		break; | ||||
|  | ||||
| 	case MSGPACK_OBJECT_BOOLEAN: | ||||
| 		fprintf(out, (o.via.boolean ? "true" : "false")); | ||||
| 		break; | ||||
|  | ||||
| 	case MSGPACK_OBJECT_POSITIVE_INTEGER: | ||||
| 		fprintf(out, "%"PRIu64, o.via.u64); | ||||
| 		break; | ||||
|  | ||||
| 	case MSGPACK_OBJECT_NEGATIVE_INTEGER: | ||||
| 		fprintf(out, "%"PRIi64, o.via.i64); | ||||
| 		break; | ||||
|  | ||||
| 	case MSGPACK_OBJECT_DOUBLE: | ||||
| 		fprintf(out, "%f", o.via.dec); | ||||
| 		break; | ||||
|  | ||||
| 	case MSGPACK_OBJECT_RAW: | ||||
| 		fprintf(out, "\""); | ||||
| 		fwrite(o.via.raw.ptr, o.via.raw.size, 1, out); | ||||
| 		fprintf(out, "\""); | ||||
| 		break; | ||||
|  | ||||
| 	case MSGPACK_OBJECT_ARRAY: | ||||
| 		fprintf(out, "["); | ||||
| 		if(o.via.array.size != 0) { | ||||
| 			msgpack_object* p = o.via.array.ptr; | ||||
| 			msgpack_object_print(out, *p); | ||||
| 			++p; | ||||
| 			msgpack_object* const pend = o.via.array.ptr + o.via.array.size; | ||||
| 			for(; p < pend; ++p) { | ||||
| 				fprintf(out, ", "); | ||||
| 				msgpack_object_print(out, *p); | ||||
| 			} | ||||
| 		} | ||||
| 		fprintf(out, "]"); | ||||
| 		break; | ||||
|  | ||||
| 	case MSGPACK_OBJECT_MAP: | ||||
| 		fprintf(out, "{"); | ||||
| 		if(o.via.map.size != 0) { | ||||
| 			msgpack_object_kv* p = o.via.map.ptr; | ||||
| 			msgpack_object_print(out, p->key); | ||||
| 			fprintf(out, "=>"); | ||||
| 			msgpack_object_print(out, p->val); | ||||
| 			++p; | ||||
| 			msgpack_object_kv* const pend = o.via.map.ptr + o.via.map.size; | ||||
| 			for(; p < pend; ++p) { | ||||
| 				fprintf(out, ", "); | ||||
| 				msgpack_object_print(out, p->key); | ||||
| 				fprintf(out, "=>"); | ||||
| 				msgpack_object_print(out, p->val); | ||||
| 			} | ||||
| 		} | ||||
| 		fprintf(out, "}"); | ||||
| 		break; | ||||
|  | ||||
| 	default: | ||||
| 		// FIXME | ||||
| 		fprintf(out, "#<UNKNOWN %hu %"PRIu64">", o.type, o.via.u64); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| bool msgpack_object_equal(const msgpack_object x, const msgpack_object y) | ||||
| { | ||||
| 	if(x.type != y.type) { return false; } | ||||
|  | ||||
| 	switch(x.type) { | ||||
| 	case MSGPACK_OBJECT_NIL: | ||||
| 		return true; | ||||
|  | ||||
| 	case MSGPACK_OBJECT_BOOLEAN: | ||||
| 		return x.via.boolean == y.via.boolean; | ||||
|  | ||||
| 	case MSGPACK_OBJECT_POSITIVE_INTEGER: | ||||
| 		return x.via.u64 == y.via.u64; | ||||
|  | ||||
| 	case MSGPACK_OBJECT_NEGATIVE_INTEGER: | ||||
| 		return x.via.i64 == y.via.i64; | ||||
|  | ||||
| 	case MSGPACK_OBJECT_DOUBLE: | ||||
| 		return x.via.dec == y.via.dec; | ||||
|  | ||||
| 	case MSGPACK_OBJECT_RAW: | ||||
| 		return x.via.raw.size == y.via.raw.size && | ||||
| 			memcmp(x.via.raw.ptr, y.via.raw.ptr, x.via.raw.size) == 0; | ||||
|  | ||||
| 	case MSGPACK_OBJECT_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(!msgpack_object_equal(*px, *py)) { | ||||
| 					return false; | ||||
| 				} | ||||
| 				++px; | ||||
| 				++py; | ||||
| 			} while(px < pxend); | ||||
| 			return true; | ||||
| 		} | ||||
|  | ||||
| 	case MSGPACK_OBJECT_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(!msgpack_object_equal(px->key, py->key) || !msgpack_object_equal(px->val, py->val)) { | ||||
| 					return false; | ||||
| 				} | ||||
| 				++px; | ||||
| 				++py; | ||||
| 			} while(px < pxend); | ||||
| 			return true; | ||||
| 		} | ||||
|  | ||||
| 	default: | ||||
| 		return false; | ||||
| 	} | ||||
| } | ||||
|  | ||||
							
								
								
									
										459
									
								
								cpp/src/unpack.c
									
									
									
									
									
								
							
							
						
						
									
										459
									
								
								cpp/src/unpack.c
									
									
									
									
									
								
							| @@ -1,459 +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. | ||||
|  */ | ||||
| #include "msgpack/unpack.h" | ||||
| #include "msgpack/unpack_define.h" | ||||
| #include <stdlib.h> | ||||
|  | ||||
|  | ||||
| typedef struct { | ||||
| 	msgpack_zone* z; | ||||
| 	bool referenced; | ||||
| } unpack_user; | ||||
|  | ||||
|  | ||||
| #define msgpack_unpack_struct(name) \ | ||||
| 	struct template ## name | ||||
|  | ||||
| #define msgpack_unpack_func(ret, name) \ | ||||
| 	ret template ## name | ||||
|  | ||||
| #define msgpack_unpack_callback(name) \ | ||||
| 	template_callback ## name | ||||
|  | ||||
| #define msgpack_unpack_object msgpack_object | ||||
|  | ||||
| #define msgpack_unpack_user unpack_user | ||||
|  | ||||
|  | ||||
| struct template_context; | ||||
| typedef struct template_context template_context; | ||||
|  | ||||
| static void template_init(template_context* ctx); | ||||
|  | ||||
| static msgpack_object template_data(template_context* ctx); | ||||
|  | ||||
| static int template_execute(template_context* ctx, | ||||
| 		const char* data, size_t len, size_t* off); | ||||
|  | ||||
|  | ||||
| static inline msgpack_object template_callback_root(unpack_user* u) | ||||
| { msgpack_object o = {}; return o; } | ||||
|  | ||||
| static inline int template_callback_uint8(unpack_user* u, uint8_t d, msgpack_object* o) | ||||
| { o->type = MSGPACK_OBJECT_POSITIVE_INTEGER; o->via.u64 = d; return 0; } | ||||
|  | ||||
| static inline int template_callback_uint16(unpack_user* u, uint16_t d, msgpack_object* o) | ||||
| { o->type = MSGPACK_OBJECT_POSITIVE_INTEGER; o->via.u64 = d; return 0; } | ||||
|  | ||||
| static inline int template_callback_uint32(unpack_user* u, uint32_t d, msgpack_object* o) | ||||
| { o->type = MSGPACK_OBJECT_POSITIVE_INTEGER; o->via.u64 = d; return 0; } | ||||
|  | ||||
| static inline int template_callback_uint64(unpack_user* u, uint64_t d, msgpack_object* o) | ||||
| { o->type = MSGPACK_OBJECT_POSITIVE_INTEGER; o->via.u64 = d; return 0; } | ||||
|  | ||||
| static inline int template_callback_int8(unpack_user* u, int8_t d, msgpack_object* o) | ||||
| { if(d >= 0) { o->type = MSGPACK_OBJECT_POSITIVE_INTEGER; o->via.u64 = d; return 0; } | ||||
| 		else { o->type = MSGPACK_OBJECT_NEGATIVE_INTEGER; o->via.i64 = d; return 0; } } | ||||
|  | ||||
| static inline int template_callback_int16(unpack_user* u, int16_t d, msgpack_object* o) | ||||
| { if(d >= 0) { o->type = MSGPACK_OBJECT_POSITIVE_INTEGER; o->via.u64 = d; return 0; } | ||||
| 		else { o->type = MSGPACK_OBJECT_NEGATIVE_INTEGER; o->via.i64 = d; return 0; } } | ||||
|  | ||||
| static inline int template_callback_int32(unpack_user* u, int32_t d, msgpack_object* o) | ||||
| { if(d >= 0) { o->type = MSGPACK_OBJECT_POSITIVE_INTEGER; o->via.u64 = d; return 0; } | ||||
| 		else { o->type = MSGPACK_OBJECT_NEGATIVE_INTEGER; o->via.i64 = d; return 0; } } | ||||
|  | ||||
| static inline int template_callback_int64(unpack_user* u, int64_t d, msgpack_object* o) | ||||
| { if(d >= 0) { o->type = MSGPACK_OBJECT_POSITIVE_INTEGER; o->via.u64 = d; return 0; } | ||||
| 		else { o->type = MSGPACK_OBJECT_NEGATIVE_INTEGER; o->via.i64 = d; return 0; } } | ||||
|  | ||||
| static inline int template_callback_float(unpack_user* u, float d, msgpack_object* o) | ||||
| { o->type = MSGPACK_OBJECT_DOUBLE; o->via.dec = d; return 0; } | ||||
|  | ||||
| static inline int template_callback_double(unpack_user* u, double d, msgpack_object* o) | ||||
| { o->type = MSGPACK_OBJECT_DOUBLE; o->via.dec = d; return 0; } | ||||
|  | ||||
| static inline int template_callback_nil(unpack_user* u, msgpack_object* o) | ||||
| { o->type = MSGPACK_OBJECT_NIL; return 0; } | ||||
|  | ||||
| static inline int template_callback_true(unpack_user* u, msgpack_object* o) | ||||
| { o->type = MSGPACK_OBJECT_BOOLEAN; o->via.boolean = true; return 0; } | ||||
|  | ||||
| static inline int template_callback_false(unpack_user* u, msgpack_object* o) | ||||
| { o->type = MSGPACK_OBJECT_BOOLEAN; o->via.boolean = false; return 0; } | ||||
|  | ||||
| static inline int template_callback_array(unpack_user* u, unsigned int n, msgpack_object* o) | ||||
| { | ||||
| 	o->type = MSGPACK_OBJECT_ARRAY; | ||||
| 	o->via.array.size = 0; | ||||
| 	o->via.array.ptr = (msgpack_object*)msgpack_zone_malloc(u->z, n*sizeof(msgpack_object)); | ||||
| 	if(o->via.array.ptr == NULL) { return -1; } | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| static inline int template_callback_array_item(unpack_user* u, msgpack_object* c, msgpack_object o) | ||||
| { c->via.array.ptr[c->via.array.size++] = o; return 0; } | ||||
|  | ||||
| static inline int template_callback_map(unpack_user* u, unsigned int n, msgpack_object* o) | ||||
| { | ||||
| 	o->type = MSGPACK_OBJECT_MAP; | ||||
| 	o->via.map.size = 0; | ||||
| 	o->via.map.ptr = (msgpack_object_kv*)msgpack_zone_malloc(u->z, n*sizeof(msgpack_object_kv)); | ||||
| 	if(o->via.map.ptr == NULL) { return -1; } | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| static inline int template_callback_map_item(unpack_user* u, msgpack_object* c, msgpack_object k, msgpack_object v) | ||||
| { | ||||
| 	c->via.map.ptr[c->via.map.size].key = k; | ||||
| 	c->via.map.ptr[c->via.map.size].val = v; | ||||
| 	++c->via.map.size; | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| static inline int template_callback_raw(unpack_user* u, const char* b, const char* p, unsigned int l, msgpack_object* o) | ||||
| { | ||||
| 	o->type = MSGPACK_OBJECT_RAW; | ||||
| 	o->via.raw.ptr = p; | ||||
| 	o->via.raw.size = l; | ||||
| 	u->referenced = true; | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| #include "msgpack/unpack_template.h" | ||||
|  | ||||
|  | ||||
| #define CTX_CAST(m) ((template_context*)(m)) | ||||
| #define CTX_REFERENCED(mpac) CTX_CAST((mpac)->ctx)->user.referenced | ||||
|  | ||||
| #define COUNTER_SIZE (sizeof(_msgpack_atomic_counter_t)) | ||||
|  | ||||
|  | ||||
| static inline void init_count(void* buffer) | ||||
| { | ||||
| 	*(volatile _msgpack_atomic_counter_t*)buffer = 1; | ||||
| } | ||||
|  | ||||
| static inline void decl_count(void* buffer) | ||||
| { | ||||
| 	// atomic if(--*(_msgpack_atomic_counter_t*)buffer == 0) { free(buffer); } | ||||
| 	if(_msgpack_sync_decr_and_fetch((volatile _msgpack_atomic_counter_t*)buffer) == 0) { | ||||
| 		free(buffer); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| static inline void incr_count(void* buffer) | ||||
| { | ||||
| 	// atomic ++*(_msgpack_atomic_counter_t*)buffer; | ||||
| 	_msgpack_sync_incr_and_fetch((volatile _msgpack_atomic_counter_t*)buffer); | ||||
| } | ||||
|  | ||||
| static inline _msgpack_atomic_counter_t get_count(void* buffer) | ||||
| { | ||||
| 	return *(volatile _msgpack_atomic_counter_t*)buffer; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| bool msgpack_unpacker_init(msgpack_unpacker* mpac, size_t initial_buffer_size) | ||||
| { | ||||
| 	if(initial_buffer_size < COUNTER_SIZE) { | ||||
| 		initial_buffer_size = COUNTER_SIZE; | ||||
| 	} | ||||
|  | ||||
| 	char* buffer = (char*)malloc(initial_buffer_size); | ||||
| 	if(buffer == NULL) { | ||||
| 		return false; | ||||
| 	} | ||||
|  | ||||
| 	void* ctx = malloc(sizeof(template_context)); | ||||
| 	if(ctx == NULL) { | ||||
| 		free(buffer); | ||||
| 		return false; | ||||
| 	} | ||||
|  | ||||
| 	msgpack_zone* z = msgpack_zone_new(MSGPACK_ZONE_CHUNK_SIZE); | ||||
| 	if(z == NULL) { | ||||
| 		free(ctx); | ||||
| 		free(buffer); | ||||
| 		return false; | ||||
| 	} | ||||
|  | ||||
| 	mpac->buffer = buffer; | ||||
| 	mpac->used = COUNTER_SIZE; | ||||
| 	mpac->free = initial_buffer_size - mpac->used; | ||||
| 	mpac->off = COUNTER_SIZE; | ||||
| 	mpac->parsed = 0; | ||||
| 	mpac->initial_buffer_size = initial_buffer_size; | ||||
| 	mpac->z = z; | ||||
| 	mpac->ctx = ctx; | ||||
|  | ||||
| 	init_count(mpac->buffer); | ||||
|  | ||||
| 	template_init(CTX_CAST(mpac->ctx)); | ||||
| 	CTX_CAST(mpac->ctx)->user.z = mpac->z; | ||||
| 	CTX_CAST(mpac->ctx)->user.referenced = false; | ||||
|  | ||||
| 	return true; | ||||
| } | ||||
|  | ||||
| void msgpack_unpacker_destroy(msgpack_unpacker* mpac) | ||||
| { | ||||
| 	msgpack_zone_free(mpac->z); | ||||
| 	free(mpac->ctx); | ||||
| 	decl_count(mpac->buffer); | ||||
| } | ||||
|  | ||||
|  | ||||
| msgpack_unpacker* msgpack_unpacker_new(size_t initial_buffer_size) | ||||
| { | ||||
| 	msgpack_unpacker* mpac = (msgpack_unpacker*)malloc(sizeof(msgpack_unpacker)); | ||||
| 	if(mpac == NULL) { | ||||
| 		return NULL; | ||||
| 	} | ||||
|  | ||||
| 	if(!msgpack_unpacker_init(mpac, initial_buffer_size)) { | ||||
| 		free(mpac); | ||||
| 		return NULL; | ||||
| 	} | ||||
|  | ||||
| 	return mpac; | ||||
| } | ||||
|  | ||||
| void msgpack_unpacker_free(msgpack_unpacker* mpac) | ||||
| { | ||||
| 	msgpack_unpacker_destroy(mpac); | ||||
| 	free(mpac); | ||||
| } | ||||
|  | ||||
| bool msgpack_unpacker_expand_buffer(msgpack_unpacker* mpac, size_t size) | ||||
| { | ||||
| 	if(mpac->used == mpac->off && get_count(mpac->buffer) == 1 | ||||
| 			&& !CTX_REFERENCED(mpac)) { | ||||
| 		// rewind buffer | ||||
| 		mpac->free += mpac->used - COUNTER_SIZE; | ||||
| 		mpac->used = COUNTER_SIZE; | ||||
| 		mpac->off = COUNTER_SIZE; | ||||
|  | ||||
| 		if(mpac->free >= size) { | ||||
| 			return true; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if(mpac->off == COUNTER_SIZE) { | ||||
| 		size_t next_size = (mpac->used + mpac->free) * 2;  // include COUNTER_SIZE | ||||
| 		while(next_size < size + mpac->used) { | ||||
| 			next_size *= 2; | ||||
| 		} | ||||
|  | ||||
| 		char* tmp = (char*)realloc(mpac->buffer, next_size); | ||||
| 		if(tmp == NULL) { | ||||
| 			return false; | ||||
| 		} | ||||
|  | ||||
| 		mpac->buffer = tmp; | ||||
| 		mpac->free = next_size - mpac->used; | ||||
|  | ||||
| 	} else { | ||||
| 		size_t next_size = mpac->initial_buffer_size;  // include COUNTER_SIZE | ||||
| 		size_t not_parsed = mpac->used - mpac->off; | ||||
| 		while(next_size < size + not_parsed + COUNTER_SIZE) { | ||||
| 			next_size *= 2; | ||||
| 		} | ||||
|  | ||||
| 		char* tmp = (char*)malloc(next_size); | ||||
| 		if(tmp == NULL) { | ||||
| 			return false; | ||||
| 		} | ||||
|  | ||||
| 		init_count(tmp); | ||||
|  | ||||
| 		memcpy(tmp+COUNTER_SIZE, mpac->buffer+mpac->off, not_parsed); | ||||
|  | ||||
| 		if(CTX_REFERENCED(mpac)) { | ||||
| 			if(!msgpack_zone_push_finalizer(mpac->z, decl_count, mpac->buffer)) { | ||||
| 				free(tmp); | ||||
| 				return false; | ||||
| 			} | ||||
| 			CTX_REFERENCED(mpac) = false; | ||||
| 		} else { | ||||
| 			decl_count(mpac->buffer); | ||||
| 		} | ||||
|  | ||||
| 		mpac->buffer = tmp; | ||||
| 		mpac->used = not_parsed + COUNTER_SIZE; | ||||
| 		mpac->free = next_size - mpac->used; | ||||
| 		mpac->off = COUNTER_SIZE; | ||||
| 	} | ||||
|  | ||||
| 	return true; | ||||
| } | ||||
|  | ||||
| int msgpack_unpacker_execute(msgpack_unpacker* mpac) | ||||
| { | ||||
| 	size_t off = mpac->off; | ||||
| 	int ret = template_execute(CTX_CAST(mpac->ctx), | ||||
| 			mpac->buffer, mpac->used, &mpac->off); | ||||
| 	if(mpac->off > off) { | ||||
| 		mpac->parsed += mpac->off - off; | ||||
| 	} | ||||
| 	return ret; | ||||
| } | ||||
|  | ||||
| msgpack_object msgpack_unpacker_data(msgpack_unpacker* mpac) | ||||
| { | ||||
| 	return template_data(CTX_CAST(mpac->ctx)); | ||||
| } | ||||
|  | ||||
| msgpack_zone* msgpack_unpacker_release_zone(msgpack_unpacker* mpac) | ||||
| { | ||||
| 	if(!msgpack_unpacker_flush_zone(mpac)) { | ||||
| 		return NULL; | ||||
| 	} | ||||
|  | ||||
| 	msgpack_zone* r = msgpack_zone_new(MSGPACK_ZONE_CHUNK_SIZE); | ||||
| 	if(r == NULL) { | ||||
| 		return NULL; | ||||
| 	} | ||||
|  | ||||
| 	msgpack_zone* old = mpac->z; | ||||
| 	mpac->z = r; | ||||
|  | ||||
| 	return old; | ||||
| } | ||||
|  | ||||
| void msgpack_unpacker_reset_zone(msgpack_unpacker* mpac) | ||||
| { | ||||
| 	msgpack_zone_clear(mpac->z); | ||||
| } | ||||
|  | ||||
| bool msgpack_unpacker_flush_zone(msgpack_unpacker* mpac) | ||||
| { | ||||
| 	if(CTX_REFERENCED(mpac)) { | ||||
| 		if(!msgpack_zone_push_finalizer(mpac->z, decl_count, mpac->buffer)) { | ||||
| 			return false; | ||||
| 		} | ||||
| 		CTX_REFERENCED(mpac) = false; | ||||
|  | ||||
| 		incr_count(mpac->buffer); | ||||
| 	} | ||||
|  | ||||
| 	return true; | ||||
| } | ||||
|  | ||||
| void msgpack_unpacker_reset(msgpack_unpacker* mpac) | ||||
| { | ||||
| 	template_init(CTX_CAST(mpac->ctx)); | ||||
| 	// don't reset referenced flag | ||||
| 	mpac->parsed = 0; | ||||
| } | ||||
|  | ||||
| bool msgpack_unpacker_next(msgpack_unpacker* mpac, msgpack_unpacked* result) | ||||
| { | ||||
| 	if(result->zone != NULL) { | ||||
| 		msgpack_zone_free(result->zone); | ||||
| 	} | ||||
|  | ||||
| 	int ret = msgpack_unpacker_execute(mpac); | ||||
|  | ||||
| 	if(ret <= 0) { | ||||
| 		result->zone = NULL; | ||||
| 		memset(&result->data, 0, sizeof(msgpack_object)); | ||||
| 		return false; | ||||
| 	} | ||||
|  | ||||
| 	result->zone = msgpack_unpacker_release_zone(mpac); | ||||
| 	result->data = msgpack_unpacker_data(mpac); | ||||
| 	msgpack_unpacker_reset(mpac); | ||||
|  | ||||
| 	return true; | ||||
| } | ||||
|  | ||||
|  | ||||
| msgpack_unpack_return | ||||
| msgpack_unpack(const char* data, size_t len, size_t* off, | ||||
| 		msgpack_zone* result_zone, msgpack_object* result) | ||||
| { | ||||
| 	size_t noff = 0; | ||||
| 	if(off != NULL) { noff = *off; } | ||||
|  | ||||
| 	if(len <= noff) { | ||||
| 		// FIXME | ||||
| 		return MSGPACK_UNPACK_CONTINUE; | ||||
| 	} | ||||
|  | ||||
| 	template_context ctx; | ||||
| 	template_init(&ctx); | ||||
|  | ||||
| 	ctx.user.z = result_zone; | ||||
| 	ctx.user.referenced = false; | ||||
|  | ||||
| 	int e = template_execute(&ctx, data, len, &noff); | ||||
| 	if(e < 0) { | ||||
| 		return MSGPACK_UNPACK_PARSE_ERROR; | ||||
| 	} | ||||
|  | ||||
| 	if(off != NULL) { *off = noff; } | ||||
|  | ||||
| 	if(e == 0) { | ||||
| 		return MSGPACK_UNPACK_CONTINUE; | ||||
| 	} | ||||
|  | ||||
| 	*result = template_data(&ctx); | ||||
|  | ||||
| 	if(noff < len) { | ||||
| 		return MSGPACK_UNPACK_EXTRA_BYTES; | ||||
| 	} | ||||
|  | ||||
| 	return MSGPACK_UNPACK_SUCCESS; | ||||
| } | ||||
|  | ||||
| bool msgpack_unpack_next(msgpack_unpacked* result, | ||||
| 		const char* data, size_t len, size_t* off) | ||||
| { | ||||
| 	msgpack_unpacked_destroy(result); | ||||
|  | ||||
| 	size_t noff = 0; | ||||
| 	if(off != NULL) { noff = *off; } | ||||
|  | ||||
| 	if(len <= noff) { | ||||
| 		return false; | ||||
| 	} | ||||
|  | ||||
| 	msgpack_zone* z = msgpack_zone_new(MSGPACK_ZONE_CHUNK_SIZE); | ||||
|  | ||||
| 	template_context ctx; | ||||
| 	template_init(&ctx); | ||||
|  | ||||
| 	ctx.user.z = z; | ||||
| 	ctx.user.referenced = false; | ||||
|  | ||||
| 	int e = template_execute(&ctx, data, len, &noff); | ||||
| 	if(e <= 0) { | ||||
| 		msgpack_zone_free(z); | ||||
| 		return false; | ||||
| 	} | ||||
|  | ||||
| 	if(off != NULL) { *off = noff; } | ||||
|  | ||||
| 	result->zone = z; | ||||
| 	result->data = template_data(&ctx); | ||||
|  | ||||
| 	return true; | ||||
| } | ||||
|  | ||||
| @@ -1,17 +0,0 @@ | ||||
| #include "msgpack.h" | ||||
|  | ||||
| const char* msgpack_version(void) | ||||
| { | ||||
| 	return MSGPACK_VERSION; | ||||
| } | ||||
|  | ||||
| int msgpack_version_major(void) | ||||
| { | ||||
| 	return MSGPACK_VERSION_MAJOR; | ||||
| } | ||||
|  | ||||
| int msgpack_version_minor(void) | ||||
| { | ||||
| 	return MSGPACK_VERSION_MINOR; | ||||
| } | ||||
|  | ||||
| @@ -1,220 +0,0 @@ | ||||
| /* | ||||
|  * MessagePack for C zero-copy 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. | ||||
|  */ | ||||
| #include "msgpack/vrefbuffer.h" | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
|  | ||||
| struct msgpack_vrefbuffer_chunk { | ||||
| 	struct msgpack_vrefbuffer_chunk* next; | ||||
| 	/* data ... */ | ||||
| }; | ||||
|  | ||||
| bool msgpack_vrefbuffer_init(msgpack_vrefbuffer* vbuf, | ||||
| 		size_t ref_size, size_t chunk_size) | ||||
| { | ||||
| 	vbuf->chunk_size = chunk_size; | ||||
| 	vbuf->ref_size = ref_size; | ||||
|  | ||||
| 	size_t nfirst = (sizeof(struct iovec) < 72/2) ? | ||||
| 			72 / sizeof(struct iovec) : 8; | ||||
|  | ||||
| 	struct iovec* array = (struct iovec*)malloc( | ||||
| 			sizeof(struct iovec) * nfirst); | ||||
| 	if(array == NULL) { | ||||
| 		return false; | ||||
| 	} | ||||
|  | ||||
| 	vbuf->tail  = array; | ||||
| 	vbuf->end   = array + nfirst; | ||||
| 	vbuf->array = array; | ||||
|  | ||||
| 	msgpack_vrefbuffer_chunk* chunk = (msgpack_vrefbuffer_chunk*)malloc( | ||||
| 			sizeof(msgpack_vrefbuffer_chunk) + chunk_size); | ||||
| 	if(chunk == NULL) { | ||||
| 		free(array); | ||||
| 		return false; | ||||
| 	} | ||||
|  | ||||
| 	msgpack_vrefbuffer_inner_buffer* const ib = &vbuf->inner_buffer; | ||||
|  | ||||
| 	ib->free = chunk_size; | ||||
| 	ib->ptr  = ((char*)chunk) + sizeof(msgpack_vrefbuffer_chunk); | ||||
| 	ib->head = chunk; | ||||
| 	chunk->next = NULL; | ||||
|  | ||||
| 	return true; | ||||
| } | ||||
|  | ||||
| void msgpack_vrefbuffer_destroy(msgpack_vrefbuffer* vbuf) | ||||
| { | ||||
| 	msgpack_vrefbuffer_chunk* c = vbuf->inner_buffer.head; | ||||
| 	while(true) { | ||||
| 		msgpack_vrefbuffer_chunk* n = c->next; | ||||
| 		free(c); | ||||
| 		if(n != NULL) { | ||||
| 			c = n; | ||||
| 		} else { | ||||
| 			break; | ||||
| 		} | ||||
| 	} | ||||
| 	free(vbuf->array); | ||||
| } | ||||
|  | ||||
| void msgpack_vrefbuffer_clear(msgpack_vrefbuffer* vbuf) | ||||
| { | ||||
| 	msgpack_vrefbuffer_chunk* c = vbuf->inner_buffer.head->next; | ||||
| 	msgpack_vrefbuffer_chunk* n; | ||||
| 	while(c != NULL) { | ||||
| 		n = c->next; | ||||
| 		free(c); | ||||
| 		c = n; | ||||
| 	} | ||||
|  | ||||
| 	msgpack_vrefbuffer_inner_buffer* const ib = &vbuf->inner_buffer; | ||||
| 	msgpack_vrefbuffer_chunk* chunk = ib->head; | ||||
| 	chunk->next = NULL; | ||||
| 	ib->free = vbuf->chunk_size; | ||||
| 	ib->ptr  = ((char*)chunk) + sizeof(msgpack_vrefbuffer_chunk); | ||||
|  | ||||
| 	vbuf->tail = vbuf->array; | ||||
| } | ||||
|  | ||||
| int msgpack_vrefbuffer_append_ref(msgpack_vrefbuffer* vbuf, | ||||
| 		const char* buf, unsigned int len) | ||||
| { | ||||
| 	if(vbuf->tail == vbuf->end) { | ||||
| 		const size_t nused = vbuf->tail - vbuf->array; | ||||
| 		const size_t nnext = nused * 2; | ||||
|  | ||||
| 		struct iovec* nvec = (struct iovec*)realloc( | ||||
| 				vbuf->array, sizeof(struct iovec)*nnext); | ||||
| 		if(nvec == NULL) { | ||||
| 			return -1; | ||||
| 		} | ||||
|  | ||||
| 		vbuf->array = nvec; | ||||
| 		vbuf->end   = nvec + nnext; | ||||
| 		vbuf->tail  = nvec + nused; | ||||
| 	} | ||||
|  | ||||
| 	vbuf->tail->iov_base = (char*)buf; | ||||
| 	vbuf->tail->iov_len  = len; | ||||
| 	++vbuf->tail; | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| int msgpack_vrefbuffer_append_copy(msgpack_vrefbuffer* vbuf, | ||||
| 		const char* buf, unsigned int len) | ||||
| { | ||||
| 	msgpack_vrefbuffer_inner_buffer* const ib = &vbuf->inner_buffer; | ||||
|  | ||||
| 	if(ib->free < len) { | ||||
| 		size_t sz = vbuf->chunk_size; | ||||
| 		if(sz < len) { | ||||
| 			sz = len; | ||||
| 		} | ||||
|  | ||||
| 		msgpack_vrefbuffer_chunk* chunk = (msgpack_vrefbuffer_chunk*)malloc( | ||||
| 				sizeof(msgpack_vrefbuffer_chunk) + sz); | ||||
| 		if(chunk == NULL) { | ||||
| 			return -1; | ||||
| 		} | ||||
|  | ||||
| 		chunk->next = ib->head; | ||||
| 		ib->head = chunk; | ||||
| 		ib->free = sz; | ||||
| 		ib->ptr  = ((char*)chunk) + sizeof(msgpack_vrefbuffer_chunk); | ||||
| 	} | ||||
|  | ||||
| 	char* m = ib->ptr; | ||||
| 	memcpy(m, buf, len); | ||||
| 	ib->free -= len; | ||||
| 	ib->ptr  += len; | ||||
|  | ||||
| 	if(vbuf->tail != vbuf->array && m == | ||||
| 			(const char*)((vbuf->tail-1)->iov_base) + (vbuf->tail-1)->iov_len) { | ||||
| 		(vbuf->tail-1)->iov_len += len; | ||||
| 		return 0; | ||||
| 	} else { | ||||
| 		return msgpack_vrefbuffer_append_ref(vbuf, m, len); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| int msgpack_vrefbuffer_migrate(msgpack_vrefbuffer* vbuf, msgpack_vrefbuffer* to) | ||||
| { | ||||
| 	size_t sz = vbuf->chunk_size; | ||||
|  | ||||
| 	msgpack_vrefbuffer_chunk* empty = (msgpack_vrefbuffer_chunk*)malloc( | ||||
| 			sizeof(msgpack_vrefbuffer_chunk) + sz); | ||||
| 	if(empty == NULL) { | ||||
| 		return -1; | ||||
| 	} | ||||
|  | ||||
| 	empty->next = NULL; | ||||
|  | ||||
|  | ||||
| 	const size_t nused = vbuf->tail - vbuf->array; | ||||
| 	if(to->tail + nused < vbuf->end) { | ||||
| 		const size_t tosize = to->tail - to->array; | ||||
| 		const size_t reqsize = nused + tosize; | ||||
| 		size_t nnext = (to->end - to->array) * 2; | ||||
| 		while(nnext < reqsize) { | ||||
| 			nnext *= 2; | ||||
| 		} | ||||
|  | ||||
| 		struct iovec* nvec = (struct iovec*)realloc( | ||||
| 				to->array, sizeof(struct iovec)*nnext); | ||||
| 		if(nvec == NULL) { | ||||
| 			free(empty); | ||||
| 			return -1; | ||||
| 		} | ||||
|  | ||||
| 		to->array = nvec; | ||||
| 		to->end   = nvec + nnext; | ||||
| 		to->tail  = nvec + tosize; | ||||
| 	} | ||||
|  | ||||
| 	memcpy(to->tail, vbuf->array, sizeof(struct iovec)*nused); | ||||
|  | ||||
| 	to->tail += nused; | ||||
| 	vbuf->tail = vbuf->array; | ||||
|  | ||||
|  | ||||
| 	msgpack_vrefbuffer_inner_buffer* const ib = &vbuf->inner_buffer; | ||||
| 	msgpack_vrefbuffer_inner_buffer* const toib = &to->inner_buffer; | ||||
|  | ||||
| 	msgpack_vrefbuffer_chunk* last = ib->head; | ||||
| 	while(last->next != NULL) { | ||||
| 		last = last->next; | ||||
| 	} | ||||
| 	last->next = toib->head; | ||||
| 	toib->head = ib->head; | ||||
|  | ||||
| 	if(toib->free < ib->free) { | ||||
| 		toib->free = ib->free; | ||||
| 		toib->ptr  = ib->ptr; | ||||
| 	} | ||||
|  | ||||
| 	ib->head = empty; | ||||
| 	ib->free = sz; | ||||
| 	ib->ptr  = ((char*)empty) + sizeof(msgpack_vrefbuffer_chunk); | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
							
								
								
									
										221
									
								
								cpp/src/zone.c
									
									
									
									
									
								
							
							
						
						
									
										221
									
								
								cpp/src/zone.c
									
									
									
									
									
								
							| @@ -1,221 +0,0 @@ | ||||
| /* | ||||
|  * MessagePack for C memory pool 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. | ||||
|  */ | ||||
| #include "msgpack/zone.h" | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
|  | ||||
| struct msgpack_zone_chunk { | ||||
| 	struct msgpack_zone_chunk* next; | ||||
| 	/* data ... */ | ||||
| }; | ||||
|  | ||||
| static inline bool init_chunk_list(msgpack_zone_chunk_list* cl, size_t chunk_size) | ||||
| { | ||||
| 	msgpack_zone_chunk* chunk = (msgpack_zone_chunk*)malloc( | ||||
| 			sizeof(msgpack_zone_chunk) + chunk_size); | ||||
| 	if(chunk == NULL) { | ||||
| 		return false; | ||||
| 	} | ||||
|  | ||||
| 	cl->head = chunk; | ||||
| 	cl->free = chunk_size; | ||||
| 	cl->ptr  = ((char*)chunk) + sizeof(msgpack_zone_chunk); | ||||
| 	chunk->next = NULL; | ||||
|  | ||||
| 	return true; | ||||
| } | ||||
|  | ||||
| static inline void destroy_chunk_list(msgpack_zone_chunk_list* cl) | ||||
| { | ||||
| 	msgpack_zone_chunk* c = cl->head; | ||||
| 	while(true) { | ||||
| 		msgpack_zone_chunk* n = c->next; | ||||
| 		free(c); | ||||
| 		if(n != NULL) { | ||||
| 			c = n; | ||||
| 		} else { | ||||
| 			break; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| static inline void clear_chunk_list(msgpack_zone_chunk_list* cl, size_t chunk_size) | ||||
| { | ||||
| 	msgpack_zone_chunk* c = cl->head; | ||||
| 	while(true) { | ||||
| 		msgpack_zone_chunk* n = c->next; | ||||
| 		if(n != NULL) { | ||||
| 			free(c); | ||||
| 			c = n; | ||||
| 		} else { | ||||
| 			break; | ||||
| 		} | ||||
| 	} | ||||
| 	cl->head->next = NULL; | ||||
| 	cl->free = chunk_size; | ||||
| 	cl->ptr  = ((char*)cl->head) + sizeof(msgpack_zone_chunk); | ||||
| } | ||||
|  | ||||
| void* msgpack_zone_malloc_expand(msgpack_zone* zone, size_t size) | ||||
| { | ||||
| 	msgpack_zone_chunk_list* const cl = &zone->chunk_list; | ||||
|  | ||||
| 	size_t sz = zone->chunk_size; | ||||
|  | ||||
| 	while(sz < size) { | ||||
| 		sz *= 2; | ||||
| 	} | ||||
|  | ||||
| 	msgpack_zone_chunk* chunk = (msgpack_zone_chunk*)malloc( | ||||
| 			sizeof(msgpack_zone_chunk) + sz); | ||||
|  | ||||
| 	char* ptr = ((char*)chunk) + sizeof(msgpack_zone_chunk); | ||||
|  | ||||
| 	chunk->next = cl->head; | ||||
| 	cl->head = chunk; | ||||
| 	cl->free = sz - size; | ||||
| 	cl->ptr  = ptr + size; | ||||
|  | ||||
| 	return ptr; | ||||
| } | ||||
|  | ||||
|  | ||||
| static inline void init_finalizer_array(msgpack_zone_finalizer_array* fa) | ||||
| { | ||||
| 	fa->tail  = NULL; | ||||
| 	fa->end   = NULL; | ||||
| 	fa->array = NULL; | ||||
| } | ||||
|  | ||||
| static inline void call_finalizer_array(msgpack_zone_finalizer_array* fa) | ||||
| { | ||||
| 	msgpack_zone_finalizer* fin = fa->tail; | ||||
| 	for(; fin != fa->array; --fin) { | ||||
| 		(*(fin-1)->func)((fin-1)->data); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| static inline void destroy_finalizer_array(msgpack_zone_finalizer_array* fa) | ||||
| { | ||||
| 	call_finalizer_array(fa); | ||||
| 	free(fa->array); | ||||
| } | ||||
|  | ||||
| static inline void clear_finalizer_array(msgpack_zone_finalizer_array* fa) | ||||
| { | ||||
| 	call_finalizer_array(fa); | ||||
| 	fa->tail = fa->array; | ||||
| } | ||||
|  | ||||
| bool msgpack_zone_push_finalizer_expand(msgpack_zone* zone, | ||||
| 		void (*func)(void* data), void* data) | ||||
| { | ||||
| 	msgpack_zone_finalizer_array* const fa = &zone->finalizer_array; | ||||
|  | ||||
| 	const size_t nused = fa->end - fa->array; | ||||
|  | ||||
| 	size_t nnext; | ||||
| 	if(nused == 0) { | ||||
| 		nnext = (sizeof(msgpack_zone_finalizer) < 72/2) ? | ||||
| 				72 / sizeof(msgpack_zone_finalizer) : 8; | ||||
|  | ||||
| 	} else { | ||||
| 		nnext = nused * 2; | ||||
| 	} | ||||
|  | ||||
| 	msgpack_zone_finalizer* tmp = | ||||
| 		(msgpack_zone_finalizer*)realloc(fa->array, | ||||
| 				sizeof(msgpack_zone_finalizer) * nnext); | ||||
| 	if(tmp == NULL) { | ||||
| 		return false; | ||||
| 	} | ||||
|  | ||||
| 	fa->array  = tmp; | ||||
| 	fa->end    = tmp + nnext; | ||||
| 	fa->tail   = tmp + nused; | ||||
|  | ||||
| 	fa->tail->func = func; | ||||
| 	fa->tail->data = data; | ||||
|  | ||||
| 	++fa->tail; | ||||
|  | ||||
| 	return true; | ||||
| } | ||||
|  | ||||
|  | ||||
| bool msgpack_zone_is_empty(msgpack_zone* zone) | ||||
| { | ||||
| 	msgpack_zone_chunk_list* const cl = &zone->chunk_list; | ||||
| 	msgpack_zone_finalizer_array* const fa = &zone->finalizer_array; | ||||
| 	return cl->free == zone->chunk_size && cl->head->next == NULL && | ||||
| 		fa->tail == fa->array; | ||||
| } | ||||
|  | ||||
|  | ||||
| void msgpack_zone_destroy(msgpack_zone* zone) | ||||
| { | ||||
| 	destroy_finalizer_array(&zone->finalizer_array); | ||||
| 	destroy_chunk_list(&zone->chunk_list); | ||||
| } | ||||
|  | ||||
| void msgpack_zone_clear(msgpack_zone* zone) | ||||
| { | ||||
| 	clear_finalizer_array(&zone->finalizer_array); | ||||
| 	clear_chunk_list(&zone->chunk_list, zone->chunk_size); | ||||
| } | ||||
|  | ||||
| bool msgpack_zone_init(msgpack_zone* zone, size_t chunk_size) | ||||
| { | ||||
| 	zone->chunk_size = chunk_size; | ||||
|  | ||||
| 	if(!init_chunk_list(&zone->chunk_list, chunk_size)) { | ||||
| 		return false; | ||||
| 	} | ||||
|  | ||||
| 	init_finalizer_array(&zone->finalizer_array); | ||||
|  | ||||
| 	return true; | ||||
| } | ||||
|  | ||||
| msgpack_zone* msgpack_zone_new(size_t chunk_size) | ||||
| { | ||||
| 	msgpack_zone* zone = (msgpack_zone*)malloc( | ||||
| 			sizeof(msgpack_zone) + chunk_size); | ||||
| 	if(zone == NULL) { | ||||
| 		return NULL; | ||||
| 	} | ||||
|  | ||||
| 	zone->chunk_size = chunk_size; | ||||
|  | ||||
| 	if(!init_chunk_list(&zone->chunk_list, chunk_size)) { | ||||
| 		free(zone); | ||||
| 		return NULL; | ||||
| 	} | ||||
|  | ||||
| 	init_finalizer_array(&zone->finalizer_array); | ||||
|  | ||||
| 	return zone; | ||||
| } | ||||
|  | ||||
| void msgpack_zone_free(msgpack_zone* zone) | ||||
| { | ||||
| 	if(zone == NULL) { return; } | ||||
| 	msgpack_zone_destroy(zone); | ||||
| 	free(zone); | ||||
| } | ||||
|  | ||||
| @@ -1,54 +0,0 @@ | ||||
|  | ||||
| AM_CPPFLAGS   = -I../src | ||||
| AM_C_CPPFLAGS = -I../src | ||||
| AM_LDFLAGS = ../src/libmsgpack.la -lgtest_main | ||||
|  | ||||
| check_PROGRAMS = \ | ||||
| 		zone \ | ||||
| 		pack_unpack \ | ||||
| 		pack_unpack_c \ | ||||
| 		streaming \ | ||||
| 		streaming_c \ | ||||
| 		object \ | ||||
| 		convert \ | ||||
| 		buffer \ | ||||
| 		cases \ | ||||
| 		fixint \ | ||||
| 		fixint_c \ | ||||
| 		version \ | ||||
| 		msgpackc_test \ | ||||
| 		msgpack_test | ||||
|  | ||||
| TESTS = $(check_PROGRAMS) | ||||
|  | ||||
| zone_SOURCES = zone.cc | ||||
|  | ||||
| pack_unpack_SOURCES = pack_unpack.cc | ||||
|  | ||||
| pack_unpack_c_SOURCES = pack_unpack_c.cc | ||||
|  | ||||
| streaming_SOURCES = streaming.cc | ||||
|  | ||||
| streaming_c_SOURCES = streaming_c.cc | ||||
|  | ||||
| object_SOURCES = object.cc | ||||
|  | ||||
| convert_SOURCES = convert.cc | ||||
|  | ||||
| buffer_SOURCES = buffer.cc | ||||
| buffer_LDADD = -lz | ||||
|  | ||||
| cases_SOURCES = cases.cc | ||||
|  | ||||
| fixint_SOURCES = fixint.cc | ||||
|  | ||||
| fixint_c_SOURCES = fixint_c.cc | ||||
|  | ||||
| version_SOURCES = version.cc | ||||
|  | ||||
| msgpackc_test_SOURCES = msgpackc_test.cpp | ||||
|  | ||||
| msgpack_test_SOURCES = msgpack_test.cpp | ||||
|  | ||||
| EXTRA_DIST = cases.mpac cases_compact.mpac | ||||
|  | ||||
| @@ -1,75 +0,0 @@ | ||||
| #include <msgpack.hpp> | ||||
| #include <msgpack/zbuffer.hpp> | ||||
| #include <gtest/gtest.h> | ||||
| #include <string.h> | ||||
|  | ||||
| TEST(buffer, sbuffer) | ||||
| { | ||||
| 	msgpack::sbuffer sbuf; | ||||
| 	sbuf.write("a", 1); | ||||
| 	sbuf.write("a", 1); | ||||
| 	sbuf.write("a", 1); | ||||
|  | ||||
| 	EXPECT_EQ(3, sbuf.size()); | ||||
| 	EXPECT_TRUE( memcmp(sbuf.data(), "aaa", 3) == 0 ); | ||||
|  | ||||
| 	sbuf.clear(); | ||||
| 	sbuf.write("a", 1); | ||||
| 	sbuf.write("a", 1); | ||||
| 	sbuf.write("a", 1); | ||||
|  | ||||
| 	EXPECT_EQ(3, sbuf.size()); | ||||
| 	EXPECT_TRUE( memcmp(sbuf.data(), "aaa", 3) == 0 ); | ||||
| } | ||||
|  | ||||
|  | ||||
| TEST(buffer, vrefbuffer) | ||||
| { | ||||
| 	msgpack::vrefbuffer vbuf; | ||||
| 	vbuf.write("a", 1); | ||||
| 	vbuf.write("a", 1); | ||||
| 	vbuf.write("a", 1); | ||||
|  | ||||
| 	const struct iovec* vec = vbuf.vector(); | ||||
| 	size_t veclen = vbuf.vector_size(); | ||||
|  | ||||
| 	msgpack::sbuffer sbuf; | ||||
| 	for(size_t i=0; i < veclen; ++i) { | ||||
| 		sbuf.write((const char*)vec[i].iov_base, vec[i].iov_len); | ||||
| 	} | ||||
|  | ||||
| 	EXPECT_EQ(3, sbuf.size()); | ||||
| 	EXPECT_TRUE( memcmp(sbuf.data(), "aaa", 3) == 0 ); | ||||
|  | ||||
|  | ||||
| 	vbuf.clear(); | ||||
| 	vbuf.write("a", 1); | ||||
| 	vbuf.write("a", 1); | ||||
| 	vbuf.write("a", 1); | ||||
|  | ||||
| 	vec = vbuf.vector(); | ||||
| 	veclen = vbuf.vector_size(); | ||||
|  | ||||
| 	sbuf.clear(); | ||||
| 	for(size_t i=0; i < veclen; ++i) { | ||||
| 		sbuf.write((const char*)vec[i].iov_base, vec[i].iov_len); | ||||
| 	} | ||||
|  | ||||
| 	EXPECT_EQ(3, sbuf.size()); | ||||
| 	EXPECT_TRUE( memcmp(sbuf.data(), "aaa", 3) == 0 ); | ||||
| } | ||||
|  | ||||
|  | ||||
| TEST(buffer, zbuffer) | ||||
| { | ||||
| 	msgpack::zbuffer zbuf; | ||||
| 	zbuf.write("a", 1); | ||||
| 	zbuf.write("a", 1); | ||||
| 	zbuf.write("a", 1); | ||||
|  | ||||
| 	zbuf.flush(); | ||||
|  | ||||
| 	char* data = zbuf.data(); | ||||
| 	size_t size = zbuf.size(); | ||||
| } | ||||
|  | ||||
| @@ -1,38 +0,0 @@ | ||||
| #include <msgpack.hpp> | ||||
| #include <fstream> | ||||
| #include <gtest/gtest.h> | ||||
|  | ||||
| static void feed_file(msgpack::unpacker& pac, const char* path) | ||||
| { | ||||
| 	std::ifstream fin(path); | ||||
| 	while(true) { | ||||
| 		pac.reserve_buffer(32*1024); | ||||
| 		fin.read(pac.buffer(), pac.buffer_capacity()); | ||||
| 		if(fin.bad()) { | ||||
| 			throw std::runtime_error("read failed"); | ||||
| 		} | ||||
| 		pac.buffer_consumed(fin.gcount()); | ||||
| 		if(fin.fail()) { | ||||
| 			break; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| TEST(cases, format) | ||||
| { | ||||
| 	msgpack::unpacker pac; | ||||
| 	msgpack::unpacker pac_compact; | ||||
|  | ||||
| 	feed_file(pac, "cases.mpac"); | ||||
| 	feed_file(pac_compact, "cases_compact.mpac"); | ||||
|  | ||||
| 	msgpack::unpacked result; | ||||
| 	while(pac.next(&result)) { | ||||
| 		msgpack::unpacked result_compact; | ||||
| 		EXPECT_TRUE( pac_compact.next(&result_compact) ); | ||||
| 		EXPECT_EQ(result_compact.get(), result.get()); | ||||
| 	} | ||||
|  | ||||
| 	EXPECT_FALSE( pac_compact.next(&result) ); | ||||
| } | ||||
|  | ||||
| @@ -1,74 +0,0 @@ | ||||
| #include <msgpack.hpp> | ||||
| #include <gtest/gtest.h> | ||||
|  | ||||
| class compatibility { | ||||
| public: | ||||
| 	compatibility() : str1("default"), str2("default") { } | ||||
|  | ||||
| 	std::string str1; | ||||
| 	std::string str2; | ||||
|  | ||||
| 	MSGPACK_DEFINE(str1, str2); | ||||
| }; | ||||
|  | ||||
| TEST(convert, compatibility_less) | ||||
| { | ||||
| 	std::vector<std::string> src(1); | ||||
| 	src[0] = "kumofs"; | ||||
|  | ||||
| 	msgpack::zone z; | ||||
| 	msgpack::object obj(src, &z); | ||||
|  | ||||
| 	compatibility c; | ||||
| 	EXPECT_NO_THROW( obj.convert(&c) ); | ||||
|  | ||||
| 	EXPECT_EQ("kumofs",  c.str1); | ||||
| 	EXPECT_EQ("default", c.str2); | ||||
| } | ||||
|  | ||||
| TEST(convert, compatibility_more) | ||||
| { | ||||
| 	std::vector<std::string> src(3); | ||||
| 	src[0] = "kumofs"; | ||||
| 	src[1] = "mpio"; | ||||
| 	src[2] = "cloudy"; | ||||
|  | ||||
| 	msgpack::zone z; | ||||
| 	msgpack::object obj(src, &z); | ||||
|  | ||||
| 	compatibility to; | ||||
| 	EXPECT_NO_THROW( obj.convert(&to) ); | ||||
|  | ||||
| 	EXPECT_EQ("kumofs", to.str1); | ||||
| 	EXPECT_EQ("mpio",   to.str2); | ||||
| } | ||||
|  | ||||
|  | ||||
| class enum_member { | ||||
| public: | ||||
| 	enum_member() : flag(A) { } | ||||
|  | ||||
| 	enum flags_t { | ||||
| 		A = 0, | ||||
| 		B = 1, | ||||
| 	}; | ||||
|  | ||||
| 	flags_t flag; | ||||
|  | ||||
| 	MSGPACK_DEFINE((int&)flag); | ||||
| }; | ||||
|  | ||||
| TEST(convert, enum_member) | ||||
| { | ||||
| 	enum_member src; | ||||
| 	src.flag = enum_member::B; | ||||
|  | ||||
| 	msgpack::zone z; | ||||
| 	msgpack::object obj(src, &z); | ||||
|  | ||||
| 	enum_member to; | ||||
| 	EXPECT_NO_THROW( obj.convert(&to) ); | ||||
|  | ||||
| 	EXPECT_EQ(enum_member::B, to.flag); | ||||
| } | ||||
|  | ||||
| @@ -1,24 +0,0 @@ | ||||
| #include <msgpack.hpp> | ||||
| #include <gtest/gtest.h> | ||||
|  | ||||
| template <typename T> | ||||
| void check_size(size_t size) { | ||||
| 	T v(0); | ||||
| 	msgpack::sbuffer sbuf; | ||||
| 	msgpack::pack(sbuf, v); | ||||
| 	EXPECT_EQ(size, sbuf.size()); | ||||
| } | ||||
|  | ||||
| TEST(fixint, size) | ||||
| { | ||||
| 	check_size<msgpack::type::fix_int8>(2); | ||||
| 	check_size<msgpack::type::fix_int16>(3); | ||||
| 	check_size<msgpack::type::fix_int32>(5); | ||||
| 	check_size<msgpack::type::fix_int64>(9); | ||||
|  | ||||
| 	check_size<msgpack::type::fix_uint8>(2); | ||||
| 	check_size<msgpack::type::fix_uint16>(3); | ||||
| 	check_size<msgpack::type::fix_uint32>(5); | ||||
| 	check_size<msgpack::type::fix_uint64>(9); | ||||
| } | ||||
|  | ||||
| @@ -1,32 +0,0 @@ | ||||
| #include <msgpack.hpp> | ||||
| #include <gtest/gtest.h> | ||||
|  | ||||
| TEST(fixint, size) | ||||
| { | ||||
| 	msgpack_sbuffer* sbuf = msgpack_sbuffer_new(); | ||||
| 	msgpack_packer* pk = msgpack_packer_new(sbuf, msgpack_sbuffer_write); | ||||
|  | ||||
| 	size_t sum = 0; | ||||
|  | ||||
| 	EXPECT_EQ(0, msgpack_pack_fix_int8(pk, 0)); | ||||
| 	EXPECT_EQ(sum+=2, sbuf->size); | ||||
| 	EXPECT_EQ(0, msgpack_pack_fix_int16(pk, 0)); | ||||
| 	EXPECT_EQ(sum+=3, sbuf->size); | ||||
| 	EXPECT_EQ(0, msgpack_pack_fix_int32(pk, 0)); | ||||
| 	EXPECT_EQ(sum+=5, sbuf->size); | ||||
| 	EXPECT_EQ(0, msgpack_pack_fix_int64(pk, 0)); | ||||
| 	EXPECT_EQ(sum+=9, sbuf->size); | ||||
|  | ||||
| 	EXPECT_EQ(0, msgpack_pack_fix_uint8(pk, 0)); | ||||
| 	EXPECT_EQ(sum+=2, sbuf->size); | ||||
| 	EXPECT_EQ(0, msgpack_pack_fix_uint16(pk, 0)); | ||||
| 	EXPECT_EQ(sum+=3, sbuf->size); | ||||
| 	EXPECT_EQ(0, msgpack_pack_fix_uint32(pk, 0)); | ||||
| 	EXPECT_EQ(sum+=5, sbuf->size); | ||||
| 	EXPECT_EQ(0, msgpack_pack_fix_uint64(pk, 0)); | ||||
| 	EXPECT_EQ(sum+=9, sbuf->size); | ||||
|  | ||||
| 	msgpack_sbuffer_free(sbuf); | ||||
| 	msgpack_packer_free(pk); | ||||
| } | ||||
|  | ||||
| @@ -1,982 +0,0 @@ | ||||
| #include "msgpack.hpp" | ||||
|  | ||||
| #include <math.h> | ||||
| #include <string> | ||||
| #include <vector> | ||||
| #include <map> | ||||
| #include <deque> | ||||
| #include <set> | ||||
| #include <list> | ||||
|  | ||||
| #include <gtest/gtest.h> | ||||
|  | ||||
| #ifdef HAVE_CONFIG_H | ||||
| #include "config.h" | ||||
| #endif | ||||
|  | ||||
| using namespace std; | ||||
|  | ||||
| const unsigned int kLoop = 10000; | ||||
| const unsigned int kElements = 100; | ||||
| const double kEPS = 1e-10; | ||||
|  | ||||
| #define GEN_TEST(test_type)                                           \ | ||||
|   do {                                                                \ | ||||
|     vector<test_type> v;                                              \ | ||||
|     v.push_back(0);                                                   \ | ||||
|     v.push_back(1);                                                   \ | ||||
|     v.push_back(2);                                                   \ | ||||
|     v.push_back(numeric_limits<test_type>::min());                    \ | ||||
|     v.push_back(numeric_limits<test_type>::max());                    \ | ||||
|     for (unsigned int i = 0; i < kLoop; i++)                          \ | ||||
|       v.push_back(rand());                                            \ | ||||
|     for (unsigned int i = 0; i < v.size() ; i++) {                    \ | ||||
|       msgpack::sbuffer sbuf;                                          \ | ||||
|       test_type val1 = v[i];                                          \ | ||||
|       msgpack::pack(sbuf, val1);                                      \ | ||||
|       msgpack::zone z;                                                \ | ||||
|       msgpack::object obj;                                            \ | ||||
|       msgpack::unpack_return ret =                                    \ | ||||
|         msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj);    \ | ||||
|       EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret);                        \ | ||||
|       test_type val2;                                                 \ | ||||
|       obj.convert(&val2);                                             \ | ||||
|       EXPECT_EQ(val1, val2);                                          \ | ||||
|     }                                                                 \ | ||||
| } while(0) | ||||
|  | ||||
| TEST(MSGPACK, simple_buffer_short) | ||||
| { | ||||
|   GEN_TEST(short); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK, simple_buffer_int) | ||||
| { | ||||
|   GEN_TEST(int); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK, simple_buffer_long) | ||||
| { | ||||
|   GEN_TEST(long); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK, simple_buffer_long_long) | ||||
| { | ||||
|   GEN_TEST(long long); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK, simple_buffer_unsigned_short) | ||||
| { | ||||
|   GEN_TEST(unsigned short); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK, simple_buffer_unsigned_int) | ||||
| { | ||||
|   GEN_TEST(unsigned int); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK, simple_buffer_unsigned_long) | ||||
| { | ||||
|   GEN_TEST(unsigned long); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK, simple_buffer_unsigned_long_long) | ||||
| { | ||||
|   GEN_TEST(unsigned long long); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK, simple_buffer_uint8) | ||||
| { | ||||
|   GEN_TEST(uint8_t); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK, simple_buffer_uint16) | ||||
| { | ||||
|   GEN_TEST(uint16_t); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK, simple_buffer_uint32) | ||||
| { | ||||
|   GEN_TEST(uint32_t); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK, simple_buffer_uint64) | ||||
| { | ||||
|   GEN_TEST(uint64_t); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK, simple_buffer_int8) | ||||
| { | ||||
|   GEN_TEST(int8_t); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK, simple_buffer_int16) | ||||
| { | ||||
|   GEN_TEST(int16_t); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK, simple_buffer_int32) | ||||
| { | ||||
|   GEN_TEST(int32_t); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK, simple_buffer_int64) | ||||
| { | ||||
|   GEN_TEST(int64_t); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK, simple_buffer_float) | ||||
| { | ||||
|   vector<float> v; | ||||
|   v.push_back(0.0); | ||||
|   v.push_back(-0.0); | ||||
|   v.push_back(1.0); | ||||
|   v.push_back(-1.0); | ||||
|   v.push_back(numeric_limits<float>::min()); | ||||
|   v.push_back(numeric_limits<float>::max()); | ||||
|   v.push_back(nanf("tag")); | ||||
|   v.push_back(1.0/0.0); // inf | ||||
|   v.push_back(-(1.0/0.0)); // -inf | ||||
|   for (unsigned int i = 0; i < kLoop; i++) { | ||||
|     v.push_back(drand48()); | ||||
|     v.push_back(-drand48()); | ||||
|   } | ||||
|   for (unsigned int i = 0; i < v.size() ; i++) { | ||||
|     msgpack::sbuffer sbuf; | ||||
|     float val1 = v[i]; | ||||
|     msgpack::pack(sbuf, val1); | ||||
|     msgpack::zone z; | ||||
|     msgpack::object obj; | ||||
|     msgpack::unpack_return ret = | ||||
|       msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj); | ||||
|     EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret); | ||||
|     float val2; | ||||
|     obj.convert(&val2); | ||||
|  | ||||
|     if (isnan(val1)) | ||||
|       EXPECT_TRUE(isnan(val2)); | ||||
|     else if (isinf(val1)) | ||||
|       EXPECT_TRUE(isinf(val2)); | ||||
|     else | ||||
|       EXPECT_TRUE(fabs(val2 - val1) <= kEPS); | ||||
|   } | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK, simple_buffer_double) | ||||
| { | ||||
|   vector<double> v; | ||||
|   v.push_back(0.0); | ||||
|   v.push_back(-0.0); | ||||
|   v.push_back(1.0); | ||||
|   v.push_back(-1.0); | ||||
|   v.push_back(numeric_limits<double>::min()); | ||||
|   v.push_back(numeric_limits<double>::max()); | ||||
|   v.push_back(nanf("tag")); | ||||
|   v.push_back(1.0/0.0); // inf | ||||
|   v.push_back(-(1.0/0.0)); // -inf | ||||
|   for (unsigned int i = 0; i < kLoop; i++) { | ||||
|     v.push_back(drand48()); | ||||
|     v.push_back(-drand48()); | ||||
|   } | ||||
|   for (unsigned int i = 0; i < v.size() ; i++) { | ||||
|     msgpack::sbuffer sbuf; | ||||
|     double val1 = v[i]; | ||||
|     msgpack::pack(sbuf, val1); | ||||
|     msgpack::zone z; | ||||
|     msgpack::object obj; | ||||
|     msgpack::unpack_return ret = | ||||
|       msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj); | ||||
|     EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret); | ||||
|     double val2; | ||||
|     obj.convert(&val2); | ||||
|  | ||||
|     if (isnan(val1)) | ||||
|       EXPECT_TRUE(isnan(val2)); | ||||
|     else if (isinf(val1)) | ||||
|       EXPECT_TRUE(isinf(val2)); | ||||
|     else | ||||
|       EXPECT_TRUE(fabs(val2 - val1) <= kEPS); | ||||
|   } | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK, simple_buffer_true) | ||||
| { | ||||
|   msgpack::sbuffer sbuf; | ||||
|   bool val1 = true; | ||||
|   msgpack::pack(sbuf, val1); | ||||
|   msgpack::zone z; | ||||
|   msgpack::object obj; | ||||
|   msgpack::unpack_return ret = | ||||
|     msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj); | ||||
|   EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret); | ||||
|   bool val2; | ||||
|   obj.convert(&val2); | ||||
|   EXPECT_EQ(val1, val2); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK, simple_buffer_false) | ||||
| { | ||||
|   msgpack::sbuffer sbuf; | ||||
|   bool val1 = false; | ||||
|   msgpack::pack(sbuf, val1); | ||||
|   msgpack::zone z; | ||||
|   msgpack::object obj; | ||||
|   msgpack::unpack_return ret = | ||||
|     msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj); | ||||
|   EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret); | ||||
|   bool val2; | ||||
|   obj.convert(&val2); | ||||
|   EXPECT_EQ(val1, val2); | ||||
| } | ||||
|  | ||||
| //----------------------------------------------------------------------------- | ||||
|  | ||||
| // STL | ||||
|  | ||||
| TEST(MSGPACK_STL, simple_buffer_string) | ||||
| { | ||||
|   for (unsigned int k = 0; k < kLoop; k++) { | ||||
|     string val1; | ||||
|     for (unsigned int i = 0; i < kElements; i++) | ||||
|       val1 += 'a' + rand() % 26; | ||||
|     msgpack::sbuffer sbuf; | ||||
|     msgpack::pack(sbuf, val1); | ||||
|     msgpack::zone z; | ||||
|     msgpack::object obj; | ||||
|     msgpack::unpack_return ret = | ||||
|       msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj); | ||||
|     EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret); | ||||
|     string val2; | ||||
|     obj.convert(&val2); | ||||
|     EXPECT_EQ(val1.size(), val2.size()); | ||||
|     EXPECT_EQ(val1, val2); | ||||
|   } | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK_STL, simple_buffer_vector) | ||||
| { | ||||
|   for (unsigned int k = 0; k < kLoop; k++) { | ||||
|     vector<int> val1; | ||||
|     for (unsigned int i = 0; i < kElements; i++) | ||||
|       val1.push_back(rand()); | ||||
|     msgpack::sbuffer sbuf; | ||||
|     msgpack::pack(sbuf, val1); | ||||
|     msgpack::zone z; | ||||
|     msgpack::object obj; | ||||
|     msgpack::unpack_return ret = | ||||
|       msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj); | ||||
|     EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret); | ||||
|     vector<int> val2; | ||||
|     obj.convert(&val2); | ||||
|     EXPECT_EQ(val1.size(), val2.size()); | ||||
|     EXPECT_TRUE(equal(val1.begin(), val1.end(), val2.begin())); | ||||
|   } | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK_STL, simple_buffer_map) | ||||
| { | ||||
|   for (unsigned int k = 0; k < kLoop; k++) { | ||||
|     map<int, int> val1; | ||||
|     for (unsigned int i = 0; i < kElements; i++) | ||||
|       val1[rand()] = rand(); | ||||
|     msgpack::sbuffer sbuf; | ||||
|     msgpack::pack(sbuf, val1); | ||||
|     msgpack::zone z; | ||||
|     msgpack::object obj; | ||||
|     msgpack::unpack_return ret = | ||||
|       msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj); | ||||
|     EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret); | ||||
|     map<int, int> val2; | ||||
|     obj.convert(&val2); | ||||
|     EXPECT_EQ(val1.size(), val2.size()); | ||||
|     EXPECT_TRUE(equal(val1.begin(), val1.end(), val2.begin())); | ||||
|   } | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK_STL, simple_buffer_deque) | ||||
| { | ||||
|   for (unsigned int k = 0; k < kLoop; k++) { | ||||
|     deque<int> val1; | ||||
|     for (unsigned int i = 0; i < kElements; i++) | ||||
|       val1.push_back(rand()); | ||||
|     msgpack::sbuffer sbuf; | ||||
|     msgpack::pack(sbuf, val1); | ||||
|     msgpack::zone z; | ||||
|     msgpack::object obj; | ||||
|     msgpack::unpack_return ret = | ||||
|       msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj); | ||||
|     EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret); | ||||
|     deque<int> val2; | ||||
|     obj.convert(&val2); | ||||
|     EXPECT_EQ(val1.size(), val2.size()); | ||||
|     EXPECT_TRUE(equal(val1.begin(), val1.end(), val2.begin())); | ||||
|   } | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK_STL, simple_buffer_list) | ||||
| { | ||||
|   for (unsigned int k = 0; k < kLoop; k++) { | ||||
|     list<int> val1; | ||||
|     for (unsigned int i = 0; i < kElements; i++) | ||||
|       val1.push_back(rand()); | ||||
|     msgpack::sbuffer sbuf; | ||||
|     msgpack::pack(sbuf, val1); | ||||
|     msgpack::zone z; | ||||
|     msgpack::object obj; | ||||
|     msgpack::unpack_return ret = | ||||
|       msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj); | ||||
|     EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret); | ||||
|     list<int> val2; | ||||
|     obj.convert(&val2); | ||||
|     EXPECT_EQ(val1.size(), val2.size()); | ||||
|     EXPECT_TRUE(equal(val1.begin(), val1.end(), val2.begin())); | ||||
|   } | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK_STL, simple_buffer_set) | ||||
| { | ||||
|   for (unsigned int k = 0; k < kLoop; k++) { | ||||
|     set<int> val1; | ||||
|     for (unsigned int i = 0; i < kElements; i++) | ||||
|       val1.insert(rand()); | ||||
|     msgpack::sbuffer sbuf; | ||||
|     msgpack::pack(sbuf, val1); | ||||
|     msgpack::zone z; | ||||
|     msgpack::object obj; | ||||
|     msgpack::unpack_return ret = | ||||
|       msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj); | ||||
|     EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret); | ||||
|     set<int> val2; | ||||
|     obj.convert(&val2); | ||||
|     EXPECT_EQ(val1.size(), val2.size()); | ||||
|     EXPECT_TRUE(equal(val1.begin(), val1.end(), val2.begin())); | ||||
|   } | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK_STL, simple_buffer_pair) | ||||
| { | ||||
|   for (unsigned int k = 0; k < kLoop; k++) { | ||||
|     pair<int, int> val1 = make_pair(rand(), rand()); | ||||
|     msgpack::sbuffer sbuf; | ||||
|     msgpack::pack(sbuf, val1); | ||||
|     msgpack::zone z; | ||||
|     msgpack::object obj; | ||||
|     msgpack::unpack_return ret = | ||||
|       msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj); | ||||
|     EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret); | ||||
|     pair<int, int> val2; | ||||
|     obj.convert(&val2); | ||||
|     EXPECT_EQ(val1.first, val2.first); | ||||
|     EXPECT_EQ(val1.second, val2.second); | ||||
|   } | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK_STL, simple_buffer_multimap) | ||||
| { | ||||
|   for (unsigned int k = 0; k < kLoop; k++) { | ||||
|     multimap<int, int> val1; | ||||
|     for (unsigned int i = 0; i < kElements; i++) { | ||||
|       int i1 = rand(); | ||||
|       val1.insert(make_pair(i1, rand())); | ||||
|       val1.insert(make_pair(i1, rand())); | ||||
|     } | ||||
|     msgpack::sbuffer sbuf; | ||||
|     msgpack::pack(sbuf, val1); | ||||
|     msgpack::zone z; | ||||
|     msgpack::object obj; | ||||
|     msgpack::unpack_return ret = | ||||
|       msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj); | ||||
|     EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret); | ||||
|     multimap<int, int> val2; | ||||
|     obj.convert(&val2); | ||||
|  | ||||
|     vector<pair<int, int> > v1, v2; | ||||
|     multimap<int, int>::const_iterator it; | ||||
|     for (it = val1.begin(); it != val1.end(); ++it) | ||||
|       v1.push_back(make_pair(it->first, it->second)); | ||||
|     for (it = val2.begin(); it != val2.end(); ++it) | ||||
|       v2.push_back(make_pair(it->first, it->second)); | ||||
|     EXPECT_EQ(val1.size(), val2.size()); | ||||
|     EXPECT_EQ(v1.size(), v2.size()); | ||||
|     sort(v1.begin(), v1.end()); | ||||
|     sort(v2.begin(), v2.end()); | ||||
|     EXPECT_TRUE(v1 == v2); | ||||
|   } | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK_STL, simple_buffer_multiset) | ||||
| { | ||||
|   for (unsigned int k = 0; k < kLoop; k++) { | ||||
|     multiset<int> val1; | ||||
|     for (unsigned int i = 0; i < kElements; i++) | ||||
|       val1.insert(rand()); | ||||
|     msgpack::sbuffer sbuf; | ||||
|     msgpack::pack(sbuf, val1); | ||||
|     msgpack::zone z; | ||||
|     msgpack::object obj; | ||||
|     msgpack::unpack_return ret = | ||||
|       msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj); | ||||
|     EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret); | ||||
|     multiset<int> val2; | ||||
|     obj.convert(&val2); | ||||
|  | ||||
|     vector<int> v1, v2; | ||||
|     multiset<int>::const_iterator it; | ||||
|     for (it = val1.begin(); it != val1.end(); ++it) | ||||
|       v1.push_back(*it); | ||||
|     for (it = val2.begin(); it != val2.end(); ++it) | ||||
|       v2.push_back(*it); | ||||
|     EXPECT_EQ(val1.size(), val2.size()); | ||||
|     EXPECT_EQ(v1.size(), v2.size()); | ||||
|     sort(v1.begin(), v1.end()); | ||||
|     sort(v2.begin(), v2.end()); | ||||
|     EXPECT_TRUE(v1 == v2); | ||||
|   } | ||||
| } | ||||
|  | ||||
| // TR1 | ||||
|  | ||||
| #ifdef HAVE_TR1_UNORDERED_MAP | ||||
| #include <tr1/unordered_map> | ||||
| #include "msgpack/type/tr1/unordered_map.hpp" | ||||
| TEST(MSGPACK_TR1, simple_buffer_unordered_map) | ||||
| { | ||||
|   for (unsigned int k = 0; k < kLoop; k++) { | ||||
|     tr1::unordered_map<int, int> val1; | ||||
|     for (unsigned int i = 0; i < kElements; i++) | ||||
|       val1[rand()] = rand(); | ||||
|     msgpack::sbuffer sbuf; | ||||
|     msgpack::pack(sbuf, val1); | ||||
|     msgpack::zone z; | ||||
|     msgpack::object obj; | ||||
|     msgpack::unpack_return ret = | ||||
|       msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj); | ||||
|     EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret); | ||||
|     tr1::unordered_map<int, int> val2; | ||||
|     obj.convert(&val2); | ||||
|     EXPECT_EQ(val1.size(), val2.size()); | ||||
|     tr1::unordered_map<int, int>::const_iterator it; | ||||
|     for (it = val1.begin(); it != val1.end(); ++it) { | ||||
|       EXPECT_TRUE(val2.find(it->first) != val2.end()); | ||||
|       EXPECT_EQ(it->second, val2.find(it->first)->second); | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK_TR1, simple_buffer_unordered_multimap) | ||||
| { | ||||
|   for (unsigned int k = 0; k < kLoop; k++) { | ||||
|     tr1::unordered_multimap<int, int> val1; | ||||
|     for (unsigned int i = 0; i < kElements; i++) { | ||||
|       int i1 = rand(); | ||||
|       val1.insert(make_pair(i1, rand())); | ||||
|       val1.insert(make_pair(i1, rand())); | ||||
|     } | ||||
|     msgpack::sbuffer sbuf; | ||||
|     msgpack::pack(sbuf, val1); | ||||
|     msgpack::zone z; | ||||
|     msgpack::object obj; | ||||
|     msgpack::unpack_return ret = | ||||
|       msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj); | ||||
|     EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret); | ||||
|     tr1::unordered_multimap<int, int> val2; | ||||
|     obj.convert(&val2); | ||||
|  | ||||
|     vector<pair<int, int> > v1, v2; | ||||
|     tr1::unordered_multimap<int, int>::const_iterator it; | ||||
|     for (it = val1.begin(); it != val1.end(); ++it) | ||||
|       v1.push_back(make_pair(it->first, it->second)); | ||||
|     for (it = val2.begin(); it != val2.end(); ++it) | ||||
|       v2.push_back(make_pair(it->first, it->second)); | ||||
|     EXPECT_EQ(val1.size(), val2.size()); | ||||
|     EXPECT_EQ(v1.size(), v2.size()); | ||||
|     sort(v1.begin(), v1.end()); | ||||
|     sort(v2.begin(), v2.end()); | ||||
|     EXPECT_TRUE(v1 == v2); | ||||
|   } | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #ifdef HAVE_TR1_UNORDERED_SET | ||||
| #include <tr1/unordered_set> | ||||
| #include "msgpack/type/tr1/unordered_set.hpp" | ||||
| TEST(MSGPACK_TR1, simple_buffer_unordered_set) | ||||
| { | ||||
|   for (unsigned int k = 0; k < kLoop; k++) { | ||||
|     tr1::unordered_set<int> val1; | ||||
|     for (unsigned int i = 0; i < kElements; i++) | ||||
|       val1.insert(rand()); | ||||
|     msgpack::sbuffer sbuf; | ||||
|     msgpack::pack(sbuf, val1); | ||||
|     msgpack::zone z; | ||||
|     msgpack::object obj; | ||||
|     msgpack::unpack_return ret = | ||||
|       msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj); | ||||
|     EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret); | ||||
|     tr1::unordered_set<int> val2; | ||||
|     obj.convert(&val2); | ||||
|     EXPECT_EQ(val1.size(), val2.size()); | ||||
|     tr1::unordered_set<int>::const_iterator it; | ||||
|     for (it = val1.begin(); it != val1.end(); ++it) | ||||
|       EXPECT_TRUE(val2.find(*it) != val2.end()); | ||||
|   } | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK_TR1, simple_buffer_unordered_multiset) | ||||
| { | ||||
|   for (unsigned int k = 0; k < kLoop; k++) { | ||||
|     tr1::unordered_multiset<int> val1; | ||||
|     for (unsigned int i = 0; i < kElements; i++) | ||||
|       val1.insert(rand()); | ||||
|     msgpack::sbuffer sbuf; | ||||
|     msgpack::pack(sbuf, val1); | ||||
|     msgpack::zone z; | ||||
|     msgpack::object obj; | ||||
|     msgpack::unpack_return ret = | ||||
|       msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj); | ||||
|     EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret); | ||||
|     tr1::unordered_multiset<int> val2; | ||||
|     obj.convert(&val2); | ||||
|  | ||||
|     vector<int> v1, v2; | ||||
|     tr1::unordered_multiset<int>::const_iterator it; | ||||
|     for (it = val1.begin(); it != val1.end(); ++it) | ||||
|       v1.push_back(*it); | ||||
|     for (it = val2.begin(); it != val2.end(); ++it) | ||||
|       v2.push_back(*it); | ||||
|     EXPECT_EQ(val1.size(), val2.size()); | ||||
|     EXPECT_EQ(v1.size(), v2.size()); | ||||
|     sort(v1.begin(), v1.end()); | ||||
|     sort(v2.begin(), v2.end()); | ||||
|     EXPECT_TRUE(v1 == v2); | ||||
|   } | ||||
| } | ||||
| #endif | ||||
|  | ||||
| // User-Defined Structures | ||||
|  | ||||
| class TestClass | ||||
| { | ||||
| public: | ||||
|   TestClass() : i(0), s("kzk") {} | ||||
|   int i; | ||||
|   string s; | ||||
|   MSGPACK_DEFINE(i, s); | ||||
| }; | ||||
|  | ||||
| TEST(MSGPACK_USER_DEFINED, simple_buffer_class) | ||||
| { | ||||
|   for (unsigned int k = 0; k < kLoop; k++) { | ||||
|     TestClass val1; | ||||
|     msgpack::sbuffer sbuf; | ||||
|     msgpack::pack(sbuf, val1); | ||||
|     msgpack::zone z; | ||||
|     msgpack::object obj; | ||||
|     msgpack::unpack_return ret = | ||||
|       msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj); | ||||
|     EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret); | ||||
|     TestClass val2; | ||||
|     val2.i = -1; | ||||
|     val2.s = ""; | ||||
|     obj.convert(&val2); | ||||
|     EXPECT_EQ(val1.i, val2.i); | ||||
|     EXPECT_EQ(val1.s, val2.s); | ||||
|   } | ||||
| } | ||||
|  | ||||
| class TestClass2 | ||||
| { | ||||
| public: | ||||
|   TestClass2() : i(0), s("kzk") { | ||||
|     for (unsigned int i = 0; i < kElements; i++) | ||||
|       v.push_back(rand()); | ||||
|   } | ||||
|   int i; | ||||
|   string s; | ||||
|   vector<int> v; | ||||
|   MSGPACK_DEFINE(i, s, v); | ||||
| }; | ||||
|  | ||||
| TEST(MSGPACK_USER_DEFINED, simple_buffer_class_old_to_new) | ||||
| { | ||||
|   for (unsigned int k = 0; k < kLoop; k++) { | ||||
|     TestClass val1; | ||||
|     msgpack::sbuffer sbuf; | ||||
|     msgpack::pack(sbuf, val1); | ||||
|     msgpack::zone z; | ||||
|     msgpack::object obj; | ||||
|     msgpack::unpack_return ret = | ||||
|       msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj); | ||||
|     EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret); | ||||
|     TestClass2 val2; | ||||
|     val2.i = -1; | ||||
|     val2.s = ""; | ||||
|     val2.v = vector<int>(); | ||||
|     obj.convert(&val2); | ||||
|     EXPECT_EQ(val1.i, val2.i); | ||||
|     EXPECT_EQ(val1.s, val2.s); | ||||
|     EXPECT_FALSE(val2.s.empty()); | ||||
|   } | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK_USER_DEFINED, simple_buffer_class_new_to_old) | ||||
| { | ||||
|   for (unsigned int k = 0; k < kLoop; k++) { | ||||
|     TestClass2 val1; | ||||
|     msgpack::sbuffer sbuf; | ||||
|     msgpack::pack(sbuf, val1); | ||||
|     msgpack::zone z; | ||||
|     msgpack::object obj; | ||||
|     msgpack::unpack_return ret = | ||||
|       msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj); | ||||
|     EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret); | ||||
|     TestClass val2; | ||||
|     val2.i = -1; | ||||
|     val2.s = ""; | ||||
|     obj.convert(&val2); | ||||
|     EXPECT_EQ(val1.i, val2.i); | ||||
|     EXPECT_EQ(val1.s, val2.s); | ||||
|     EXPECT_FALSE(val2.s.empty()); | ||||
|   } | ||||
| } | ||||
|  | ||||
| class TestEnumMemberClass | ||||
| { | ||||
| public: | ||||
|   TestEnumMemberClass() | ||||
|     : t1(STATE_A), t2(STATE_B), t3(STATE_C) {} | ||||
|  | ||||
|   enum TestEnumType { | ||||
|     STATE_INVALID = 0, | ||||
|     STATE_A = 1, | ||||
|     STATE_B = 2, | ||||
|     STATE_C = 3 | ||||
|   }; | ||||
|   TestEnumType t1; | ||||
|   TestEnumType t2; | ||||
|   TestEnumType t3; | ||||
|  | ||||
|   MSGPACK_DEFINE((int&)t1, (int&)t2, (int&)t3); | ||||
| }; | ||||
|  | ||||
| TEST(MSGPACK_USER_DEFINED, simple_buffer_enum_member) | ||||
| { | ||||
|   TestEnumMemberClass val1; | ||||
|   msgpack::sbuffer sbuf; | ||||
|   msgpack::pack(sbuf, val1); | ||||
|   msgpack::zone z; | ||||
|   msgpack::object obj; | ||||
|   msgpack::unpack_return ret = | ||||
|     msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj); | ||||
|   EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret); | ||||
|   TestEnumMemberClass val2; | ||||
|   val2.t1 = TestEnumMemberClass::STATE_INVALID; | ||||
|   val2.t2 = TestEnumMemberClass::STATE_INVALID; | ||||
|   val2.t3 = TestEnumMemberClass::STATE_INVALID; | ||||
|   obj.convert(&val2); | ||||
|   EXPECT_EQ(val1.t1, val2.t1); | ||||
|   EXPECT_EQ(val1.t2, val2.t2); | ||||
|   EXPECT_EQ(val1.t3, val2.t3); | ||||
| } | ||||
|  | ||||
| class TestUnionMemberClass | ||||
| { | ||||
| public: | ||||
|   TestUnionMemberClass() {} | ||||
|   TestUnionMemberClass(double f) { | ||||
|     is_double = true; | ||||
|     value.f = f; | ||||
|   } | ||||
|   TestUnionMemberClass(int i) { | ||||
|     is_double = false; | ||||
|     value.i = i; | ||||
|   } | ||||
|  | ||||
|   union { | ||||
|     double f; | ||||
|     int i; | ||||
|   } value; | ||||
|   bool is_double; | ||||
|  | ||||
|   template <typename Packer> | ||||
|   void msgpack_pack(Packer& pk) const | ||||
|   { | ||||
|     if (is_double) | ||||
|       pk.pack(msgpack::type::tuple<bool, double>(true, value.f)); | ||||
|     else | ||||
|       pk.pack(msgpack::type::tuple<bool, int>(false, value.i)); | ||||
|   } | ||||
|  | ||||
|   void msgpack_unpack(msgpack::object o) | ||||
|   { | ||||
|     msgpack::type::tuple<bool, msgpack::object> tuple; | ||||
|     o.convert(&tuple); | ||||
|  | ||||
|     is_double = tuple.get<0>(); | ||||
|     if (is_double) | ||||
|       tuple.get<1>().convert(&value.f); | ||||
|     else | ||||
|       tuple.get<1>().convert(&value.i); | ||||
|   } | ||||
| }; | ||||
|  | ||||
| TEST(MSGPACK_USER_DEFINED, simple_buffer_union_member) | ||||
| { | ||||
|   { | ||||
|     // double | ||||
|     TestUnionMemberClass val1(1.0); | ||||
|     msgpack::sbuffer sbuf; | ||||
|     msgpack::pack(sbuf, val1); | ||||
|     msgpack::zone z; | ||||
|     msgpack::object obj; | ||||
|     msgpack::unpack_return ret = | ||||
|       msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj); | ||||
|     EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret); | ||||
|     TestUnionMemberClass val2; | ||||
|     obj.convert(&val2); | ||||
|     EXPECT_EQ(val1.is_double, val2.is_double); | ||||
|     EXPECT_TRUE(fabs(val1.value.f - val2.value.f) < kEPS); | ||||
|   } | ||||
|   { | ||||
|     // int | ||||
|     TestUnionMemberClass val1(1); | ||||
|     msgpack::sbuffer sbuf; | ||||
|     msgpack::pack(sbuf, val1); | ||||
|     msgpack::zone z; | ||||
|     msgpack::object obj; | ||||
|     msgpack::unpack_return ret = | ||||
|       msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj); | ||||
|     EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret); | ||||
|     TestUnionMemberClass val2; | ||||
|     obj.convert(&val2); | ||||
|     EXPECT_EQ(val1.is_double, val2.is_double); | ||||
|     EXPECT_EQ(val1.value.i, 1); | ||||
|     EXPECT_EQ(val1.value.i, val2.value.i); | ||||
|   } | ||||
| } | ||||
|  | ||||
| //----------------------------------------------------------------------------- | ||||
|  | ||||
| #define GEN_TEST_VREF(test_type)                                        \ | ||||
|   do {                                                                  \ | ||||
|     vector<test_type> v;                                                \ | ||||
|     v.push_back(0);                                                     \ | ||||
|     for (unsigned int i = 0; i < v.size(); i++) {                       \ | ||||
|       test_type val1 = v[i];                                            \ | ||||
|       msgpack::vrefbuffer vbuf;                                         \ | ||||
|       msgpack::pack(vbuf, val1);                                        \ | ||||
|       msgpack::sbuffer sbuf;                                            \ | ||||
|       const struct iovec* cur = vbuf.vector();                          \ | ||||
|       const struct iovec* end = cur + vbuf.vector_size();               \ | ||||
|       for(; cur != end; ++cur)                                          \ | ||||
|         sbuf.write((const char*)cur->iov_base, cur->iov_len);           \ | ||||
|       msgpack::zone z;                                                  \ | ||||
|       msgpack::object obj;                                              \ | ||||
|       msgpack::unpack_return ret =                                      \ | ||||
|         msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj);      \ | ||||
|       EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret);                          \ | ||||
|       test_type val2;                                                   \ | ||||
|       obj.convert(&val2);                                               \ | ||||
|       EXPECT_EQ(val1, val2);                                            \ | ||||
|     }                                                                   \ | ||||
|   } while(0); | ||||
|  | ||||
| TEST(MSGPACK, vrefbuffer_short) | ||||
| { | ||||
|   GEN_TEST_VREF(short); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK, vrefbuffer_int) | ||||
| { | ||||
|   GEN_TEST_VREF(int); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK, vrefbuffer_long) | ||||
| { | ||||
|   GEN_TEST_VREF(long); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK, vrefbuffer_long_long) | ||||
| { | ||||
|   GEN_TEST_VREF(long long); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK, vrefbuffer_unsigned_short) | ||||
| { | ||||
|   GEN_TEST_VREF(unsigned short); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK, vrefbuffer_unsigned_int) | ||||
| { | ||||
|   GEN_TEST_VREF(unsigned int); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK, vrefbuffer_unsigned_long) | ||||
| { | ||||
|   GEN_TEST_VREF(unsigned long); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK, vrefbuffer_unsigned_long_long) | ||||
| { | ||||
|   GEN_TEST_VREF(unsigned long long); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK, vrefbuffer_uint8) | ||||
| { | ||||
|   GEN_TEST_VREF(uint8_t); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK, vrefbuffer_uint16) | ||||
| { | ||||
|   GEN_TEST_VREF(uint16_t); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK, vrefbuffer_uint32) | ||||
| { | ||||
|   GEN_TEST_VREF(uint32_t); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK, vrefbuffer_uint64) | ||||
| { | ||||
|   GEN_TEST_VREF(uint64_t); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK, vrefbuffer_int8) | ||||
| { | ||||
|   GEN_TEST_VREF(int8_t); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK, vrefbuffer_int16) | ||||
| { | ||||
|   GEN_TEST_VREF(int16_t); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK, vrefbuffer_int32) | ||||
| { | ||||
|   GEN_TEST_VREF(int32_t); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK, vrefbuffer_int64) | ||||
| { | ||||
|   GEN_TEST_VREF(int64_t); | ||||
| } | ||||
|  | ||||
| //----------------------------------------------------------------------------- | ||||
|  | ||||
| #define GEN_TEST_STREAM(test_type)                                      \ | ||||
|   for (unsigned int k = 0; k < kLoop; k++) {                            \ | ||||
|     msgpack::sbuffer sbuf;                                              \ | ||||
|     msgpack::packer<msgpack::sbuffer> pk(sbuf);                         \ | ||||
|     typedef std::vector<test_type> vec_type;                            \ | ||||
|     vec_type vec;                                                       \ | ||||
|     for(unsigned int i = 0; i < rand() % kLoop; ++i) {                  \ | ||||
|       vec_type::value_type r = rand();                                  \ | ||||
|       vec.push_back(r);                                                 \ | ||||
|       pk.pack(r);                                                       \ | ||||
|     }                                                                   \ | ||||
|     msgpack::unpacker pac;                                              \ | ||||
|     vec_type::const_iterator it = vec.begin();                          \ | ||||
|     const char *p = sbuf.data();                                        \ | ||||
|     const char * const pend = p + sbuf.size();                          \ | ||||
|     while (p < pend) {                                                  \ | ||||
|       const size_t sz = std::min<size_t>(pend - p, rand() % 128);       \ | ||||
|       pac.reserve_buffer(sz);                                           \ | ||||
|       memcpy(pac.buffer(), p, sz);                                      \ | ||||
|       pac.buffer_consumed(sz);                                          \ | ||||
|       while (pac.execute()) {                                           \ | ||||
|         if (it == vec.end()) goto out;                                  \ | ||||
|         msgpack::object obj = pac.data();                               \ | ||||
|         msgpack::zone *life = pac.release_zone();                       \ | ||||
|         EXPECT_TRUE(life != NULL);                                      \ | ||||
|         pac.reset();                                                    \ | ||||
|         vec_type::value_type val;                                       \ | ||||
|         obj.convert(&val);                                              \ | ||||
|         EXPECT_EQ(*it, val);                                            \ | ||||
|         ++it;                                                           \ | ||||
|         delete life;                                                    \ | ||||
|       }                                                                 \ | ||||
|       p += sz;                                                          \ | ||||
|     }                                                                   \ | ||||
|   out:                                                                  \ | ||||
|     ;                                                                   \ | ||||
|   } | ||||
|  | ||||
| TEST(MSGPACK, stream_short) | ||||
| { | ||||
|   GEN_TEST_STREAM(short); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK, stream_int) | ||||
| { | ||||
|   GEN_TEST_STREAM(int); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK, stream_long) | ||||
| { | ||||
|   GEN_TEST_STREAM(long); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK, stream_long_long) | ||||
| { | ||||
|   GEN_TEST_STREAM(long long); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK, stream_unsigned_short) | ||||
| { | ||||
|   GEN_TEST_STREAM(unsigned short); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK, stream_unsigned_int) | ||||
| { | ||||
|   GEN_TEST_STREAM(unsigned int); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK, stream_unsigned_long) | ||||
| { | ||||
|   GEN_TEST_STREAM(unsigned long); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK, stream_unsigned_long_long) | ||||
| { | ||||
|   GEN_TEST_STREAM(unsigned long long); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK, stream_uint8) | ||||
| { | ||||
|   GEN_TEST_STREAM(uint8_t); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK, stream_uint16) | ||||
| { | ||||
|   GEN_TEST_STREAM(uint16_t); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK, stream_uint32) | ||||
| { | ||||
|   GEN_TEST_STREAM(uint32_t); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK, stream_uint64) | ||||
| { | ||||
|   GEN_TEST_STREAM(uint64_t); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK, stream_int8) | ||||
| { | ||||
|   GEN_TEST_STREAM(int8_t); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK, stream_int16) | ||||
| { | ||||
|   GEN_TEST_STREAM(int16_t); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK, stream_int32) | ||||
| { | ||||
|   GEN_TEST_STREAM(int32_t); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACK, stream_int64) | ||||
| { | ||||
|   GEN_TEST_STREAM(int64_t); | ||||
| } | ||||
| @@ -1,424 +0,0 @@ | ||||
| #include "msgpack.h" | ||||
|  | ||||
| #include <math.h> | ||||
| #include <vector> | ||||
| #include <limits> | ||||
|  | ||||
| #include <gtest/gtest.h> | ||||
|  | ||||
| using namespace std; | ||||
|  | ||||
| const unsigned int kLoop = 10000; | ||||
| const double kEPS = 1e-10; | ||||
|  | ||||
| #define GEN_TEST_SIGNED(test_type, func_type)                   \ | ||||
|   do {                                                          \ | ||||
|     vector<test_type> v;                                        \ | ||||
|     v.push_back(0);                                             \ | ||||
|     v.push_back(1);                                             \ | ||||
|     v.push_back(-1);                                            \ | ||||
|     v.push_back(numeric_limits<test_type>::min());              \ | ||||
|     v.push_back(numeric_limits<test_type>::max());              \ | ||||
|     for (unsigned int i = 0; i < kLoop; i++)                    \ | ||||
|       v.push_back(rand());                                      \ | ||||
|     for (unsigned int i = 0; i < v.size() ; i++) {              \ | ||||
|       test_type val = v[i];                                     \ | ||||
|       msgpack_sbuffer sbuf;                                     \ | ||||
|       msgpack_sbuffer_init(&sbuf);                              \ | ||||
|       msgpack_packer pk;                                        \ | ||||
|       msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);   \ | ||||
|       msgpack_pack_##func_type(&pk, val);                       \ | ||||
|       msgpack_zone z;                                           \ | ||||
|       msgpack_zone_init(&z, 2048);                              \ | ||||
|       msgpack_object obj;                                       \ | ||||
|       msgpack_unpack_return ret =                               \ | ||||
|         msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);   \ | ||||
|       EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);                   \ | ||||
|       if (val < 0) {                                            \ | ||||
|         EXPECT_EQ(MSGPACK_OBJECT_NEGATIVE_INTEGER, obj.type);   \ | ||||
|         EXPECT_EQ(val, obj.via.i64);                            \ | ||||
|       } else {                                                  \ | ||||
|         EXPECT_EQ(MSGPACK_OBJECT_POSITIVE_INTEGER, obj.type);   \ | ||||
|         EXPECT_EQ(val, obj.via.u64);                            \ | ||||
|       }                                                         \ | ||||
|       msgpack_zone_destroy(&z);                                 \ | ||||
|       msgpack_sbuffer_destroy(&sbuf);                           \ | ||||
|     }                                                           \ | ||||
|   } while(0) | ||||
|  | ||||
| #define GEN_TEST_UNSIGNED(test_type, func_type)                 \ | ||||
|   do {                                                          \ | ||||
|     vector<test_type> v;                                        \ | ||||
|     v.push_back(0);                                             \ | ||||
|     v.push_back(1);                                             \ | ||||
|     v.push_back(2);                                             \ | ||||
|     v.push_back(numeric_limits<test_type>::min());              \ | ||||
|     v.push_back(numeric_limits<test_type>::max());              \ | ||||
|     for (unsigned int i = 0; i < kLoop; i++)                    \ | ||||
|       v.push_back(rand());                                      \ | ||||
|     for (unsigned int i = 0; i < v.size() ; i++) {              \ | ||||
|       test_type val = v[i];                                     \ | ||||
|       msgpack_sbuffer sbuf;                                     \ | ||||
|       msgpack_sbuffer_init(&sbuf);                              \ | ||||
|       msgpack_packer pk;                                        \ | ||||
|       msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write);   \ | ||||
|       msgpack_pack_##func_type(&pk, val);                       \ | ||||
|       msgpack_zone z;                                           \ | ||||
|       msgpack_zone_init(&z, 2048);                              \ | ||||
|       msgpack_object obj;                                       \ | ||||
|       msgpack_unpack_return ret =                               \ | ||||
|         msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj);   \ | ||||
|       EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret);                   \ | ||||
|       EXPECT_EQ(MSGPACK_OBJECT_POSITIVE_INTEGER, obj.type);     \ | ||||
|       EXPECT_EQ(val, obj.via.u64);                              \ | ||||
|       msgpack_zone_destroy(&z);                                 \ | ||||
|       msgpack_sbuffer_destroy(&sbuf);                           \ | ||||
|     }                                                           \ | ||||
|   } while(0) | ||||
|  | ||||
| TEST(MSGPACKC, simple_buffer_short) | ||||
| { | ||||
|   GEN_TEST_SIGNED(short, short); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACKC, simple_buffer_int) | ||||
| { | ||||
|   GEN_TEST_SIGNED(int, int); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACKC, simple_buffer_long) | ||||
| { | ||||
|   GEN_TEST_SIGNED(long, long); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACKC, simple_buffer_long_long) | ||||
| { | ||||
|   GEN_TEST_SIGNED(long long, long_long); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACKC, simple_buffer_unsigned_short) | ||||
| { | ||||
|   GEN_TEST_UNSIGNED(unsigned short, unsigned_short); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACKC, simple_buffer_unsigned_int) | ||||
| { | ||||
|   GEN_TEST_UNSIGNED(unsigned int, unsigned_int); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACKC, simple_buffer_unsigned_long) | ||||
| { | ||||
|   GEN_TEST_UNSIGNED(unsigned long, unsigned_long); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACKC, simple_buffer_unsigned_long_long) | ||||
| { | ||||
|   GEN_TEST_UNSIGNED(unsigned long long, unsigned_long_long); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACKC, simple_buffer_uint8) | ||||
| { | ||||
|   GEN_TEST_UNSIGNED(uint8_t, uint8); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACKC, simple_buffer_uint16) | ||||
| { | ||||
|   GEN_TEST_UNSIGNED(uint16_t, uint16); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACKC, simple_buffer_uint32) | ||||
| { | ||||
|   GEN_TEST_UNSIGNED(uint32_t, uint32); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACKC, simple_buffer_uint64) | ||||
| { | ||||
|   GEN_TEST_UNSIGNED(uint64_t, uint64); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACKC, simple_buffer_int8) | ||||
| { | ||||
|   GEN_TEST_SIGNED(int8_t, int8); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACKC, simple_buffer_int16) | ||||
| { | ||||
|   GEN_TEST_SIGNED(int16_t, int16); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACKC, simple_buffer_int32) | ||||
| { | ||||
|   GEN_TEST_SIGNED(int32_t, int32); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACKC, simple_buffer_int64) | ||||
| { | ||||
|   GEN_TEST_SIGNED(int64_t, int64); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACKC, simple_buffer_float) | ||||
| { | ||||
|   vector<float> v; | ||||
|   v.push_back(0.0); | ||||
|   v.push_back(1.0); | ||||
|   v.push_back(-1.0); | ||||
|   v.push_back(numeric_limits<float>::min()); | ||||
|   v.push_back(numeric_limits<float>::max()); | ||||
|   v.push_back(nanf("tag")); | ||||
|   v.push_back(1.0/0.0); // inf | ||||
|   v.push_back(-(1.0/0.0)); // -inf | ||||
|   for (unsigned int i = 0; i < kLoop; i++) { | ||||
|     v.push_back(drand48()); | ||||
|     v.push_back(-drand48()); | ||||
|   } | ||||
|  | ||||
|   for (unsigned int i = 0; i < v.size() ; i++) { | ||||
|     float val = v[i]; | ||||
|     msgpack_sbuffer sbuf; | ||||
|     msgpack_sbuffer_init(&sbuf); | ||||
|     msgpack_packer pk; | ||||
|     msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write); | ||||
|     msgpack_pack_float(&pk, val); | ||||
|     msgpack_zone z; | ||||
|     msgpack_zone_init(&z, 2048); | ||||
|     msgpack_object obj; | ||||
|     msgpack_unpack_return ret = | ||||
|       msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj); | ||||
|     EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret); | ||||
|     EXPECT_EQ(MSGPACK_OBJECT_DOUBLE, obj.type); | ||||
|     if (isnan(val)) | ||||
|       EXPECT_TRUE(isnan(obj.via.dec)); | ||||
|     else if (isinf(val)) | ||||
|       EXPECT_TRUE(isinf(obj.via.dec)); | ||||
|     else | ||||
|       EXPECT_TRUE(fabs(obj.via.dec - val) <= kEPS); | ||||
|     msgpack_zone_destroy(&z); | ||||
|     msgpack_sbuffer_destroy(&sbuf); | ||||
|   } | ||||
| } | ||||
|  | ||||
| TEST(MSGPACKC, simple_buffer_double) | ||||
| { | ||||
|   vector<double> v; | ||||
|   v.push_back(0.0); | ||||
|   v.push_back(-0.0); | ||||
|   v.push_back(1.0); | ||||
|   v.push_back(-1.0); | ||||
|   v.push_back(numeric_limits<double>::min()); | ||||
|   v.push_back(numeric_limits<double>::max()); | ||||
|   v.push_back(nan("tag")); | ||||
|   v.push_back(1.0/0.0); // inf | ||||
|   v.push_back(-(1.0/0.0)); // -inf | ||||
|   for (unsigned int i = 0; i < kLoop; i++) { | ||||
|     v.push_back(drand48()); | ||||
|     v.push_back(-drand48()); | ||||
|   } | ||||
|  | ||||
|   for (unsigned int i = 0; i < v.size() ; i++) { | ||||
|     double val = v[i]; | ||||
|     msgpack_sbuffer sbuf; | ||||
|     msgpack_sbuffer_init(&sbuf); | ||||
|     msgpack_packer pk; | ||||
|     msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write); | ||||
|     msgpack_pack_double(&pk, val); | ||||
|     msgpack_zone z; | ||||
|     msgpack_zone_init(&z, 2048); | ||||
|     msgpack_object obj; | ||||
|     msgpack_unpack_return ret = | ||||
|       msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj); | ||||
|     EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret); | ||||
|     EXPECT_EQ(MSGPACK_OBJECT_DOUBLE, obj.type); | ||||
|     if (isnan(val)) | ||||
|       EXPECT_TRUE(isnan(obj.via.dec)); | ||||
|     else if (isinf(val)) | ||||
|       EXPECT_TRUE(isinf(obj.via.dec)); | ||||
|     else | ||||
|       EXPECT_TRUE(fabs(obj.via.dec - val) <= kEPS); | ||||
|     msgpack_zone_destroy(&z); | ||||
|     msgpack_sbuffer_destroy(&sbuf); | ||||
|   } | ||||
| } | ||||
|  | ||||
| TEST(MSGPACKC, simple_buffer_nil) | ||||
| { | ||||
|   msgpack_sbuffer sbuf; | ||||
|   msgpack_sbuffer_init(&sbuf); | ||||
|   msgpack_packer pk; | ||||
|   msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write); | ||||
|   msgpack_pack_nil(&pk); | ||||
|   msgpack_zone z; | ||||
|   msgpack_zone_init(&z, 2048); | ||||
|   msgpack_object obj; | ||||
|   msgpack_unpack_return ret = | ||||
|     msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj); | ||||
|   EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret); | ||||
|   EXPECT_EQ(MSGPACK_OBJECT_NIL, obj.type); | ||||
|   msgpack_zone_destroy(&z); | ||||
|   msgpack_sbuffer_destroy(&sbuf); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACKC, simple_buffer_true) | ||||
| { | ||||
|   msgpack_sbuffer sbuf; | ||||
|   msgpack_sbuffer_init(&sbuf); | ||||
|   msgpack_packer pk; | ||||
|   msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write); | ||||
|   msgpack_pack_true(&pk); | ||||
|   msgpack_zone z; | ||||
|   msgpack_zone_init(&z, 2048); | ||||
|   msgpack_object obj; | ||||
|   msgpack_unpack_return ret = | ||||
|     msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj); | ||||
|   EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret); | ||||
|   EXPECT_EQ(MSGPACK_OBJECT_BOOLEAN, obj.type); | ||||
|   EXPECT_EQ(true, obj.via.boolean); | ||||
|   msgpack_zone_destroy(&z); | ||||
|   msgpack_sbuffer_destroy(&sbuf); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACKC, simple_buffer_false) | ||||
| { | ||||
|   msgpack_sbuffer sbuf; | ||||
|   msgpack_sbuffer_init(&sbuf); | ||||
|   msgpack_packer pk; | ||||
|   msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write); | ||||
|   msgpack_pack_false(&pk); | ||||
|   msgpack_zone z; | ||||
|   msgpack_zone_init(&z, 2048); | ||||
|   msgpack_object obj; | ||||
|   msgpack_unpack_return ret = | ||||
|     msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj); | ||||
|   EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret); | ||||
|   EXPECT_EQ(MSGPACK_OBJECT_BOOLEAN, obj.type); | ||||
|   EXPECT_EQ(false, obj.via.boolean); | ||||
|   msgpack_zone_destroy(&z); | ||||
|   msgpack_sbuffer_destroy(&sbuf); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACKC, simple_buffer_array) | ||||
| { | ||||
|   unsigned int array_size = 5; | ||||
|  | ||||
|   msgpack_sbuffer sbuf; | ||||
|   msgpack_sbuffer_init(&sbuf); | ||||
|   msgpack_packer pk; | ||||
|   msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write); | ||||
|   msgpack_pack_array(&pk, array_size); | ||||
|   msgpack_pack_nil(&pk); | ||||
|   msgpack_pack_true(&pk); | ||||
|   msgpack_pack_false(&pk); | ||||
|   msgpack_pack_int(&pk, 10); | ||||
|   msgpack_pack_int(&pk, -10); | ||||
|  | ||||
|   msgpack_zone z; | ||||
|   msgpack_zone_init(&z, 2048); | ||||
|   msgpack_object obj; | ||||
|   msgpack_unpack_return ret; | ||||
|   ret = msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj); | ||||
|   EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret); | ||||
|   EXPECT_EQ(MSGPACK_OBJECT_ARRAY, obj.type); | ||||
|   EXPECT_EQ(array_size, obj.via.array.size); | ||||
|  | ||||
|   for (unsigned int i = 0; i < obj.via.array.size; i++) { | ||||
|     msgpack_object o = obj.via.array.ptr[i]; | ||||
|     switch (i) { | ||||
|     case 0: | ||||
|       EXPECT_EQ(MSGPACK_OBJECT_NIL, o.type); | ||||
|       break; | ||||
|     case 1: | ||||
|       EXPECT_EQ(MSGPACK_OBJECT_BOOLEAN, o.type); | ||||
|       EXPECT_EQ(true, o.via.boolean); | ||||
|       break; | ||||
|     case 2: | ||||
|       EXPECT_EQ(MSGPACK_OBJECT_BOOLEAN, o.type); | ||||
|       EXPECT_EQ(false, o.via.boolean); | ||||
|       break; | ||||
|     case 3: | ||||
|       EXPECT_EQ(MSGPACK_OBJECT_POSITIVE_INTEGER, o.type); | ||||
|       EXPECT_EQ(10, o.via.u64); | ||||
|       break; | ||||
|     case 4: | ||||
|       EXPECT_EQ(MSGPACK_OBJECT_NEGATIVE_INTEGER, o.type); | ||||
|       EXPECT_EQ(-10, o.via.i64); | ||||
|       break; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   msgpack_zone_destroy(&z); | ||||
|   msgpack_sbuffer_destroy(&sbuf); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACKC, simple_buffer_map) | ||||
| { | ||||
|   unsigned int map_size = 2; | ||||
|  | ||||
|   msgpack_sbuffer sbuf; | ||||
|   msgpack_sbuffer_init(&sbuf); | ||||
|   msgpack_packer pk; | ||||
|   msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write); | ||||
|   msgpack_pack_map(&pk, map_size); | ||||
|   msgpack_pack_true(&pk); | ||||
|   msgpack_pack_false(&pk); | ||||
|   msgpack_pack_int(&pk, 10); | ||||
|   msgpack_pack_int(&pk, -10); | ||||
|  | ||||
|   msgpack_zone z; | ||||
|   msgpack_zone_init(&z, 2048); | ||||
|   msgpack_object obj; | ||||
|   msgpack_unpack_return ret; | ||||
|   ret = msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj); | ||||
|   EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret); | ||||
|   EXPECT_EQ(MSGPACK_OBJECT_MAP, obj.type); | ||||
|   EXPECT_EQ(map_size, obj.via.map.size); | ||||
|  | ||||
|   for (unsigned int i = 0; i < map_size; i++) { | ||||
|     msgpack_object key = obj.via.map.ptr[i].key; | ||||
|     msgpack_object val = obj.via.map.ptr[i].val; | ||||
|     switch (i) { | ||||
|     case 0: | ||||
|       EXPECT_EQ(MSGPACK_OBJECT_BOOLEAN, key.type); | ||||
|       EXPECT_EQ(true, key.via.boolean); | ||||
|       EXPECT_EQ(MSGPACK_OBJECT_BOOLEAN, val.type); | ||||
|       EXPECT_EQ(false, val.via.boolean); | ||||
|       break; | ||||
|     case 1: | ||||
|       EXPECT_EQ(MSGPACK_OBJECT_POSITIVE_INTEGER, key.type); | ||||
|       EXPECT_EQ(10, key.via.u64); | ||||
|       EXPECT_EQ(MSGPACK_OBJECT_NEGATIVE_INTEGER, val.type); | ||||
|       EXPECT_EQ(-10, val.via.i64); | ||||
|       break; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   msgpack_zone_destroy(&z); | ||||
|   msgpack_sbuffer_destroy(&sbuf); | ||||
| } | ||||
|  | ||||
| TEST(MSGPACKC, simple_buffer_raw) | ||||
| { | ||||
|   unsigned int raw_size = 7; | ||||
|  | ||||
|   msgpack_sbuffer sbuf; | ||||
|   msgpack_sbuffer_init(&sbuf); | ||||
|   msgpack_packer pk; | ||||
|   msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write); | ||||
|   msgpack_pack_raw(&pk, raw_size); | ||||
|   msgpack_pack_raw_body(&pk, "fr", 2); | ||||
|   msgpack_pack_raw_body(&pk, "syuki", 5); | ||||
|   // invalid data | ||||
|   msgpack_pack_raw_body(&pk, "", 0); | ||||
|   msgpack_pack_raw_body(&pk, "kzk", 0); | ||||
|  | ||||
|   msgpack_zone z; | ||||
|   msgpack_zone_init(&z, 2048); | ||||
|   msgpack_object obj; | ||||
|   msgpack_unpack_return ret; | ||||
|   ret = msgpack_unpack(sbuf.data, sbuf.size, NULL, &z, &obj); | ||||
|   EXPECT_EQ(MSGPACK_UNPACK_SUCCESS, ret); | ||||
|   EXPECT_EQ(MSGPACK_OBJECT_RAW, obj.type); | ||||
|   EXPECT_EQ(raw_size, obj.via.raw.size); | ||||
|   EXPECT_EQ(0, memcmp("frsyuki", obj.via.raw.ptr, raw_size)); | ||||
|  | ||||
|   msgpack_zone_destroy(&z); | ||||
|   msgpack_sbuffer_destroy(&sbuf); | ||||
| } | ||||
| @@ -1,134 +0,0 @@ | ||||
| #include <msgpack.hpp> | ||||
| #include <gtest/gtest.h> | ||||
|  | ||||
| struct myclass { | ||||
| 	myclass() : num(0), str("default") { } | ||||
|  | ||||
| 	myclass(int num, const std::string& str) : | ||||
| 		num(0), str("default") { } | ||||
|  | ||||
| 	~myclass() { } | ||||
|  | ||||
| 	int num; | ||||
| 	std::string str; | ||||
|  | ||||
| 	MSGPACK_DEFINE(num, str); | ||||
|  | ||||
| 	bool operator==(const myclass& o) const | ||||
| 	{ | ||||
| 		return num == o.num && str == o.str; | ||||
| 	} | ||||
| }; | ||||
|  | ||||
| std::ostream& operator<<(std::ostream& o, const myclass& m) | ||||
| { | ||||
| 	return o << "myclass("<<m.num<<",\""<<m.str<<"\")"; | ||||
| } | ||||
|  | ||||
|  | ||||
| TEST(object, convert) | ||||
| { | ||||
| 	myclass m1; | ||||
|  | ||||
| 	msgpack::sbuffer sbuf; | ||||
| 	msgpack::pack(sbuf, m1); | ||||
|  | ||||
| 	msgpack::zone z; | ||||
| 	msgpack::object obj; | ||||
|  | ||||
| 	msgpack::unpack_return ret = | ||||
| 		msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj); | ||||
| 	EXPECT_EQ(ret, msgpack::UNPACK_SUCCESS); | ||||
|  | ||||
| 	myclass m2; | ||||
| 	obj.convert(&m2); | ||||
|  | ||||
| 	EXPECT_EQ(m1, m2); | ||||
| } | ||||
|  | ||||
|  | ||||
| TEST(object, as) | ||||
| { | ||||
| 	myclass m1; | ||||
|  | ||||
| 	msgpack::sbuffer sbuf; | ||||
| 	msgpack::pack(sbuf, m1); | ||||
|  | ||||
| 	msgpack::zone z; | ||||
| 	msgpack::object obj; | ||||
|  | ||||
| 	msgpack::unpack_return ret = | ||||
| 		msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj); | ||||
| 	EXPECT_EQ(ret, msgpack::UNPACK_SUCCESS); | ||||
|  | ||||
| 	EXPECT_EQ(m1, obj.as<myclass>()); | ||||
| } | ||||
|  | ||||
|  | ||||
| TEST(object, print) | ||||
| { | ||||
| 	msgpack::object obj; | ||||
| 	std::cout << obj << std::endl; | ||||
| } | ||||
|  | ||||
|  | ||||
| TEST(object, is_nil) | ||||
| { | ||||
| 	msgpack::object obj; | ||||
| 	EXPECT_TRUE(obj.is_nil()); | ||||
| } | ||||
|  | ||||
|  | ||||
| TEST(object, type_error) | ||||
| { | ||||
| 	msgpack::object obj(1); | ||||
| 	EXPECT_THROW(obj.as<std::string>(), msgpack::type_error); | ||||
| 	EXPECT_THROW(obj.as<std::vector<int> >(), msgpack::type_error); | ||||
| 	EXPECT_EQ(1, obj.as<int>()); | ||||
| 	EXPECT_EQ(1, obj.as<short>()); | ||||
| 	EXPECT_EQ(1u, obj.as<unsigned int>()); | ||||
| 	EXPECT_EQ(1u, obj.as<unsigned long>()); | ||||
| } | ||||
|  | ||||
|  | ||||
| TEST(object, equal_primitive) | ||||
| { | ||||
| 	msgpack::object obj_nil; | ||||
| 	EXPECT_EQ(obj_nil, msgpack::object()); | ||||
|  | ||||
| 	msgpack::object obj_int(1); | ||||
| 	EXPECT_EQ(obj_int, msgpack::object(1)); | ||||
| 	EXPECT_EQ(obj_int, 1); | ||||
|  | ||||
| 	msgpack::object obj_double(1.2); | ||||
| 	EXPECT_EQ(obj_double, msgpack::object(1.2)); | ||||
| 	EXPECT_EQ(obj_double, 1.2); | ||||
|  | ||||
| 	msgpack::object obj_bool(true); | ||||
| 	EXPECT_EQ(obj_bool, msgpack::object(true)); | ||||
| 	EXPECT_EQ(obj_bool, true); | ||||
| } | ||||
|  | ||||
|  | ||||
| TEST(object, construct_primitive) | ||||
| { | ||||
| 	msgpack::object obj_nil; | ||||
| 	EXPECT_EQ(msgpack::type::NIL, obj_nil.type); | ||||
|  | ||||
| 	msgpack::object obj_uint(1); | ||||
| 	EXPECT_EQ(msgpack::type::POSITIVE_INTEGER, obj_uint.type); | ||||
| 	EXPECT_EQ(1u, obj_uint.via.u64); | ||||
|  | ||||
| 	msgpack::object obj_int(-1); | ||||
| 	EXPECT_EQ(msgpack::type::NEGATIVE_INTEGER, obj_int.type); | ||||
| 	EXPECT_EQ(-1, obj_int.via.i64); | ||||
|  | ||||
| 	msgpack::object obj_double(1.2); | ||||
| 	EXPECT_EQ(msgpack::type::DOUBLE, obj_double.type); | ||||
| 	EXPECT_EQ(1.2, obj_double.via.dec); | ||||
|  | ||||
| 	msgpack::object obj_bool(true); | ||||
| 	EXPECT_EQ(msgpack::type::BOOLEAN, obj_bool.type); | ||||
| 	EXPECT_EQ(true, obj_bool.via.boolean); | ||||
| } | ||||
|  | ||||
| @@ -1,123 +0,0 @@ | ||||
| #include <msgpack.hpp> | ||||
| #include <gtest/gtest.h> | ||||
| #include <sstream> | ||||
|  | ||||
| TEST(pack, num) | ||||
| { | ||||
| 	msgpack::sbuffer sbuf; | ||||
| 	msgpack::pack(sbuf, 1); | ||||
| } | ||||
|  | ||||
|  | ||||
| TEST(pack, vector) | ||||
| { | ||||
| 	msgpack::sbuffer sbuf; | ||||
| 	std::vector<int> vec; | ||||
| 	vec.push_back(1); | ||||
| 	vec.push_back(2); | ||||
| 	vec.push_back(3); | ||||
| 	msgpack::pack(sbuf, vec); | ||||
| } | ||||
|  | ||||
|  | ||||
| TEST(pack, to_ostream) | ||||
| { | ||||
| 	std::ostringstream stream; | ||||
| 	msgpack::pack(stream, 1); | ||||
| } | ||||
|  | ||||
|  | ||||
| struct myclass { | ||||
| 	myclass() : num(0), str("default") { } | ||||
|  | ||||
| 	myclass(int num, const std::string& str) : | ||||
| 		num(0), str("default") { } | ||||
|  | ||||
| 	~myclass() { } | ||||
|  | ||||
| 	int num; | ||||
| 	std::string str; | ||||
|  | ||||
| 	MSGPACK_DEFINE(num, str); | ||||
| }; | ||||
|  | ||||
|  | ||||
| TEST(pack, myclass) | ||||
| { | ||||
| 	msgpack::sbuffer sbuf; | ||||
| 	myclass m(1, "msgpack"); | ||||
| 	msgpack::pack(sbuf, m); | ||||
| } | ||||
|  | ||||
|  | ||||
| TEST(unpack, myclass) | ||||
| { | ||||
| 	msgpack::sbuffer sbuf; | ||||
| 	myclass m1(1, "phraser"); | ||||
| 	msgpack::pack(sbuf, m1); | ||||
|  | ||||
| 	msgpack::zone z; | ||||
| 	msgpack::object obj; | ||||
|  | ||||
| 	msgpack::unpack_return ret = | ||||
| 		msgpack::unpack(sbuf.data(), sbuf.size(), NULL, &z, &obj); | ||||
|  | ||||
| 	EXPECT_EQ(ret, msgpack::UNPACK_SUCCESS); | ||||
|  | ||||
| 	myclass m2 = obj.as<myclass>(); | ||||
| 	EXPECT_EQ(m1.num, m2.num); | ||||
| 	EXPECT_EQ(m1.str, m2.str); | ||||
| } | ||||
|  | ||||
|  | ||||
| TEST(unpack, sequence) | ||||
| { | ||||
| 	msgpack::sbuffer sbuf; | ||||
| 	msgpack::pack(sbuf, 1); | ||||
| 	msgpack::pack(sbuf, 2); | ||||
| 	msgpack::pack(sbuf, 3); | ||||
|  | ||||
| 	size_t offset = 0; | ||||
|  | ||||
| 	msgpack::unpacked msg; | ||||
|  | ||||
| 	msgpack::unpack(&msg, sbuf.data(), sbuf.size(), &offset); | ||||
| 	EXPECT_EQ(1, msg.get().as<int>()); | ||||
|  | ||||
| 	msgpack::unpack(&msg, sbuf.data(), sbuf.size(), &offset); | ||||
| 	EXPECT_EQ(2, msg.get().as<int>()); | ||||
|  | ||||
| 	msgpack::unpack(&msg, sbuf.data(), sbuf.size(), &offset); | ||||
| 	EXPECT_EQ(3, msg.get().as<int>()); | ||||
| } | ||||
|  | ||||
|  | ||||
| TEST(unpack, sequence_compat) | ||||
| { | ||||
| 	msgpack::sbuffer sbuf; | ||||
| 	msgpack::pack(sbuf, 1); | ||||
| 	msgpack::pack(sbuf, 2); | ||||
| 	msgpack::pack(sbuf, 3); | ||||
|  | ||||
| 	size_t offset = 0; | ||||
|  | ||||
| 	msgpack::zone z; | ||||
| 	msgpack::object obj; | ||||
| 	msgpack::unpack_return ret; | ||||
|  | ||||
| 	ret = msgpack::unpack(sbuf.data(), sbuf.size(), &offset, &z, &obj); | ||||
| 	EXPECT_TRUE(ret >= 0); | ||||
| 	EXPECT_EQ(ret, msgpack::UNPACK_EXTRA_BYTES); | ||||
| 	EXPECT_EQ(1, obj.as<int>()); | ||||
|  | ||||
| 	ret = msgpack::unpack(sbuf.data(), sbuf.size(), &offset, &z, &obj); | ||||
| 	EXPECT_TRUE(ret >= 0); | ||||
| 	EXPECT_EQ(ret, msgpack::UNPACK_EXTRA_BYTES); | ||||
| 	EXPECT_EQ(2, obj.as<int>()); | ||||
|  | ||||
| 	ret = msgpack::unpack(sbuf.data(), sbuf.size(), &offset, &z, &obj); | ||||
| 	EXPECT_TRUE(ret >= 0); | ||||
| 	EXPECT_EQ(ret, msgpack::UNPACK_SUCCESS); | ||||
| 	EXPECT_EQ(3, obj.as<int>()); | ||||
| } | ||||
|  | ||||
| @@ -1,70 +0,0 @@ | ||||
| #include <msgpack.h> | ||||
| #include <gtest/gtest.h> | ||||
| #include <stdio.h> | ||||
|  | ||||
| TEST(pack, num) | ||||
| { | ||||
| 	msgpack_sbuffer* sbuf = msgpack_sbuffer_new(); | ||||
| 	msgpack_packer* pk = msgpack_packer_new(sbuf, msgpack_sbuffer_write); | ||||
|  | ||||
| 	EXPECT_EQ(0, msgpack_pack_int(pk, 1)); | ||||
|  | ||||
| 	msgpack_sbuffer_free(sbuf); | ||||
| 	msgpack_packer_free(pk); | ||||
| } | ||||
|  | ||||
|  | ||||
| TEST(pack, array) | ||||
| { | ||||
| 	msgpack_sbuffer* sbuf = msgpack_sbuffer_new(); | ||||
| 	msgpack_packer* pk = msgpack_packer_new(sbuf, msgpack_sbuffer_write); | ||||
|  | ||||
| 	EXPECT_EQ(0, msgpack_pack_array(pk, 3)); | ||||
| 	EXPECT_EQ(0, msgpack_pack_int(pk, 1)); | ||||
| 	EXPECT_EQ(0, msgpack_pack_int(pk, 2)); | ||||
| 	EXPECT_EQ(0, msgpack_pack_int(pk, 3)); | ||||
|  | ||||
| 	msgpack_sbuffer_free(sbuf); | ||||
| 	msgpack_packer_free(pk); | ||||
| } | ||||
|  | ||||
|  | ||||
| TEST(unpack, sequence) | ||||
| { | ||||
| 	msgpack_sbuffer* sbuf = msgpack_sbuffer_new(); | ||||
| 	msgpack_packer* pk = msgpack_packer_new(sbuf, msgpack_sbuffer_write); | ||||
|  | ||||
| 	EXPECT_EQ(0, msgpack_pack_int(pk, 1)); | ||||
| 	EXPECT_EQ(0, msgpack_pack_int(pk, 2)); | ||||
| 	EXPECT_EQ(0, msgpack_pack_int(pk, 3)); | ||||
|  | ||||
| 	msgpack_packer_free(pk); | ||||
|  | ||||
| 	bool success; | ||||
| 	size_t offset = 0; | ||||
|  | ||||
| 	msgpack_unpacked msg; | ||||
| 	msgpack_unpacked_init(&msg); | ||||
|  | ||||
| 	success = msgpack_unpack_next(&msg, sbuf->data, sbuf->size, &offset); | ||||
| 	EXPECT_TRUE(success); | ||||
| 	EXPECT_EQ(MSGPACK_OBJECT_POSITIVE_INTEGER, msg.data.type); | ||||
| 	EXPECT_EQ(1, msg.data.via.u64); | ||||
|  | ||||
| 	success = msgpack_unpack_next(&msg, sbuf->data, sbuf->size, &offset); | ||||
| 	EXPECT_TRUE(success); | ||||
| 	EXPECT_EQ(MSGPACK_OBJECT_POSITIVE_INTEGER, msg.data.type); | ||||
| 	EXPECT_EQ(2, msg.data.via.u64); | ||||
|  | ||||
| 	success = msgpack_unpack_next(&msg, sbuf->data, sbuf->size, &offset); | ||||
| 	EXPECT_TRUE(success); | ||||
| 	EXPECT_EQ(MSGPACK_OBJECT_POSITIVE_INTEGER, msg.data.type); | ||||
| 	EXPECT_EQ(3, msg.data.via.u64); | ||||
|  | ||||
| 	success = msgpack_unpack_next(&msg, sbuf->data, sbuf->size, &offset); | ||||
| 	EXPECT_FALSE(success); | ||||
|  | ||||
| 	msgpack_sbuffer_free(sbuf); | ||||
| 	msgpack_unpacked_destroy(&msg); | ||||
| } | ||||
|  | ||||
| @@ -1,220 +0,0 @@ | ||||
| #include <msgpack.hpp> | ||||
| #include <gtest/gtest.h> | ||||
| #include <sstream> | ||||
|  | ||||
| TEST(streaming, basic) | ||||
| { | ||||
| 	msgpack::sbuffer buffer; | ||||
|  | ||||
| 	msgpack::packer<msgpack::sbuffer> pk(&buffer); | ||||
| 	pk.pack(1); | ||||
| 	pk.pack(2); | ||||
| 	pk.pack(3); | ||||
|  | ||||
| 	const char* input = buffer.data(); | ||||
| 	const char* const eof = input + buffer.size(); | ||||
|  | ||||
| 	msgpack::unpacker pac; | ||||
| 	msgpack::unpacked result; | ||||
|  | ||||
| 	int count = 0; | ||||
| 	while(count < 3) { | ||||
| 		pac.reserve_buffer(32*1024); | ||||
|  | ||||
| 		// read buffer into pac.buffer() upto | ||||
| 		// pac.buffer_capacity() bytes. | ||||
| 		size_t len = 1; | ||||
| 		memcpy(pac.buffer(), input, len); | ||||
| 		input += len; | ||||
|  | ||||
| 		pac.buffer_consumed(len); | ||||
|  | ||||
| 		while(pac.next(&result)) { | ||||
| 			msgpack::object obj = result.get(); | ||||
| 			switch(count++) { | ||||
| 			case 0: | ||||
| 				EXPECT_EQ(1, obj.as<int>()); | ||||
| 				break; | ||||
| 			case 1: | ||||
| 				EXPECT_EQ(2, obj.as<int>()); | ||||
| 				break; | ||||
| 			case 2: | ||||
| 				EXPECT_EQ(3, obj.as<int>()); | ||||
| 				return; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		EXPECT_TRUE(input < eof); | ||||
| 	} | ||||
| } | ||||
|  | ||||
|  | ||||
| class event_handler { | ||||
| public: | ||||
| 	event_handler(std::istream& input) : input(input) { } | ||||
| 	~event_handler() { } | ||||
|  | ||||
| 	void on_read() | ||||
| 	{ | ||||
| 		while(true) { | ||||
| 			pac.reserve_buffer(32*1024); | ||||
|  | ||||
| 			size_t len = input.readsome(pac.buffer(), pac.buffer_capacity()); | ||||
|  | ||||
| 			if(len == 0) { | ||||
| 				return; | ||||
| 			} | ||||
|  | ||||
| 			pac.buffer_consumed(len); | ||||
|  | ||||
| 			msgpack::unpacked result; | ||||
| 			while(pac.next(&result)) { | ||||
| 				on_message(result.get(), result.zone()); | ||||
| 			} | ||||
|  | ||||
| 			if(pac.message_size() > 10*1024*1024) { | ||||
| 				throw std::runtime_error("message is too large"); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	void on_message(msgpack::object obj, std::auto_ptr<msgpack::zone> z) | ||||
| 	{ | ||||
| 		EXPECT_EQ(expect, obj.as<int>()); | ||||
| 	} | ||||
|  | ||||
| 	int expect; | ||||
|  | ||||
| private: | ||||
| 	std::istream& input; | ||||
| 	msgpack::unpacker pac; | ||||
| }; | ||||
|  | ||||
| TEST(streaming, event) | ||||
| { | ||||
| 	std::stringstream stream; | ||||
| 	msgpack::packer<std::ostream> pk(&stream); | ||||
|  | ||||
| 	event_handler handler(stream); | ||||
|  | ||||
| 	pk.pack(1); | ||||
| 	handler.expect = 1; | ||||
| 	handler.on_read(); | ||||
|  | ||||
| 	pk.pack(2); | ||||
| 	handler.expect = 2; | ||||
| 	handler.on_read(); | ||||
|  | ||||
| 	pk.pack(3); | ||||
| 	handler.expect = 3; | ||||
| 	handler.on_read(); | ||||
| } | ||||
|  | ||||
|  | ||||
| // backward compatibility | ||||
| TEST(streaming, basic_compat) | ||||
| { | ||||
| 	std::ostringstream stream; | ||||
| 	msgpack::packer<std::ostream> pk(&stream); | ||||
|  | ||||
| 	pk.pack(1); | ||||
| 	pk.pack(2); | ||||
| 	pk.pack(3); | ||||
|  | ||||
| 	std::istringstream input(stream.str()); | ||||
|  | ||||
| 	msgpack::unpacker pac; | ||||
|  | ||||
| 	int count = 0; | ||||
| 	while(count < 3) { | ||||
| 		pac.reserve_buffer(32*1024); | ||||
|  | ||||
| 		size_t len = input.readsome(pac.buffer(), pac.buffer_capacity()); | ||||
| 		pac.buffer_consumed(len); | ||||
|  | ||||
| 		while(pac.execute()) { | ||||
| 			std::auto_ptr<msgpack::zone> z(pac.release_zone()); | ||||
| 			msgpack::object obj = pac.data(); | ||||
| 			pac.reset(); | ||||
|  | ||||
| 			switch(count++) { | ||||
| 			case 0: | ||||
| 				EXPECT_EQ(1, obj.as<int>()); | ||||
| 				break; | ||||
| 			case 1: | ||||
| 				EXPECT_EQ(2, obj.as<int>()); | ||||
| 				break; | ||||
| 			case 2: | ||||
| 				EXPECT_EQ(3, obj.as<int>()); | ||||
| 				return; | ||||
| 			} | ||||
|  | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
|  | ||||
| // backward compatibility | ||||
| class event_handler_compat { | ||||
| public: | ||||
| 	event_handler_compat(std::istream& input) : input(input) { } | ||||
| 	~event_handler_compat() { } | ||||
|  | ||||
| 	void on_read() | ||||
| 	{ | ||||
| 		while(true) { | ||||
| 			pac.reserve_buffer(32*1024); | ||||
|  | ||||
| 			size_t len = input.readsome(pac.buffer(), pac.buffer_capacity()); | ||||
|  | ||||
| 			if(len == 0) { | ||||
| 				return; | ||||
| 			} | ||||
|  | ||||
| 			pac.buffer_consumed(len); | ||||
|  | ||||
| 			while(pac.execute()) { | ||||
| 				std::auto_ptr<msgpack::zone> z(pac.release_zone()); | ||||
| 				msgpack::object obj = pac.data(); | ||||
| 				pac.reset(); | ||||
| 				on_message(obj, z); | ||||
| 			} | ||||
|  | ||||
| 			if(pac.message_size() > 10*1024*1024) { | ||||
| 				throw std::runtime_error("message is too large"); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	void on_message(msgpack::object obj, std::auto_ptr<msgpack::zone> z) | ||||
| 	{ | ||||
| 		EXPECT_EQ(expect, obj.as<int>()); | ||||
| 	} | ||||
|  | ||||
| 	int expect; | ||||
|  | ||||
| private: | ||||
| 	std::istream& input; | ||||
| 	msgpack::unpacker pac; | ||||
| }; | ||||
|  | ||||
| TEST(streaming, event_compat) | ||||
| { | ||||
| 	std::stringstream stream; | ||||
| 	msgpack::packer<std::ostream> pk(&stream); | ||||
|  | ||||
| 	event_handler_compat handler(stream); | ||||
|  | ||||
| 	pk.pack(1); | ||||
| 	handler.expect = 1; | ||||
| 	handler.on_read(); | ||||
|  | ||||
| 	pk.pack(2); | ||||
| 	handler.expect = 2; | ||||
| 	handler.on_read(); | ||||
|  | ||||
| 	pk.pack(3); | ||||
| 	handler.expect = 3; | ||||
| 	handler.on_read(); | ||||
| } | ||||
|  | ||||
| @@ -1,57 +0,0 @@ | ||||
| #include <msgpack.h> | ||||
| #include <gtest/gtest.h> | ||||
| #include <stdio.h> | ||||
|  | ||||
| TEST(streaming, basic) | ||||
| { | ||||
| 	msgpack_sbuffer* buffer = msgpack_sbuffer_new(); | ||||
|  | ||||
| 	msgpack_packer* pk = msgpack_packer_new(buffer, msgpack_sbuffer_write); | ||||
| 	EXPECT_EQ(0, msgpack_pack_int(pk, 1)); | ||||
| 	EXPECT_EQ(0, msgpack_pack_int(pk, 2)); | ||||
| 	EXPECT_EQ(0, msgpack_pack_int(pk, 3)); | ||||
| 	msgpack_packer_free(pk); | ||||
|  | ||||
| 	const char* input = buffer->data; | ||||
| 	const char* const eof = input + buffer->size; | ||||
|  | ||||
| 	msgpack_unpacker pac; | ||||
| 	msgpack_unpacker_init(&pac, MSGPACK_UNPACKER_INIT_BUFFER_SIZE); | ||||
|  | ||||
| 	msgpack_unpacked result; | ||||
| 	msgpack_unpacked_init(&result); | ||||
|  | ||||
| 	int count = 0; | ||||
| 	while(count < 3) { | ||||
| 		msgpack_unpacker_reserve_buffer(&pac, 32*1024); | ||||
|  | ||||
| 		/* read buffer into msgpack_unapcker_buffer(&pac) upto | ||||
| 		 * msgpack_unpacker_buffer_capacity(&pac) bytes. */ | ||||
| 		size_t len = 1; | ||||
| 		memcpy(msgpack_unpacker_buffer(&pac), input, len); | ||||
| 		input += len; | ||||
|  | ||||
| 		msgpack_unpacker_buffer_consumed(&pac, len); | ||||
|  | ||||
| 		while(msgpack_unpacker_next(&pac, &result)) { | ||||
| 			msgpack_object obj = result.data; | ||||
| 			switch(count++) { | ||||
| 			case 0: | ||||
| 				EXPECT_EQ(MSGPACK_OBJECT_POSITIVE_INTEGER, result.data.type); | ||||
| 				EXPECT_EQ(1, result.data.via.u64); | ||||
| 				break; | ||||
| 			case 1: | ||||
| 				EXPECT_EQ(MSGPACK_OBJECT_POSITIVE_INTEGER, result.data.type); | ||||
| 				EXPECT_EQ(2, result.data.via.u64); | ||||
| 				break; | ||||
| 			case 2: | ||||
| 				EXPECT_EQ(MSGPACK_OBJECT_POSITIVE_INTEGER, result.data.type); | ||||
| 				EXPECT_EQ(3, result.data.via.u64); | ||||
| 				return; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		EXPECT_TRUE(input < eof); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @@ -1,13 +0,0 @@ | ||||
| #include <msgpack.hpp> | ||||
| #include <gtest/gtest.h> | ||||
|  | ||||
| TEST(version, print) | ||||
| { | ||||
| 	printf("MSGPACK_VERSION          : %s\n", MSGPACK_VERSION); | ||||
| 	printf("MSGPACK_VERSION_MAJOR    : %d\n", MSGPACK_VERSION_MAJOR); | ||||
| 	printf("MSGPACK_VERSION_MINOR    : %d\n", MSGPACK_VERSION_MINOR); | ||||
| 	printf("msgpack_version()        : %s\n", msgpack_version()); | ||||
| 	printf("msgpack_version_major()  : %d\n", msgpack_version_major()); | ||||
| 	printf("msgpack_version_minor()  : %d\n", msgpack_version_minor()); | ||||
| } | ||||
|  | ||||
| @@ -1,78 +0,0 @@ | ||||
| #include <msgpack.hpp> | ||||
| #include <gtest/gtest.h> | ||||
|  | ||||
| TEST(zone, malloc) | ||||
| { | ||||
| 	msgpack::zone z; | ||||
| 	char* buf1 = (char*)z.malloc(4); | ||||
| 	memcpy(buf1, "test", 4); | ||||
| 	char* buf2 = (char*)z.malloc(4); | ||||
| 	memcpy(buf2, "test", 4); | ||||
| } | ||||
|  | ||||
|  | ||||
| class myclass { | ||||
| public: | ||||
| 	myclass() : num(0), str("default") { } | ||||
|  | ||||
| 	myclass(int num, const std::string& str) : | ||||
| 		num(num), str(str) { } | ||||
|  | ||||
| 	~myclass() { } | ||||
|  | ||||
| 	int num; | ||||
| 	std::string str; | ||||
|  | ||||
| private: | ||||
| 	myclass(const myclass&); | ||||
| }; | ||||
|  | ||||
|  | ||||
| TEST(zone, allocate) | ||||
| { | ||||
| 	msgpack::zone z; | ||||
| 	myclass* m = z.allocate<myclass>(); | ||||
| 	EXPECT_EQ(m->num, 0); | ||||
| 	EXPECT_EQ(m->str, "default"); | ||||
| } | ||||
|  | ||||
|  | ||||
| TEST(zone, allocate_constructor) | ||||
| { | ||||
| 	msgpack::zone z; | ||||
| 	myclass* m = z.allocate<myclass>(7, "msgpack"); | ||||
| 	EXPECT_EQ(m->num, 7); | ||||
| 	EXPECT_EQ(m->str, "msgpack"); | ||||
| } | ||||
|  | ||||
|  | ||||
| static void custom_finalizer_func(void* user) | ||||
| { | ||||
| 	myclass* m = (myclass*)user; | ||||
| 	delete m; | ||||
| } | ||||
|  | ||||
| TEST(zone, push_finalizer) | ||||
| { | ||||
| 	msgpack::zone z; | ||||
| 	myclass* m = new myclass(); | ||||
| 	z.push_finalizer(custom_finalizer_func, (void*)m); | ||||
| } | ||||
|  | ||||
|  | ||||
| TEST(zone, push_finalizer_auto_ptr) | ||||
| { | ||||
| 	msgpack::zone z; | ||||
| 	std::auto_ptr<myclass> am(new myclass()); | ||||
| 	z.push_finalizer(am); | ||||
| } | ||||
|  | ||||
|  | ||||
| TEST(zone, malloc_no_align) | ||||
| { | ||||
| 	msgpack::zone z; | ||||
| 	char* buf1 = (char*)z.malloc_no_align(4); | ||||
| 	char* buf2 = (char*)z.malloc_no_align(4); | ||||
| 	EXPECT_EQ(buf1+4, buf2); | ||||
| } | ||||
|  | ||||
							
								
								
									
										173
									
								
								erb/cpp03_define_array.hpp.erb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										173
									
								
								erb/cpp03_define_array.hpp.erb
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,173 @@ | ||||
| // | ||||
| // MessagePack for C++ static resolution routine | ||||
| // | ||||
| // Copyright (C) 2008-2009 FURUHASHI Sadayuki | ||||
| // | ||||
| //    Distributed under the Boost Software License, Version 1.0. | ||||
| //    (See accompanying file LICENSE_1_0.txt or copy at | ||||
| //    http://www.boost.org/LICENSE_1_0.txt) | ||||
| // | ||||
| #ifndef MSGPACK_CPP03_DEFINE_ARRAY_HPP | ||||
| #define MSGPACK_CPP03_DEFINE_ARRAY_HPP | ||||
|  | ||||
| #include "msgpack/versioning.hpp" | ||||
| #include "msgpack/adaptor/msgpack_tuple.hpp" | ||||
| #include "msgpack/adaptor/adaptor_base.hpp" | ||||
| #include "msgpack/object_fwd.hpp" | ||||
|  | ||||
| #define MSGPACK_DEFINE_ARRAY(...) \ | ||||
|     template <typename Packer> \ | ||||
|     void msgpack_pack(Packer& pk) const \ | ||||
|     { \ | ||||
|         msgpack::type::make_define_array(__VA_ARGS__).msgpack_pack(pk); \ | ||||
|     } \ | ||||
|     void msgpack_unpack(msgpack::object const& o) \ | ||||
|     { \ | ||||
|         msgpack::type::make_define_array(__VA_ARGS__).msgpack_unpack(o); \ | ||||
|     }\ | ||||
|     template <typename MSGPACK_OBJECT> \ | ||||
|     void msgpack_object(MSGPACK_OBJECT* o, msgpack::zone& z) const \ | ||||
|     { \ | ||||
|         msgpack::type::make_define_array(__VA_ARGS__).msgpack_object(o, z); \ | ||||
|     } | ||||
|  | ||||
| #define MSGPACK_BASE_ARRAY(base) (*const_cast<base *>(static_cast<base const*>(this))) | ||||
|  | ||||
| // MSGPACK_ADD_ENUM must be used in the global namespace. | ||||
| #define MSGPACK_ADD_ENUM(enum_name) \ | ||||
|   namespace msgpack { \ | ||||
|   /** @cond */ \ | ||||
|   MSGPACK_API_VERSION_NAMESPACE(v1) { \ | ||||
|   /** @endcond */ \ | ||||
|   namespace adaptor { \ | ||||
|     template<> \ | ||||
|     struct convert<enum_name> { \ | ||||
|       msgpack::object const& operator()(msgpack::object const& o, enum_name& v) const {\ | ||||
|         int tmp; \ | ||||
|         o >> tmp; \ | ||||
|         v = static_cast<enum_name>(tmp); \ | ||||
|         return o; \ | ||||
|       } \ | ||||
|     }; \ | ||||
|     template<> \ | ||||
|     struct object<enum_name> { \ | ||||
|       void operator()(msgpack::object& o, const enum_name& v) const {\ | ||||
|         o << static_cast<int>(v); \ | ||||
|       } \ | ||||
|     }; \ | ||||
|     template<> \ | ||||
|     struct object_with_zone<enum_name> { \ | ||||
|       void operator()(msgpack::object::with_zone& o, const enum_name& v) const { \ | ||||
|         o << static_cast<int>(v); \ | ||||
|       } \ | ||||
|     }; \ | ||||
|     template<> \ | ||||
|     struct pack<enum_name> { \ | ||||
|       template <typename Stream> \ | ||||
|       msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const enum_name& v) const { \ | ||||
|         return o << static_cast<int>(v); \ | ||||
|       } \ | ||||
|     }; \ | ||||
|   } \ | ||||
|   /** @cond */ \ | ||||
|   } \ | ||||
|   /** @endcond */ \ | ||||
|   } | ||||
|  | ||||
| namespace msgpack { | ||||
| /// @cond | ||||
| MSGPACK_API_VERSION_NAMESPACE(v1) { | ||||
| /// @endcond | ||||
| namespace type { | ||||
|  | ||||
| /// @cond | ||||
| <% GENERATION_LIMIT = 31 %> | ||||
| template <typename A0 = void<%1.upto(GENERATION_LIMIT+1) {|i|%>, typename A<%=i%> = void<%}%>> | ||||
| struct define_array; | ||||
| /// @endcond | ||||
|  | ||||
| template <> | ||||
| struct define_array<> { | ||||
|     typedef define_array<> value_type; | ||||
|     typedef tuple<> tuple_type; | ||||
|     template <typename Packer> | ||||
|     void msgpack_pack(Packer& pk) const | ||||
|     { | ||||
|         pk.pack_array(0); | ||||
|     } | ||||
|     void msgpack_unpack(msgpack::object const& o) | ||||
|     { | ||||
|         if(o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); } | ||||
|     } | ||||
|     void msgpack_object(msgpack::object* o, msgpack::zone&) const | ||||
|     { | ||||
|         o->type = msgpack::type::ARRAY; | ||||
|         o->via.array.ptr = nullptr; | ||||
|         o->via.array.size = 0; | ||||
|     } | ||||
| }; | ||||
|  | ||||
| /// @cond | ||||
| <%0.upto(GENERATION_LIMIT) {|i|%> | ||||
| template <typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>> | ||||
| struct define_array<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> { | ||||
|     typedef define_array<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> value_type; | ||||
|     typedef tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> tuple_type; | ||||
|     define_array(A0& _a0<%1.upto(i) {|j|%>, A<%=j%>& _a<%=j%><%}%>) : | ||||
|         a0(_a0)<%1.upto(i) {|j|%>, a<%=j%>(_a<%=j%>)<%}%> {} | ||||
|     template <typename Packer> | ||||
|     void msgpack_pack(Packer& pk) const | ||||
|     { | ||||
|         pk.pack_array(<%=i+1%>); | ||||
|         <%0.upto(i) {|j|%> | ||||
|         pk.pack(a<%=j%>);<%}%> | ||||
|     } | ||||
|     void msgpack_unpack(msgpack::object const& o) | ||||
|     { | ||||
|         if(o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); } | ||||
|         const size_t size = o.via.array.size; | ||||
|         if(size > 0) { | ||||
|             msgpack::object *ptr = o.via.array.ptr; | ||||
|             switch(size) { | ||||
|             default:<%(i).downto(0) {|j|%> | ||||
|             case <%=j+1%>: ptr[<%=j%>].convert(a<%=j%>);<%}%> | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     void msgpack_object(msgpack::object* o, msgpack::zone& z) const | ||||
|     { | ||||
|         o->type = msgpack::type::ARRAY; | ||||
|         o->via.array.ptr = static_cast<msgpack::object*>(z.allocate_align(sizeof(msgpack::object)*<%=i+1%>)); | ||||
|         o->via.array.size = <%=i+1%>; | ||||
|         <%0.upto(i) {|j|%> | ||||
|         o->via.array.ptr[<%=j%>] = msgpack::object(a<%=j%>, z);<%}%> | ||||
|     } | ||||
|     <%0.upto(i) {|j|%> | ||||
|     A<%=j%>& a<%=j%>;<%}%> | ||||
| }; | ||||
| <%}%> | ||||
| /// @endcond | ||||
|  | ||||
| inline define_array<> make_define_array() | ||||
| { | ||||
|     return define_array<>(); | ||||
| } | ||||
|  | ||||
| /// @cond | ||||
| <%0.upto(GENERATION_LIMIT) {|i|%> | ||||
| template <typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>> | ||||
| inline define_array<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> make_define_array(A0& a0<%1.upto(i) {|j|%>, A<%=j%>& a<%=j%><%}%>) | ||||
| { | ||||
|     return define_array<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>>(a0<%1.upto(i) {|j|%>, a<%=j%><%}%>); | ||||
| } | ||||
| <%}%> | ||||
| /// @endcond | ||||
|  | ||||
| }  // namespace type | ||||
| /// @cond | ||||
| }  // MSGPACK_API_VERSION_NAMESPACE(v1) | ||||
| /// @endcond | ||||
| }  // namespace msgpack | ||||
|  | ||||
|  | ||||
| #endif // MSGPACK_CPP03_DEFINE_ARRAY_HPP | ||||
							
								
								
									
										173
									
								
								erb/cpp03_define_map.hpp.erb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										173
									
								
								erb/cpp03_define_map.hpp.erb
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,173 @@ | ||||
| // | ||||
| // MessagePack for C++ static resolution routine | ||||
| // | ||||
| // Copyright (C) 2015 KONDO Takatoshi | ||||
| // | ||||
| //    Distributed under the Boost Software License, Version 1.0. | ||||
| //    (See accompanying file LICENSE_1_0.txt or copy at | ||||
| //    http://www.boost.org/LICENSE_1_0.txt) | ||||
| // | ||||
| #ifndef MSGPACK_CPP03_DEFINE_MAP_HPP | ||||
| #define MSGPACK_CPP03_DEFINE_MAP_HPP | ||||
|  | ||||
| // BOOST_PP_VARIADICS is defined in boost/preprocessor/config/config.hpp | ||||
| // http://www.boost.org/libs/preprocessor/doc/ref/variadics.html | ||||
| // However, supporting compiler detection is not complete. msgpack-c requires | ||||
| // variadic macro arguments support. So BOOST_PP_VARIADICS is defined here explicitly. | ||||
| #if !defined(MSGPACK_PP_VARIADICS) | ||||
| #define MSGPACK_PP_VARIADICS | ||||
| #endif | ||||
|  | ||||
| #include <msgpack/preprocessor.hpp> | ||||
|  | ||||
| #include "msgpack/versioning.hpp" | ||||
| #include "msgpack/adaptor/msgpack_tuple.hpp" | ||||
| #include "msgpack/adaptor/adaptor_base.hpp" | ||||
| #include "msgpack/object_fwd.hpp" | ||||
|  | ||||
| #define MSGPACK_DEFINE_MAP_EACH_PROC(r, data, elem) \ | ||||
|     MSGPACK_PP_IF( \ | ||||
|         MSGPACK_PP_IS_BEGIN_PARENS(elem), \ | ||||
|         elem, \ | ||||
|         (MSGPACK_PP_STRINGIZE(elem))(elem) \ | ||||
|     ) | ||||
|  | ||||
| #define MSGPACK_DEFINE_MAP_IMPL(...) \ | ||||
|     MSGPACK_PP_SEQ_TO_TUPLE( \ | ||||
|         MSGPACK_PP_SEQ_FOR_EACH( \ | ||||
|             MSGPACK_DEFINE_MAP_EACH_PROC, \ | ||||
|             0, \ | ||||
|             MSGPACK_PP_VARIADIC_TO_SEQ(__VA_ARGS__) \ | ||||
|         ) \ | ||||
|     ) | ||||
|  | ||||
| #define MSGPACK_DEFINE_MAP(...) \ | ||||
|     template <typename Packer> \ | ||||
|     void msgpack_pack(Packer& pk) const \ | ||||
|     { \ | ||||
|         msgpack::type::make_define_map \ | ||||
|             MSGPACK_DEFINE_MAP_IMPL(__VA_ARGS__) \ | ||||
|             .msgpack_pack(pk); \ | ||||
|     } \ | ||||
|     void msgpack_unpack(msgpack::object const& o) \ | ||||
|     { \ | ||||
|         msgpack::type::make_define_map \ | ||||
|             MSGPACK_DEFINE_MAP_IMPL(__VA_ARGS__) \ | ||||
|             .msgpack_unpack(o); \ | ||||
|     }\ | ||||
|     template <typename MSGPACK_OBJECT> \ | ||||
|     void msgpack_object(MSGPACK_OBJECT* o, msgpack::zone& z) const \ | ||||
|     { \ | ||||
|         msgpack::type::make_define_map \ | ||||
|             MSGPACK_DEFINE_MAP_IMPL(__VA_ARGS__) \ | ||||
|             .msgpack_object(o, z); \ | ||||
|     } | ||||
|  | ||||
| #define MSGPACK_BASE_MAP(base) \ | ||||
|     (MSGPACK_PP_STRINGIZE(base))(*const_cast<base *>(static_cast<base const*>(this))) | ||||
|  | ||||
| namespace msgpack { | ||||
| /// @cond | ||||
| MSGPACK_API_VERSION_NAMESPACE(v1) { | ||||
| /// @endcond | ||||
| namespace type { | ||||
|  | ||||
| /// @cond | ||||
| <% GENERATION_LIMIT = 31 %> | ||||
| template <typename A0 = void<%1.upto(GENERATION_LIMIT+1) {|i|%>, typename A<%=i%> = void<%}%>> | ||||
| struct define_map; | ||||
| /// @endcond | ||||
|  | ||||
| template <> | ||||
| struct define_map<> { | ||||
|     template <typename Packer> | ||||
|     void msgpack_pack(Packer& pk) const | ||||
|     { | ||||
|         pk.pack_map(0); | ||||
|     } | ||||
|     void msgpack_unpack(msgpack::object const& o) const | ||||
|     { | ||||
|         if(o.type != msgpack::type::MAP) { throw msgpack::type_error(); } | ||||
|     } | ||||
|     void msgpack_object(msgpack::object* o, msgpack::zone&) const | ||||
|     { | ||||
|         o->type = msgpack::type::MAP; | ||||
|         o->via.map.ptr = nullptr; | ||||
|         o->via.map.size = 0; | ||||
|     } | ||||
| }; | ||||
|  | ||||
| /// @cond | ||||
| <%1.step(GENERATION_LIMIT+1,2) {|i|%> | ||||
| template <typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>> | ||||
| struct define_map<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> { | ||||
|     define_map(A0& _a0<%1.upto(i) {|j|%>, A<%=j%>& _a<%=j%><%}%>) : | ||||
|         a0(_a0)<%1.upto(i) {|j|%>, a<%=j%>(_a<%=j%>)<%}%> {} | ||||
|     template <typename Packer> | ||||
|     void msgpack_pack(Packer& pk) const | ||||
|     { | ||||
|         pk.pack_map(<%=(i+1)/2%>); | ||||
|         <%0.upto(i) {|j|%> | ||||
|         pk.pack(a<%=j%>);<%}%> | ||||
|     } | ||||
|     void msgpack_unpack(msgpack::object const& o) const | ||||
|     { | ||||
|         if(o.type != msgpack::type::MAP) { throw msgpack::type_error(); } | ||||
|         std::map<std::string, msgpack::object const*> kvmap; | ||||
|         for (uint32_t i = 0; i < o.via.map.size; ++i) { | ||||
|             kvmap.insert( | ||||
|                 std::map<std::string, msgpack::object const*>::value_type( | ||||
|                     std::string( | ||||
|                         o.via.map.ptr[i].key.via.str.ptr, | ||||
|                         o.via.map.ptr[i].key.via.str.size), | ||||
|                     &o.via.map.ptr[i].val | ||||
|                 ) | ||||
|             ); | ||||
|         } | ||||
|         <%0.step(i,2) {|j|%> | ||||
|         { | ||||
|             std::map<std::string, msgpack::object const*>::const_iterator it = kvmap.find(a<%=j%>); | ||||
|             if (it != kvmap.end()) { | ||||
|                 it->second->convert(a<%=j+1%>); | ||||
|             } | ||||
|         } | ||||
|         <%}%> | ||||
|     } | ||||
|     void msgpack_object(msgpack::object* o, msgpack::zone& z) const | ||||
|     { | ||||
|         o->type = msgpack::type::MAP; | ||||
|         o->via.map.ptr = static_cast<msgpack::object_kv*>(z.allocate_align(sizeof(msgpack::object_kv)*<%=(i+1)/2%>)); | ||||
|         o->via.map.size = <%=(i+1)/2%>; | ||||
|         <%0.step(i,2) {|j|%> | ||||
|         o->via.map.ptr[<%=j/2%>].key = msgpack::object(a<%=j%>, z); | ||||
|         o->via.map.ptr[<%=j/2%>].val = msgpack::object(a<%=j+1%>, z); | ||||
|         <%}%> | ||||
|     } | ||||
|     <%0.upto(i) {|j|%> | ||||
|     A<%=j%>& a<%=j%>;<%}%> | ||||
| }; | ||||
| <%}%> | ||||
| /// @endcond | ||||
|  | ||||
| inline define_map<> make_define_map() | ||||
| { | ||||
|     return define_map<>(); | ||||
| } | ||||
|  | ||||
| /// @cond | ||||
| <%0.upto(GENERATION_LIMIT) {|i|%> | ||||
| template <typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>> | ||||
| inline define_map<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> make_define_map(A0& a0<%1.upto(i) {|j|%>, A<%=j%>& a<%=j%><%}%>) | ||||
| { | ||||
|     return define_map<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>>(a0<%1.upto(i) {|j|%>, a<%=j%><%}%>); | ||||
| } | ||||
| <%}%> | ||||
| /// @endcond | ||||
|  | ||||
| }  // namespace type | ||||
| /// @cond | ||||
| }  // MSGPACK_API_VERSION_NAMESPACE(v1) | ||||
| /// @endcond | ||||
| }  // namespace msgpack | ||||
|  | ||||
| #endif // MSGPACK_CPP03_DEFINE_MAP_HPP | ||||
							
								
								
									
										238
									
								
								erb/cpp03_msgpack_tuple.hpp.erb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										238
									
								
								erb/cpp03_msgpack_tuple.hpp.erb
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,238 @@ | ||||
| // | ||||
| // MessagePack for C++ static resolution routine | ||||
| // | ||||
| // Copyright (C) 2008-2013 FURUHASHI Sadayuki and KONDO Takatoshi | ||||
| // | ||||
| //    Distributed under the Boost Software License, Version 1.0. | ||||
| //    (See accompanying file LICENSE_1_0.txt or copy at | ||||
| //    http://www.boost.org/LICENSE_1_0.txt) | ||||
| // | ||||
| #ifndef MSGPACK_CPP03_MSGPACK_TUPLE_HPP | ||||
| #define MSGPACK_CPP03_MSGPACK_TUPLE_HPP | ||||
|  | ||||
| #include "msgpack/versioning.hpp" | ||||
| #include "msgpack/object.hpp" | ||||
| #include "msgpack/adaptor/adaptor_base.hpp" | ||||
|  | ||||
| namespace msgpack { | ||||
|  | ||||
| /// @cond | ||||
| MSGPACK_API_VERSION_NAMESPACE(v1) { | ||||
| /// @endcond | ||||
|  | ||||
| namespace type { | ||||
|  | ||||
| // FIXME operator== | ||||
| // FIXME operator!= | ||||
| <% GENERATION_LIMIT = 31 %> | ||||
|  | ||||
| /// @cond | ||||
| template <typename A0 = void<%1.upto(GENERATION_LIMIT+1) {|i|%>, typename A<%=i%> = void<%}%>> | ||||
| struct tuple; | ||||
| /// @endcond | ||||
|  | ||||
| template <typename Tuple, int N> | ||||
| struct tuple_element; | ||||
|  | ||||
| template <typename Tuple, int N> | ||||
| struct const_tuple_element; | ||||
|  | ||||
| template <typename T> | ||||
| struct tuple_type { | ||||
|     typedef T type; | ||||
|     typedef T value_type; | ||||
|     typedef T& reference; | ||||
|     typedef const T& const_reference; | ||||
|     typedef const T& transparent_reference; | ||||
| }; | ||||
|  | ||||
| template <typename T> | ||||
| struct tuple_type<T&> { | ||||
|     typedef T type; | ||||
|     typedef T& value_type; | ||||
|     typedef T& reference; | ||||
|     typedef const T& const_reference; | ||||
|     typedef T& transparent_reference; | ||||
| }; | ||||
|  | ||||
| template <typename T> | ||||
| struct tuple_type<const T&> { | ||||
|     typedef T type; | ||||
|     typedef T& value_type; | ||||
|     typedef T& reference; | ||||
|     typedef const T& const_reference; | ||||
|     typedef const T& transparent_reference; | ||||
| }; | ||||
|  | ||||
| /// @cond | ||||
| <%0.upto(GENERATION_LIMIT) {|i|%> | ||||
| <%0.upto(i) {|j|%> | ||||
| template <typename A0<%1.upto(i) {|k|%>, typename A<%=k%><%}%>> | ||||
| struct tuple_element<tuple<A0<%1.upto(i) {|k|%>, A<%=k%><%}%>>, <%=j%>> : tuple_type<A<%=j%>> { | ||||
|     tuple_element(tuple<A0<%1.upto(i) {|k|%>, A<%=k%> <%}%>>& x) : m_x(x.a<%=j%>) {} | ||||
|     typename tuple_type<A<%=j%>>::reference get() { return m_x; } | ||||
|     typename tuple_type<A<%=j%>>::const_reference get() const { return m_x; } | ||||
| private: | ||||
|     typename tuple_type<A<%=j%>>::reference m_x; | ||||
| }; | ||||
| <%}%> | ||||
| <%}%> | ||||
|  | ||||
| <%0.upto(GENERATION_LIMIT) {|i|%> | ||||
| <%0.upto(i) {|j|%> | ||||
| template <typename A0<%1.upto(i) {|k|%>, typename A<%=k%><%}%>> | ||||
| struct const_tuple_element<tuple<A0<%1.upto(i) {|k|%>, A<%=k%><%}%>>, <%=j%>> : tuple_type<A<%=j%>> { | ||||
|     const_tuple_element(const tuple<A0<%1.upto(i) {|k|%>, A<%=k%><%}%>>& x) : m_x(x.a<%=j%>) {} | ||||
|     typename tuple_type<A<%=j%>>::const_reference get() const { return m_x; } | ||||
| private: | ||||
|     typename tuple_type<A<%=j%>>::const_reference m_x; | ||||
| }; | ||||
| <%}%> | ||||
| <%}%> | ||||
| /// @endcond | ||||
|  | ||||
| template <> | ||||
| struct tuple<> { | ||||
|     tuple() {} | ||||
|     tuple(msgpack::object const& o) { o.convert(*this); } | ||||
|     typedef tuple<> value_type; | ||||
| }; | ||||
|  | ||||
| /// @cond | ||||
| <%0.upto(GENERATION_LIMIT) {|i|%> | ||||
| template <typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>> | ||||
| struct tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> { | ||||
|     typedef tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> value_type; | ||||
|     tuple() {} | ||||
|     tuple(typename tuple_type<A0>::transparent_reference _a0<%1.upto(i) {|j|%>, typename tuple_type<A<%=j%>>::transparent_reference _a<%=j%><%}%>) : | ||||
|         a0(_a0)<%1.upto(i) {|j|%>, a<%=j%>(_a<%=j%>)<%}%> {} | ||||
|     tuple(msgpack::object const& o) { o.convert(*this); } | ||||
|     template <int N> typename tuple_element<value_type, N>::reference get() | ||||
|         { return tuple_element<value_type, N>(*this).get(); } | ||||
|     template <int N> typename const_tuple_element<value_type, N>::const_reference get() const | ||||
|         { return const_tuple_element<value_type, N>(*this).get(); } | ||||
|     <%0.upto(i) {|j|%> | ||||
|     A<%=j%> a<%=j%>;<%}%> | ||||
| }; | ||||
|  | ||||
| template <int N, typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>> | ||||
| inline typename type::tuple_element<type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>>, N>::reference get(type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>>& t) | ||||
| { return t.template get<N>(); } | ||||
| template <int N, typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>> | ||||
| inline typename type::const_tuple_element<type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>>, N>::const_reference get(type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> const& t) | ||||
| { return t.template get<N>(); } | ||||
| <%}%> | ||||
| /// @endcond | ||||
|  | ||||
| inline tuple<> make_tuple() | ||||
| { | ||||
|     return tuple<>(); | ||||
| } | ||||
|  | ||||
| /// @cond | ||||
| <%0.upto(GENERATION_LIMIT) {|i|%> | ||||
| template <typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>> | ||||
| inline tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> make_tuple(typename tuple_type<A0>::transparent_reference a0<%1.upto(i) {|j|%>, typename tuple_type<A<%=j%>>::transparent_reference a<%=j%><%}%>) | ||||
| { | ||||
|     return tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>>(a0<%1.upto(i) {|j|%>, a<%=j%><%}%>); | ||||
| } | ||||
| <%}%> | ||||
| /// @endcond | ||||
|  | ||||
| }  // namespace type | ||||
|  | ||||
| namespace adaptor { | ||||
|  | ||||
| template <> | ||||
| struct convert<type::tuple<> > { | ||||
|     msgpack::object const& operator()( | ||||
|         msgpack::object const& o, | ||||
|         type::tuple<>&) const { | ||||
|         if(o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); } | ||||
|         return o; | ||||
|     } | ||||
| }; | ||||
|  | ||||
| /// @cond | ||||
| <%0.upto(GENERATION_LIMIT) {|i|%> | ||||
| template <typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>> | ||||
| struct convert<type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> > { | ||||
|     msgpack::object const& operator()( | ||||
|         msgpack::object const& o, | ||||
|         type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>>& v) const { | ||||
|         if(o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); } | ||||
|         if(o.via.array.size < <%=i+1%>) { throw msgpack::type_error(); } | ||||
|         <%0.upto(i) {|j|%> | ||||
|         // In order to avoid clang++'s invalid warning, msgpack::object:: has been added. | ||||
|         o.via.array.ptr[<%=j%>].msgpack::object::convert<typename type::tuple_type<A<%=j%>>::type>(v.template get<<%=j%>>());<%}%> | ||||
|         return o; | ||||
|     } | ||||
| }; | ||||
| <%}%> | ||||
| /// @endcond | ||||
|  | ||||
| template <> | ||||
| struct pack<type::tuple<> > { | ||||
|     template <typename Stream> | ||||
|     msgpack::packer<Stream>& operator()( | ||||
|         msgpack::packer<Stream>& o, | ||||
|         const type::tuple<>&) const { | ||||
|         o.pack_array(0); | ||||
|         return o; | ||||
|     } | ||||
| }; | ||||
|  | ||||
| /// @cond | ||||
| <%0.upto(GENERATION_LIMIT) {|i|%> | ||||
| template <typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>> | ||||
| struct pack<type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> > { | ||||
|     template <typename Stream> | ||||
|     msgpack::packer<Stream>& operator()( | ||||
|         msgpack::packer<Stream>& o, | ||||
|         const type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>>& v) const { | ||||
|         o.pack_array(<%=i+1%>); | ||||
|         <%0.upto(i) {|j|%> | ||||
|         o.pack(v.template get<<%=j%>>());<%}%> | ||||
|         return o; | ||||
|     } | ||||
| }; | ||||
| <%}%> | ||||
| /// @endcond | ||||
|  | ||||
| template <> | ||||
| struct object_with_zone<type::tuple<> > { | ||||
|     void operator()( | ||||
|         msgpack::object::with_zone& o, | ||||
|         const type::tuple<>&) const { | ||||
|         o.type = msgpack::type::ARRAY; | ||||
|         o.via.array.ptr = nullptr; | ||||
|         o.via.array.size = 0; | ||||
|     } | ||||
| }; | ||||
|  | ||||
| /// @cond | ||||
| <%0.upto(GENERATION_LIMIT) {|i|%> | ||||
| template <typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>> | ||||
| struct object_with_zone<type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> > { | ||||
|     void operator()( | ||||
|         msgpack::object::with_zone& o, | ||||
|         const type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>>& v) const { | ||||
|         o.type = msgpack::type::ARRAY; | ||||
|         o.via.array.ptr = static_cast<msgpack::object*>(o.zone.allocate_align(sizeof(msgpack::object)*<%=i+1%>)); | ||||
|         o.via.array.size = <%=i+1%>; | ||||
|         <%0.upto(i) {|j|%> | ||||
|         o.via.array.ptr[<%=j%>] = msgpack::object(v.template get<<%=j%>>(), o.zone);<%}%> | ||||
|     } | ||||
| }; | ||||
| <%}%> | ||||
| /// @endcond | ||||
|  | ||||
| } // namespace adaptor | ||||
|  | ||||
| /// @cond | ||||
| }  // MSGPACK_API_VERSION_NAMESPACE(v1) | ||||
| /// @endcond | ||||
|  | ||||
| }  // namespace msgpack | ||||
|  | ||||
| #endif // MSGPACK_CPP03_MSGPACK_TUPLE_HPP | ||||
							
								
								
									
										338
									
								
								erb/cpp03_zone.hpp.erb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										338
									
								
								erb/cpp03_zone.hpp.erb
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,338 @@ | ||||
| // | ||||
| // MessagePack for C++ memory pool | ||||
| // | ||||
| // Copyright (C) 2008-2010 FURUHASHI Sadayuki | ||||
| // | ||||
| //    Distributed under the Boost Software License, Version 1.0. | ||||
| //    (See accompanying file LICENSE_1_0.txt or copy at | ||||
| //    http://www.boost.org/LICENSE_1_0.txt) | ||||
| // | ||||
| #ifndef MSGPACK_CPP03_ZONE_HPP | ||||
| #define MSGPACK_CPP03_ZONE_HPP | ||||
|  | ||||
| #include <cstdlib> | ||||
| #include <memory> | ||||
| #include <vector> | ||||
|  | ||||
| #include "msgpack/versioning.hpp" | ||||
|  | ||||
| #ifndef MSGPACK_ZONE_CHUNK_SIZE | ||||
| #define MSGPACK_ZONE_CHUNK_SIZE 8192 | ||||
| #endif | ||||
|  | ||||
| #ifndef MSGPACK_ZONE_ALIGN | ||||
| #define MSGPACK_ZONE_ALIGN sizeof(void*) | ||||
| #endif | ||||
|  | ||||
| <% GENERATION_LIMIT = 15 %> | ||||
| namespace msgpack { | ||||
|  | ||||
| /// @cond | ||||
| MSGPACK_API_VERSION_NAMESPACE(v1) { | ||||
| /// @endcond | ||||
|  | ||||
| class zone { | ||||
|     struct finalizer { | ||||
|         finalizer(void (*func)(void*), void* data):m_func(func), m_data(data) {} | ||||
|         void operator()() { m_func(m_data); } | ||||
|         void (*m_func)(void*); | ||||
|         void* m_data; | ||||
|     }; | ||||
|     struct finalizer_array { | ||||
|         finalizer_array():m_tail(nullptr), m_end(nullptr), m_array(nullptr) {} | ||||
|         void call() { | ||||
|             finalizer* fin = m_tail; | ||||
|             for(; fin != m_array; --fin) (*(fin-1))(); | ||||
|         } | ||||
|         ~finalizer_array() { | ||||
|             call(); | ||||
|             ::free(m_array); | ||||
|         } | ||||
|         void clear() { | ||||
|             call(); | ||||
|             m_tail = m_array; | ||||
|         } | ||||
|         void push(void (*func)(void* data), void* data) | ||||
|         { | ||||
|             finalizer* fin = m_tail; | ||||
|  | ||||
|             if(fin == m_end) { | ||||
|                 push_expand(func, data); | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             fin->m_func = func; | ||||
|             fin->m_data = data; | ||||
|  | ||||
|             ++m_tail; | ||||
|         } | ||||
|         void push_expand(void (*func)(void*), void* data) { | ||||
|             const size_t nused = m_end - m_array; | ||||
|             size_t nnext; | ||||
|             if(nused == 0) { | ||||
|                 nnext = (sizeof(finalizer) < 72/2) ? | ||||
|                     72 / sizeof(finalizer) : 8; | ||||
|             } else { | ||||
|                 nnext = nused * 2; | ||||
|             } | ||||
|             finalizer* tmp = | ||||
|                 static_cast<finalizer*>(::realloc(m_array, sizeof(finalizer) * nnext)); | ||||
|             if(!tmp) { | ||||
|                 throw std::bad_alloc(); | ||||
|             } | ||||
|             m_array     = tmp; | ||||
|             m_end   = tmp + nnext; | ||||
|             m_tail  = tmp + nused; | ||||
|             new (m_tail) finalizer(func, data); | ||||
|  | ||||
|             ++m_tail; | ||||
|         } | ||||
|         finalizer* m_tail; | ||||
|         finalizer* m_end; | ||||
|         finalizer* m_array; | ||||
|     }; | ||||
|     struct chunk { | ||||
|         chunk* m_next; | ||||
|     }; | ||||
|     struct chunk_list { | ||||
|         chunk_list(size_t chunk_size) | ||||
|         { | ||||
|             chunk* c = static_cast<chunk*>(::malloc(sizeof(chunk) + chunk_size)); | ||||
|             if(!c) { | ||||
|                 throw std::bad_alloc(); | ||||
|             } | ||||
|  | ||||
|             m_head = c; | ||||
|             m_free = chunk_size; | ||||
|             m_ptr  = reinterpret_cast<char*>(c) + sizeof(chunk); | ||||
|             c->m_next = nullptr; | ||||
|         } | ||||
|         ~chunk_list() | ||||
|         { | ||||
|             chunk* c = m_head; | ||||
|             while(c) { | ||||
|                 chunk* n = c->m_next; | ||||
|                 ::free(c); | ||||
|                 c = n; | ||||
|             } | ||||
|         } | ||||
|         void clear(size_t chunk_size) | ||||
|         { | ||||
|             chunk* c = m_head; | ||||
|             while(true) { | ||||
|                 chunk* n = c->m_next; | ||||
|                 if(n) { | ||||
|                     ::free(c); | ||||
|                     c = n; | ||||
|                 } else { | ||||
|                     break; | ||||
|                 } | ||||
|             } | ||||
|             m_head->m_next = nullptr; | ||||
|             m_free = chunk_size; | ||||
|             m_ptr  = reinterpret_cast<char*>(m_head) + sizeof(chunk); | ||||
|         } | ||||
|         size_t m_free; | ||||
|         char* m_ptr; | ||||
|         chunk* m_head; | ||||
|     }; | ||||
|     size_t m_chunk_size; | ||||
|     chunk_list m_chunk_list; | ||||
|     finalizer_array m_finalizer_array; | ||||
|  | ||||
| public: | ||||
|     zone(size_t chunk_size = MSGPACK_ZONE_CHUNK_SIZE) /* throw() */; | ||||
|  | ||||
| public: | ||||
|     void* allocate_align(size_t size, size_t align = MSGPACK_ZONE_ALIGN); | ||||
|     void* allocate_no_align(size_t size); | ||||
|  | ||||
|     void push_finalizer(void (*func)(void*), void* data); | ||||
|  | ||||
|     template <typename T> | ||||
|     void push_finalizer(msgpack::unique_ptr<T> obj); | ||||
|  | ||||
|     void clear(); | ||||
|  | ||||
|     void swap(zone& o); | ||||
|     static void* operator new(std::size_t size) | ||||
|     { | ||||
|         void* p = ::malloc(size); | ||||
|         if (!p) throw std::bad_alloc(); | ||||
|         return p; | ||||
|     } | ||||
|     static void operator delete(void *p) /* throw() */ | ||||
|     { | ||||
|         ::free(p); | ||||
|     } | ||||
|     static void* operator new(std::size_t size, void* place) /* throw() */ | ||||
|     { | ||||
|         return ::operator new(size, place); | ||||
|     } | ||||
|     static void operator delete(void* p, void* place) /* throw() */ | ||||
|     { | ||||
|         ::operator delete(p, place); | ||||
|     } | ||||
|     /// @cond | ||||
|     <%0.upto(GENERATION_LIMIT) {|i|%> | ||||
|     template <typename T<%1.upto(i) {|j|%>, typename A<%=j%><%}%>> | ||||
|     T* allocate(<%=(1..i).map{|j|"A#{j} a#{j}"}.join(', ')%>); | ||||
|     <%}%> | ||||
|     /// @endcond | ||||
|  | ||||
| private: | ||||
|     void undo_allocate(size_t size); | ||||
|  | ||||
|     template <typename T> | ||||
|     static void object_destruct(void* obj); | ||||
|  | ||||
|     template <typename T> | ||||
|     static void object_delete(void* obj); | ||||
|  | ||||
|     void* allocate_expand(size_t size); | ||||
| private: | ||||
|     zone(const zone&); | ||||
|     zone& operator=(const zone&); | ||||
| }; | ||||
|  | ||||
| inline zone::zone(size_t chunk_size) /* throw() */ :m_chunk_size(chunk_size), m_chunk_list(m_chunk_size) | ||||
| { | ||||
| } | ||||
|  | ||||
| inline void* zone::allocate_align(size_t size, size_t align) | ||||
| { | ||||
|     char* aligned = | ||||
|         reinterpret_cast<char*>( | ||||
|             reinterpret_cast<size_t>( | ||||
|                 (m_chunk_list.m_ptr + (align - 1))) / align * align); | ||||
|     size_t adjusted_size = size + (aligned - m_chunk_list.m_ptr); | ||||
|     if(m_chunk_list.m_free >= adjusted_size) { | ||||
|         m_chunk_list.m_free -= adjusted_size; | ||||
|         m_chunk_list.m_ptr  += adjusted_size; | ||||
|         return aligned; | ||||
|     } | ||||
|     return reinterpret_cast<char*>( | ||||
|         reinterpret_cast<size_t>( | ||||
|             allocate_expand(size + (align - 1))) / align * align); | ||||
| } | ||||
|  | ||||
| inline void* zone::allocate_no_align(size_t size) | ||||
| { | ||||
|     if(m_chunk_list.m_free < size) { | ||||
|         return allocate_expand(size); | ||||
|     } | ||||
|  | ||||
|     char* ptr = m_chunk_list.m_ptr; | ||||
|     m_chunk_list.m_free -= size; | ||||
|     m_chunk_list.m_ptr  += size; | ||||
|  | ||||
|     return ptr; | ||||
| } | ||||
|  | ||||
| inline void* zone::allocate_expand(size_t size) | ||||
| { | ||||
|     chunk_list* const cl = &m_chunk_list; | ||||
|  | ||||
|     size_t sz = m_chunk_size; | ||||
|  | ||||
|     while(sz < size) { | ||||
|         size_t tmp_sz = sz * 2; | ||||
|         if (tmp_sz <= sz) { | ||||
|             sz = size; | ||||
|             break; | ||||
|         } | ||||
|         sz = tmp_sz; | ||||
|     } | ||||
|  | ||||
|     chunk* c = static_cast<chunk*>(::malloc(sizeof(chunk) + sz)); | ||||
|     if (!c) throw std::bad_alloc(); | ||||
|  | ||||
|     char* ptr = reinterpret_cast<char*>(c) + sizeof(chunk); | ||||
|  | ||||
|     c->m_next  = cl->m_head; | ||||
|     cl->m_head = c; | ||||
|     cl->m_free = sz - size; | ||||
|     cl->m_ptr  = ptr + size; | ||||
|  | ||||
|     return ptr; | ||||
| } | ||||
|  | ||||
| inline void zone::push_finalizer(void (*func)(void*), void* data) | ||||
| { | ||||
|     m_finalizer_array.push(func, data); | ||||
| } | ||||
|  | ||||
| template <typename T> | ||||
| inline void zone::push_finalizer(msgpack::unique_ptr<T> obj) | ||||
| { | ||||
|     m_finalizer_array.push(&zone::object_delete<T>, obj.release()); | ||||
| } | ||||
|  | ||||
| inline void zone::clear() | ||||
| { | ||||
|     m_finalizer_array.clear(); | ||||
|     m_chunk_list.clear(m_chunk_size); | ||||
| } | ||||
|  | ||||
| inline void zone::swap(zone& o) | ||||
| { | ||||
|     using std::swap; | ||||
|     swap(m_chunk_size, o.m_chunk_size); | ||||
|     swap(m_chunk_list, o.m_chunk_list); | ||||
|     swap(m_finalizer_array, o.m_finalizer_array); | ||||
| } | ||||
|  | ||||
| template <typename T> | ||||
| void zone::object_destruct(void* obj) | ||||
| { | ||||
|     static_cast<T*>(obj)->~T(); | ||||
| } | ||||
|  | ||||
| template <typename T> | ||||
| void zone::object_delete(void* obj) | ||||
| { | ||||
|     delete static_cast<T*>(obj); | ||||
| } | ||||
|  | ||||
| inline void zone::undo_allocate(size_t size) | ||||
| { | ||||
|     m_chunk_list.m_ptr  -= size; | ||||
|     m_chunk_list.m_free += size; | ||||
| } | ||||
|  | ||||
| inline std::size_t aligned_size( | ||||
|     std::size_t size, | ||||
|     std::size_t align = MSGPACK_ZONE_ALIGN) { | ||||
|     return (size + align - 1) / align * align; | ||||
| } | ||||
|  | ||||
| /// @cond | ||||
| <%0.upto(GENERATION_LIMIT) {|i|%> | ||||
| template <typename T<%1.upto(i) {|j|%>, typename A<%=j%><%}%>> | ||||
| T* zone::allocate(<%=(1..i).map{|j|"A#{j} a#{j}"}.join(', ')%>) | ||||
| { | ||||
|     void* x = allocate_align(sizeof(T)); | ||||
|     try { | ||||
|         m_finalizer_array.push(&zone::object_destruct<T>, x); | ||||
|     } catch (...) { | ||||
|         undo_allocate(sizeof(T)); | ||||
|         throw; | ||||
|     } | ||||
|     try { | ||||
|         return new (x) T(<%=(1..i).map{|j|"a#{j}"}.join(', ')%>); | ||||
|     } catch (...) { | ||||
|         --m_finalizer_array.m_tail; | ||||
|         undo_allocate(sizeof(T)); | ||||
|         throw; | ||||
|     } | ||||
| } | ||||
| <%}%> | ||||
| /// @endcond | ||||
|  | ||||
| /// @cond | ||||
| }  // MSGPACK_API_VERSION_NAMESPACE(v1) | ||||
| /// @endcond | ||||
|  | ||||
| }  // namespace msgpack | ||||
|  | ||||
| #endif // MSGPACK_CPP03_ZONE_HPP | ||||
							
								
								
									
										5
									
								
								erlang/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								erlang/.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1,5 +0,0 @@ | ||||
| MANIFEST | ||||
| *.beam | ||||
| .omakedb* | ||||
| *.omc | ||||
| *~ | ||||
| @@ -1,51 +0,0 @@ | ||||
| ######################################################################## | ||||
| # Permission is hereby granted, free of charge, to any person | ||||
| # obtaining a copy of this file, to deal in the File without | ||||
| # restriction, including without limitation the rights to use, | ||||
| # copy, modify, merge, publish, distribute, sublicense, and/or | ||||
| # sell copies of the File, and to permit persons to whom the | ||||
| # File is furnished to do so, subject to the following condition: | ||||
| # | ||||
| # THE FILE 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 AND NONINFRINGEMENT. | ||||
| # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, | ||||
| # DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR | ||||
| # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE FILE OR | ||||
| # THE USE OR OTHER DEALINGS IN THE FILE. | ||||
|  | ||||
| ######################################################################## | ||||
| # The standard OMakefile. | ||||
| # You will usually need to modify this file for your project. | ||||
|  | ||||
| ######################################################################## | ||||
| # Phony targets are scoped, so you probably want to declare them first. | ||||
| # | ||||
|  | ||||
| .PHONY: all clean test edoc dialyzer #install | ||||
|  | ||||
| ######################################################################## | ||||
| # Subdirectories. | ||||
| # You may want to include some subdirectories in this project. | ||||
| # If so, define the subdirectory targets and uncomment this section. | ||||
| # | ||||
|  | ||||
| .DEFAULT: msgpack.beam | ||||
|  | ||||
| msgpack.beam: msgpack.erl | ||||
| 	erlc -Wall +debug_info $< | ||||
|  | ||||
| msgpack.html: msgpack.erl | ||||
| 	erl -noshell -run edoc_run file $< | ||||
|  | ||||
| test: msgpack.beam | ||||
| 	erl -noshell -s msgpack test -s init stop | ||||
|  | ||||
| edoc: msgpack.erl | ||||
| 	erl -noshell -eval 'ok=edoc:files(["msgpack.erl"], [{dir, "edoc"}]).' -s init stop | ||||
|  | ||||
| dialyzer: msgpack.erl | ||||
| 	dialyzer --src $< | ||||
|  | ||||
| clean: | ||||
| 	-rm -f *.beam *.html | ||||
| @@ -1,45 +0,0 @@ | ||||
| ######################################################################## | ||||
| # Permission is hereby granted, free of charge, to any person | ||||
| # obtaining a copy of this file, to deal in the File without | ||||
| # restriction, including without limitation the rights to use, | ||||
| # copy, modify, merge, publish, distribute, sublicense, and/or | ||||
| # sell copies of the File, and to permit persons to whom the | ||||
| # File is furnished to do so, subject to the following condition: | ||||
| # | ||||
| # THE FILE 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 AND NONINFRINGEMENT. | ||||
| # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, | ||||
| # DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR | ||||
| # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE FILE OR | ||||
| # THE USE OR OTHER DEALINGS IN THE FILE. | ||||
|  | ||||
| ######################################################################## | ||||
| # The standard OMakeroot file. | ||||
| # You will not normally need to modify this file. | ||||
| # By default, your changes should be placed in the | ||||
| # OMakefile in this directory. | ||||
| # | ||||
| # If you decide to modify this file, note that it uses exactly | ||||
| # the same syntax as the OMakefile. | ||||
| # | ||||
|  | ||||
| # | ||||
| # Include the standard installed configuration files. | ||||
| # Any of these can be deleted if you are not using them, | ||||
| # but you probably want to keep the Common file. | ||||
| # | ||||
| open build/C | ||||
| open build/OCaml | ||||
| open build/LaTeX | ||||
|  | ||||
| # | ||||
| # The command-line variables are defined *after* the | ||||
| # standard configuration has been loaded. | ||||
| # | ||||
| DefineCommandVars() | ||||
|  | ||||
| # | ||||
| # Include the OMakefile in this directory. | ||||
| # | ||||
| .SUBDIRS: . | ||||
| @@ -1,9 +0,0 @@ | ||||
| MessagePack for Erlang | ||||
| ====================== | ||||
| Binary-based efficient object serialization library. | ||||
|  | ||||
| see wiki ( http://redmine.msgpack.org/projects/msgpack/wiki/QuickStartErlang ) for details | ||||
|  | ||||
| # Status | ||||
|  | ||||
| 0.1.0 released. | ||||
							
								
								
									
										4
									
								
								erlang/edoc/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								erlang/edoc/.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1,4 +0,0 @@ | ||||
| *.html | ||||
| *.css | ||||
| *.png | ||||
| edoc-info | ||||
| @@ -1,390 +0,0 @@ | ||||
| %% | ||||
| %% MessagePack for Erlang | ||||
| %% | ||||
| %% Copyright (C) 2009-2010 UENISHI Kota | ||||
| %% | ||||
| %%    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. | ||||
|  | ||||
|  | ||||
| %% @doc <a href="http://msgpack.org/">MessagePack</a> codec for Erlang. | ||||
| %% | ||||
| %%      APIs are almost compatible with <a href="http://redmine.msgpack.org/projects/msgpack/wiki/QuickStartC">C API</a> | ||||
| %%      except for buffering functions (both copying and zero-copying), which are unavailable. | ||||
| %% | ||||
| %%   <table border="1"> | ||||
| %%     <caption>Equivalence between Erlang and <a href="http://msgpack.sourceforge.jp/spec">Msgpack type</a> :</caption> | ||||
| %%     <tr><th>    erlang    </th><th>                            msgpack                                      </th></tr> | ||||
| %%     <tr><td> integer()    </td><td> pos_fixnum/neg_fixnum/uint8/uint16/uint32/uint64/int8/int16/int32/int64 </td></tr> | ||||
| %%     <tr><td> float()      </td><td> float/double                                                            </td></tr> | ||||
| %%     <tr><td> nil          </td><td> nil                                                                     </td></tr> | ||||
| %%     <tr><td> boolean()    </td><td> boolean                                                                 </td></tr> | ||||
| %%     <tr><td> binary()     </td><td> fix_raw/raw16/raw32                                                     </td></tr> | ||||
| %%     <tr><td> list()       </td><td> fix_array/array16/array32                                               </td></tr> | ||||
| %%     <tr><td> {proplist()} </td><td> fix_map/map16/map32                                                     </td></tr> | ||||
| %%   </table> | ||||
| %% @end | ||||
|  | ||||
| -module(msgpack). | ||||
| -author('kuenishi+msgpack@gmail.com'). | ||||
|  | ||||
| -export([pack/1, unpack/1, unpack_all/1]). | ||||
|  | ||||
| % @type msgpack_term() = [msgpack_term()] | ||||
| %                      | {[{msgpack_term(),msgpack_term()}]} | ||||
| %                      | integer() | float() | binary(). | ||||
| % Erlang representation of msgpack data. | ||||
| -type msgpack_term() :: [msgpack_term()] | ||||
| 		      | {[{msgpack_term(),msgpack_term()}]} | ||||
| 		      | integer() | float() | binary(). | ||||
|  | ||||
|  | ||||
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||||
| % external APIs | ||||
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||||
|  | ||||
| % @doc Encode an erlang term into an msgpack binary. | ||||
| %      Returns {error, {badarg, term()}} if the input is illegal. | ||||
| % @spec pack(Term::msgpack_term()) -> binary() | {error, {badarg, term()}} | ||||
| -spec pack(Term::msgpack_term()) -> binary() | {error, {badarg, term()}}. | ||||
| pack(Term)-> | ||||
|     try | ||||
| 	pack_(Term) | ||||
|     catch | ||||
| 	throw:Exception -> | ||||
| 	    {error, Exception} | ||||
|     end. | ||||
|  | ||||
| % @doc Decode an msgpack binary into an erlang term. | ||||
| %      It only decodes the first msgpack packet contained in the binary; the rest is returned as is. | ||||
| %      Returns {error, {badarg, term()}} if the input is corrupted. | ||||
| %      Returns {error, incomplete} if the input is not a full msgpack packet (caller should gather more data and try again). | ||||
| % @spec unpack(Bin::binary()) -> {msgpack_term(), binary()} | {error, incomplete} | {error, {badarg, term()}} | ||||
| -spec unpack(Bin::binary()) -> {msgpack_term(), binary()} | {error, incomplete} | {error, {badarg, term()}}. | ||||
| unpack(Bin) when is_binary(Bin) -> | ||||
|     try | ||||
| 	unpack_(Bin) | ||||
|     catch | ||||
| 	throw:Exception -> | ||||
| 	    {error, Exception} | ||||
|     end; | ||||
| unpack(Other) -> | ||||
|     {error, {badarg, Other}}. | ||||
|  | ||||
| % @doc Decode an msgpack binary into an erlang terms. | ||||
| %      It only decodes ALL msgpack packets contained in the binary. No packets should not remain. | ||||
| %      Returns {error, {badarg, term()}} if the input is corrupted. | ||||
| %      Returns {error, incomplete} if the input is not a full msgpack packet (caller should gather more data and try again). | ||||
| % @spec unpack_all(binary()) -> [msgpack_term()] | {error, incomplete} | {error, {badarg, term()}} | ||||
| -spec unpack_all(binary()) -> [msgpack_term()] | {error, incomplete} | {error, {badarg, term()}}. | ||||
| unpack_all(Data)-> | ||||
|     try | ||||
| 	unpack_all_(Data) | ||||
|     catch | ||||
| 	throw:Exception -> | ||||
| 	    {error, Exception} | ||||
|     end. | ||||
| unpack_all_(Data)-> | ||||
|     case unpack_(Data) of | ||||
| 	{ Term, <<>> } -> | ||||
| 	    [Term]; | ||||
| 	{ Term, Binary } when is_binary(Binary) -> | ||||
| 	    [Term|unpack_all_(Binary)] | ||||
|     end. | ||||
|  | ||||
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||||
| % internal APIs | ||||
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||||
|  | ||||
| % pack them all | ||||
| -spec pack_(msgpack_term()) -> binary() | no_return(). | ||||
| pack_(I) when is_integer(I) andalso I < 0 -> | ||||
|     pack_int_(I); | ||||
| pack_(I) when is_integer(I) -> | ||||
|     pack_uint_(I); | ||||
| pack_(F) when is_float(F) -> | ||||
|     pack_double(F); | ||||
| pack_(nil) -> | ||||
|     << 16#C0:8 >>; | ||||
| pack_(true) -> | ||||
|     << 16#C3:8 >>; | ||||
| pack_(false) -> | ||||
|     << 16#C2:8 >>; | ||||
| pack_(Bin) when is_binary(Bin) -> | ||||
|     pack_raw(Bin); | ||||
| pack_(List)  when is_list(List) -> | ||||
|     pack_array(List); | ||||
| pack_({Map}) when is_list(Map) -> | ||||
|     pack_map(Map); | ||||
| pack_(Other) -> | ||||
|     throw({error, {badarg, Other}}). | ||||
|  | ||||
|  | ||||
| -spec pack_uint_(non_neg_integer()) -> binary(). | ||||
| % positive fixnum | ||||
| pack_uint_(N) when N < 128 -> | ||||
|     << 2#0:1, N:7 >>; | ||||
| % uint 8 | ||||
| pack_uint_(N) when N < 256 -> | ||||
|     << 16#CC:8, N:8 >>; | ||||
| % uint 16 | ||||
| pack_uint_(N) when N < 65536 -> | ||||
|     << 16#CD:8, N:16/big-unsigned-integer-unit:1 >>; | ||||
| % uint 32 | ||||
| pack_uint_(N) when N < 16#FFFFFFFF-> | ||||
|     << 16#CE:8, N:32/big-unsigned-integer-unit:1 >>; | ||||
| % uint 64 | ||||
| pack_uint_(N) -> | ||||
|     << 16#CF:8, N:64/big-unsigned-integer-unit:1 >>. | ||||
|  | ||||
| -spec pack_int_(integer()) -> binary(). | ||||
| % negative fixnum | ||||
| pack_int_(N) when N >= -32-> | ||||
|     << 2#111:3, N:5 >>; | ||||
| % int 8 | ||||
| pack_int_(N) when N > -128 -> | ||||
|     << 16#D0:8, N:8/big-signed-integer-unit:1 >>; | ||||
| % int 16 | ||||
| pack_int_(N) when N > -32768 -> | ||||
|     << 16#D1:8, N:16/big-signed-integer-unit:1 >>; | ||||
| % int 32 | ||||
| pack_int_(N) when N > -16#FFFFFFFF -> | ||||
|     << 16#D2:8, N:32/big-signed-integer-unit:1 >>; | ||||
| % int 64 | ||||
| pack_int_(N) -> | ||||
|     << 16#D3:8, N:64/big-signed-integer-unit:1 >>. | ||||
|  | ||||
|  | ||||
| -spec pack_double(float()) -> binary(). | ||||
| % float : erlang's float is always IEEE 754 64bit format. | ||||
| % pack_float(F) when is_float(F)-> | ||||
| %    << 16#CA:8, F:32/big-float-unit:1 >>. | ||||
| %    pack_double(F). | ||||
| % double | ||||
| pack_double(F) -> | ||||
|     << 16#CB:8, F:64/big-float-unit:1 >>. | ||||
|  | ||||
|  | ||||
| -spec pack_raw(binary()) -> binary(). | ||||
| % raw bytes | ||||
| pack_raw(Bin) -> | ||||
|     case byte_size(Bin) of | ||||
| 	Len when Len < 6-> | ||||
| 	    << 2#101:3, Len:5, Bin/binary >>; | ||||
| 	Len when Len < 16#10000 -> % 65536 | ||||
| 	    << 16#DA:8, Len:16/big-unsigned-integer-unit:1, Bin/binary >>; | ||||
| 	Len -> | ||||
| 	    << 16#DB:8, Len:32/big-unsigned-integer-unit:1, Bin/binary >> | ||||
|     end. | ||||
|  | ||||
|  | ||||
| -spec pack_array([msgpack_term()]) -> binary() | no_return(). | ||||
| % list | ||||
| pack_array(L) -> | ||||
|     case length(L) of | ||||
|  	Len when Len < 16 -> | ||||
|  	    << 2#1001:4, Len:4/integer-unit:1, (pack_array_(L, <<>>))/binary >>; | ||||
| 	Len when Len < 16#10000 -> % 65536 | ||||
| 	    << 16#DC:8, Len:16/big-unsigned-integer-unit:1, (pack_array_(L, <<>>))/binary >>; | ||||
| 	Len -> | ||||
| 	    << 16#DD:8, Len:32/big-unsigned-integer-unit:1, (pack_array_(L, <<>>))/binary >> | ||||
|     end. | ||||
|  | ||||
| pack_array_([], Acc) -> Acc; | ||||
| pack_array_([Head|Tail], Acc) -> | ||||
|     pack_array_(Tail, <<Acc/binary,  (pack_(Head))/binary>>). | ||||
|  | ||||
| % Users SHOULD NOT send too long list: this uses lists:reverse/1 | ||||
| -spec unpack_array_(binary(), non_neg_integer(), [msgpack_term()]) -> {[msgpack_term()], binary()} | no_return(). | ||||
| unpack_array_(Bin, 0,   Acc) -> {lists:reverse(Acc), Bin}; | ||||
| unpack_array_(Bin, Len, Acc) -> | ||||
|     {Term, Rest} = unpack_(Bin), | ||||
|     unpack_array_(Rest, Len-1, [Term|Acc]). | ||||
|  | ||||
|  | ||||
| -spec pack_map(M::[{msgpack_term(),msgpack_term()}]) -> binary() | no_return(). | ||||
| pack_map(M)-> | ||||
|     case length(M) of | ||||
| 	Len when Len < 16 -> | ||||
| 	    << 2#1000:4, Len:4/integer-unit:1, (pack_map_(M, <<>>))/binary >>; | ||||
| 	Len when Len < 16#10000 -> % 65536 | ||||
| 	    << 16#DE:8, Len:16/big-unsigned-integer-unit:1, (pack_map_(M, <<>>))/binary >>; | ||||
| 	Len -> | ||||
| 	    << 16#DF:8, Len:32/big-unsigned-integer-unit:1, (pack_map_(M, <<>>))/binary >> | ||||
|     end. | ||||
|  | ||||
| pack_map_([], Acc) -> Acc; | ||||
| pack_map_([{Key,Value}|Tail], Acc) -> | ||||
|     pack_map_(Tail, << Acc/binary, (pack_(Key))/binary, (pack_(Value))/binary>>). | ||||
|  | ||||
| % Users SHOULD NOT send too long list: this uses lists:reverse/1 | ||||
| -spec unpack_map_(binary(), non_neg_integer(), [{msgpack_term(), msgpack_term()}]) -> | ||||
| 			 {{[{msgpack_term(), msgpack_term()}]}, binary()} | no_return(). | ||||
| unpack_map_(Bin, 0,   Acc) -> {{lists:reverse(Acc)}, Bin}; | ||||
| unpack_map_(Bin, Len, Acc) -> | ||||
|     {Key, Rest} = unpack_(Bin), | ||||
|     {Value, Rest2} = unpack_(Rest), | ||||
|     unpack_map_(Rest2, Len-1, [{Key,Value}|Acc]). | ||||
|  | ||||
| % unpack them all | ||||
| -spec unpack_(Bin::binary()) -> {msgpack_term(), binary()} | no_return(). | ||||
| unpack_(Bin) -> | ||||
|     case Bin of | ||||
| % ATOMS | ||||
| 	<<16#C0, Rest/binary>> -> {nil, Rest}; | ||||
| 	<<16#C2, Rest/binary>> -> {false, Rest}; | ||||
| 	<<16#C3, Rest/binary>> -> {true, Rest}; | ||||
| % Floats | ||||
| 	<<16#CA, V:32/float-unit:1, Rest/binary>> ->   {V, Rest}; | ||||
| 	<<16#CB, V:64/float-unit:1, Rest/binary>> ->   {V, Rest}; | ||||
| % Unsigned integers | ||||
| 	<<16#CC, V:8/unsigned-integer, Rest/binary>> ->             {V, Rest}; | ||||
| 	<<16#CD, V:16/big-unsigned-integer-unit:1, Rest/binary>> -> {V, Rest}; | ||||
| 	<<16#CE, V:32/big-unsigned-integer-unit:1, Rest/binary>> -> {V, Rest}; | ||||
| 	<<16#CF, V:64/big-unsigned-integer-unit:1, Rest/binary>> -> {V, Rest}; | ||||
| % Signed integers | ||||
| 	<<16#D0, V:8/signed-integer, Rest/binary>> ->             {V, Rest}; | ||||
| 	<<16#D1, V:16/big-signed-integer-unit:1, Rest/binary>> -> {V, Rest}; | ||||
| 	<<16#D2, V:32/big-signed-integer-unit:1, Rest/binary>> -> {V, Rest}; | ||||
| 	<<16#D3, V:64/big-signed-integer-unit:1, Rest/binary>> -> {V, Rest}; | ||||
| % Raw bytes | ||||
| 	<<16#DA, L:16/unsigned-integer-unit:1, V:L/binary, Rest/binary>> -> {V, Rest}; | ||||
| 	<<16#DB, L:32/unsigned-integer-unit:1, V:L/binary, Rest/binary>> -> {V, Rest}; | ||||
| % Arrays | ||||
| 	<<16#DC, L:16/big-unsigned-integer-unit:1, Rest/binary>> -> unpack_array_(Rest, L, []); | ||||
| 	<<16#DD, L:32/big-unsigned-integer-unit:1, Rest/binary>> -> unpack_array_(Rest, L, []); | ||||
| % Maps | ||||
| 	<<16#DE, L:16/big-unsigned-integer-unit:1, Rest/binary>> -> unpack_map_(Rest, L, []); | ||||
| 	<<16#DF, L:32/big-unsigned-integer-unit:1, Rest/binary>> -> unpack_map_(Rest, L, []); | ||||
|  | ||||
| % Tag-encoded lengths (kept last, for speed) | ||||
| 	<<0:1, V:7, Rest/binary>> ->                 {V, Rest};                  % positive int | ||||
| 	<<2#111:3, V:5, Rest/binary>> ->             {V - 2#100000, Rest};       % negative int | ||||
| 	<<2#101:3, L:5, V:L/binary, Rest/binary>> -> {V, Rest};                  % raw bytes | ||||
| 	<<2#1001:4, L:4, Rest/binary>> ->            unpack_array_(Rest, L, []); % array | ||||
| 	<<2#1000:4, L:4, Rest/binary>> ->            unpack_map_(Rest, L, []);   % map | ||||
|  | ||||
| % Invalid data | ||||
| 	<<F, R/binary>> when F==16#C1; | ||||
| 	                     F==16#C4; F==16#C5; F==16#C6; F==16#C7; F==16#C8; F==16#C9; | ||||
| 	                     F==16#D4; F==16#D5; F==16#D6; F==16#D7; F==16#D8; F==16#D9 -> | ||||
| 	    throw({badarg, <<F, R/binary>>}); | ||||
| % Incomplete data (we've covered every complete/invalid case; anything left is incomplete) | ||||
| 	_ -> | ||||
| 	    throw(incomplete) | ||||
|     end. | ||||
|  | ||||
|  | ||||
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||||
| % unit tests | ||||
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||||
| -include_lib("eunit/include/eunit.hrl"). | ||||
| -ifdef(EUNIT). | ||||
|  | ||||
| compare_all([], [])-> ok; | ||||
| compare_all([],  R)-> {toomuchrhs, R}; | ||||
| compare_all(L,  [])-> {toomuchlhs, L}; | ||||
| compare_all([LH|LTL], [RH|RTL]) -> | ||||
|     ?assertEqual(LH, RH), | ||||
|     compare_all(LTL, RTL). | ||||
|  | ||||
| port_receive(Port) -> | ||||
|     port_receive(Port, <<>>). | ||||
| port_receive(Port, Acc) -> | ||||
|     receive | ||||
|         {Port, {data, Data}} -> port_receive(Port, <<Acc/binary, Data/binary>>); | ||||
|         {Port, eof} -> Acc | ||||
|     after 1000 -> Acc | ||||
|     end. | ||||
|  | ||||
| test_([]) -> 0; | ||||
| test_([Term|Rest])-> | ||||
|     Pack = msgpack:pack(Term), | ||||
|     ?assertEqual({Term, <<>>}, msgpack:unpack( Pack )), | ||||
|     1+test_(Rest). | ||||
|  | ||||
| test_data()-> | ||||
|     [true, false, nil, | ||||
|      0, 1, 2, 123, 512, 1230, 678908, 16#FFFFFFFFFF, | ||||
|      -1, -23, -512, -1230, -567898, -16#FFFFFFFFFF, | ||||
|      123.123, -234.4355, 1.0e-34, 1.0e64, | ||||
|      [23, 234, 0.23], | ||||
|      <<"hogehoge">>, <<"243546rf7g68h798j", 0, 23, 255>>, | ||||
|      <<"hoasfdafdas][">>, | ||||
|      [0,42, <<"sum">>, [1,2]], [1,42, nil, [3]], | ||||
|      -234, -40000, -16#10000000, -16#100000000, | ||||
|      42 | ||||
|     ]. | ||||
|  | ||||
| basic_test()-> | ||||
|     Tests = test_data(), | ||||
|     Passed = test_(Tests), | ||||
|     Passed = length(Tests). | ||||
|  | ||||
| port_test()-> | ||||
|     Tests = test_data(), | ||||
|     ?assertEqual({[Tests],<<>>}, msgpack:unpack(msgpack:pack([Tests]))), | ||||
|  | ||||
|     Port = open_port({spawn, "ruby ../test/crosslang.rb"}, [binary, eof]), | ||||
|     true = port_command(Port, msgpack:pack(Tests)), | ||||
|     ?assertEqual({Tests, <<>>}, msgpack:unpack(port_receive(Port))), | ||||
|     port_close(Port). | ||||
|  | ||||
| test_p(Len,Term,OrigBin,Len) -> | ||||
|     {Term, <<>>}=msgpack:unpack(OrigBin); | ||||
| test_p(I,_,OrigBin,Len) when I < Len-> | ||||
|     <<Bin:I/binary, _/binary>> = OrigBin, | ||||
|     ?assertEqual({error,incomplete}, msgpack:unpack(Bin)). | ||||
|  | ||||
| partial_test()-> % error handling test. | ||||
|     Term = lists:seq(0, 45), | ||||
|     Bin=msgpack:pack(Term), | ||||
|     BinLen = byte_size(Bin), | ||||
|     [test_p(X, Term, Bin, BinLen) || X <- lists:seq(0,BinLen)]. | ||||
|  | ||||
| long_test()-> | ||||
|     Longer = lists:seq(0, 655), | ||||
|     {Longer, <<>>} = msgpack:unpack(msgpack:pack(Longer)). | ||||
|  | ||||
| map_test()-> | ||||
|     Ints = lists:seq(0, 65), | ||||
|     Map = {[ {X, X*2} || X <- Ints ] ++ [{<<"hage">>, 324}, {43542, [nil, true, false]}]}, | ||||
|     {Map2, <<>>} = msgpack:unpack(msgpack:pack(Map)), | ||||
|     ?assertEqual(Map, Map2), | ||||
|     ok. | ||||
|  | ||||
| unknown_test()-> | ||||
|     Port = open_port({spawn, "ruby testcase_generator.rb"}, [binary, eof]), | ||||
|     Tests = [0, 1, 2, 123, 512, 1230, 678908, | ||||
| 	     -1, -23, -512, -1230, -567898, | ||||
| 	     <<"hogehoge">>, <<"243546rf7g68h798j">>, | ||||
| 	     123.123, | ||||
| 	     -234.4355, 1.0e-34, 1.0e64, | ||||
| 	     [23, 234, 0.23], | ||||
| 	     [0,42,<<"sum">>, [1,2]], [1,42, nil, [3]], | ||||
| 	     {[{1,2},{<<"hoge">>,nil}]}, % map | ||||
| 	     -234, -50000, | ||||
| 	     42 | ||||
| 	    ], | ||||
|     ?assertEqual(ok, compare_all(Tests, msgpack:unpack_all(port_receive(Port)))), | ||||
|     port_close(Port). | ||||
|  | ||||
| other_test()-> | ||||
|     ?assertEqual({error,incomplete},msgpack:unpack(<<>>)). | ||||
|  | ||||
| benchmark_test()-> | ||||
|     Data=[test_data() || _ <- lists:seq(0, 10000)], | ||||
|     S=?debugTime("  serialize", msgpack:pack(Data)), | ||||
|     {Data,<<>>}=?debugTime("deserialize", msgpack:unpack(S)), | ||||
|     ?debugFmt("for ~p KB test data.", [byte_size(S) div 1024]). | ||||
|  | ||||
| -endif. | ||||
| @@ -1,65 +0,0 @@ | ||||
| begin | ||||
| require 'rubygems' | ||||
| rescue LoadError | ||||
| end | ||||
| require 'msgpack' | ||||
|  | ||||
| def usage | ||||
| 	puts <<EOF | ||||
| Usage: #{$0} [out-file] | ||||
|  | ||||
| This tool is for testing of accepting MessagePack random-term. | ||||
| This does following behavior: | ||||
|  | ||||
|   1. serializes the objects in this file, using Ruby implementation | ||||
|      of MessagePack (Note that Ruby implementation is considered valid) | ||||
|   2. Writes the serialized binaries into <out-file> (default: stdout) | ||||
|  | ||||
| EOF | ||||
| 	exit 1 | ||||
| end | ||||
|  | ||||
| code = 1 | ||||
| outio = $stdout | ||||
|  | ||||
| if ARGV.length > 2 | ||||
| 	usage | ||||
| end | ||||
|  | ||||
| if fname = ARGV[0] | ||||
| 	unless fname == "-" | ||||
| 		begin | ||||
| 			outio = File.open(fname, "w") | ||||
| 		rescue | ||||
| 			puts "can't open output file: #{$!}" | ||||
| 			exit 1 | ||||
| 		end | ||||
| 	end | ||||
| end | ||||
|  | ||||
| objs = [0, 1, 2, 123, 512, 1230, 678908, | ||||
|         -1, -23, -512, -1230, -567898, | ||||
|         "hogehoge", "243546rf7g68h798j", | ||||
|         123.123, | ||||
|        -234.4355, 1.0e-34, 1.0e64, | ||||
|         [23, 234, 0.23], | ||||
|         [0,42,"sum", [1,2]], [1,42, nil, [3]], | ||||
|         { 1 => 2, "hoge" => nil }, | ||||
|         -234, -50000, | ||||
|         42 | ||||
|        ] | ||||
| begin | ||||
|   objs.each do |obj| | ||||
|     outio.write MessagePack.pack(obj) | ||||
|     outio.flush | ||||
|   end | ||||
| rescue EOFError | ||||
|   code=0 | ||||
| rescue | ||||
|   $stderr.puts $! | ||||
|   code=1 | ||||
| end | ||||
|  | ||||
| outio.close | ||||
| exit code | ||||
|  | ||||
							
								
								
									
										4
									
								
								example/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								example/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | ||||
| ADD_SUBDIRECTORY (c) | ||||
| ADD_SUBDIRECTORY (cpp03) | ||||
| ADD_SUBDIRECTORY (cpp11) | ||||
| ADD_SUBDIRECTORY (boost) | ||||
							
								
								
									
										24
									
								
								example/boost/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								example/boost/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,24 @@ | ||||
| IF (MSGPACK_BOOST) | ||||
|     LIST (APPEND exec_PROGRAMS | ||||
|         msgpack_variant_capitalize.cpp | ||||
|         msgpack_variant_mapbased.cpp | ||||
|     ) | ||||
| ENDIF () | ||||
|  | ||||
| FOREACH (source_file ${exec_PROGRAMS}) | ||||
|     GET_FILENAME_COMPONENT (source_file_we ${source_file} NAME_WE) | ||||
|     ADD_EXECUTABLE ( | ||||
|         ${source_file_we} | ||||
|         ${source_file} | ||||
|     ) | ||||
|     IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") | ||||
|         SET_PROPERTY (TARGET ${source_file_we} APPEND_STRING PROPERTY COMPILE_FLAGS "-Wall -Wextra -Werror -Wno-mismatched-tags -g -O3") | ||||
|     ENDIF () | ||||
|     IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") | ||||
|         IF (CMAKE_CXX_FLAGS MATCHES "/W[0-4]") | ||||
|             STRING(REGEX REPLACE "/W[0-4]" "/W3 /WX" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") | ||||
|         ELSE () | ||||
|             SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3 /WX") | ||||
|         ENDIF () | ||||
|     ENDIF () | ||||
| ENDFOREACH () | ||||
							
								
								
									
										94
									
								
								example/boost/msgpack_variant_capitalize.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										94
									
								
								example/boost/msgpack_variant_capitalize.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,94 @@ | ||||
| // MessagePack for C++ example | ||||
| // | ||||
| // Copyright (C) 2015 KONDO Takatoshi | ||||
| // | ||||
| //    Distributed under the Boost Software License, Version 1.0. | ||||
| //    (See accompanying file LICENSE_1_0.txt or copy at | ||||
| //    http://www.boost.org/LICENSE_1_0.txt) | ||||
| // | ||||
|  | ||||
| #include <string> | ||||
| #include <sstream> | ||||
| #include <iostream> | ||||
| #include <algorithm> | ||||
| #include <cctype> | ||||
|  | ||||
| #include <msgpack.hpp> | ||||
|  | ||||
| struct user { | ||||
|     std::string name; | ||||
|     int age; | ||||
|     std::string address; | ||||
|     MSGPACK_DEFINE(name, age, address); | ||||
| }; | ||||
|  | ||||
| struct proc:boost::static_visitor<void> { | ||||
|     void operator()(std::string& v) const { | ||||
|         std::cout << "  match std::string& v" << std::endl; | ||||
|         std::cout << "    v: " << v << std::endl; | ||||
|         std::cout << "    capitalize" << std::endl; | ||||
|         for (std::string::iterator it = v.begin(), end = v.end(); | ||||
|              it != end; | ||||
|              ++it) { | ||||
|             *it = std::toupper(*it); | ||||
|         } | ||||
|     } | ||||
|     void operator()(std::vector<msgpack::type::variant>& v) const { | ||||
|         std::cout << "match vector (msgpack::type::ARRAY)" << std::endl; | ||||
|         std::vector<msgpack::type::variant>::iterator it = v.begin(); | ||||
|         std::vector<msgpack::type::variant>::const_iterator end = v.end(); | ||||
|         for (; it != end; ++it) { | ||||
|             boost::apply_visitor(*this, *it); | ||||
|         } | ||||
|     } | ||||
|     template <typename T> | ||||
|     void operator()(T const&) const { | ||||
|         std::cout << "  match others" << std::endl; | ||||
|     } | ||||
| }; | ||||
|  | ||||
| void print(std::string const& buf) { | ||||
|     for (std::string::const_iterator it = buf.begin(), end = buf.end(); | ||||
|          it != end; | ||||
|          ++it) { | ||||
|         std::cout | ||||
|             << std::setw(2) | ||||
|             << std::hex | ||||
|             << std::setfill('0') | ||||
|             << (static_cast<int>(*it) & 0xff) | ||||
|             << ' '; | ||||
|     } | ||||
|     std::cout << std::dec << std::endl; | ||||
| } | ||||
|  | ||||
|  | ||||
| int main() { | ||||
|     std::stringstream ss1; | ||||
|     user u; | ||||
|     u.name = "Takatoshi Kondo"; | ||||
|     u.age = 42; | ||||
|     u.address = "Tokyo, JAPAN"; | ||||
|  | ||||
|     std::cout << "Packing object." << std::endl; | ||||
|     msgpack::pack(ss1, u); | ||||
|     print(ss1.str()); | ||||
|  | ||||
|     msgpack::unpacked unp1 = msgpack::unpack(ss1.str().data(), ss1.str().size()); | ||||
|     msgpack::object const& obj1 = unp1.get(); | ||||
|     std::cout << "Unpacked msgpack object." << std::endl; | ||||
|     std::cout << obj1 << std::endl; | ||||
|  | ||||
|     msgpack::type::variant v = obj1.as<msgpack::type::variant>(); | ||||
|     std::cout << "Applying proc..." << std::endl; | ||||
|     boost::apply_visitor(proc(), v); | ||||
|  | ||||
|     std::stringstream ss2; | ||||
|     std::cout << "Packing modified object." << std::endl; | ||||
|     msgpack::pack(ss2, v); | ||||
|     print(ss2.str()); | ||||
|  | ||||
|     msgpack::unpacked unp2 = msgpack::unpack(ss2.str().data(), ss2.str().size()); | ||||
|     msgpack::object const& obj2 = unp2.get(); | ||||
|     std::cout << "Modified msgpack object." << std::endl; | ||||
|     std::cout << obj2 << std::endl; | ||||
| } | ||||
							
								
								
									
										92
									
								
								example/boost/msgpack_variant_mapbased.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								example/boost/msgpack_variant_mapbased.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,92 @@ | ||||
| // MessagePack for C++ example | ||||
| // | ||||
| // Copyright (C) 2015 KONDO Takatoshi | ||||
| // | ||||
| //    Distributed under the Boost Software License, Version 1.0. | ||||
| //    (See accompanying file LICENSE_1_0.txt or copy at | ||||
| //    http://www.boost.org/LICENSE_1_0.txt) | ||||
| // | ||||
|  | ||||
| #include <string> | ||||
| #include <sstream> | ||||
| #include <iostream> | ||||
|  | ||||
| #include <msgpack.hpp> | ||||
|  | ||||
| struct user { | ||||
|     std::string name; | ||||
|     int age; | ||||
|     std::string address; | ||||
|     MSGPACK_DEFINE_MAP(name, age, address); | ||||
| }; | ||||
|  | ||||
| struct proc:boost::static_visitor<void> { | ||||
|     // msgpack::type::MAP is converted to std::multimap, not std::map. | ||||
|     void operator()(std::multimap<msgpack::type::variant_ref, msgpack::type::variant_ref>& v) const { | ||||
|         std::cout << "match map" << std::endl; | ||||
|         std::multimap<msgpack::type::variant_ref, msgpack::type::variant_ref>::iterator it = v.begin(); | ||||
|         std::multimap<msgpack::type::variant_ref, msgpack::type::variant_ref>::iterator end = v.end(); | ||||
|         while(it != end) { | ||||
|             boost::string_ref const& key = it->first.as_boost_string_ref(); | ||||
|             if (key == "name") { | ||||
|                 boost::string_ref const& value = it->second.as_boost_string_ref(); | ||||
|                 if (value == "Takatoshi Kondo") { | ||||
|                     // You can add values to msgpack::type::variant_ref. | ||||
|                     v.insert( | ||||
|                         std::multimap<msgpack::type::variant_ref, msgpack::type::variant_ref>::value_type( | ||||
|                             "role", | ||||
|                             "msgpack-c committer" | ||||
|                         ) | ||||
|                     ); | ||||
|                 } | ||||
|                 ++it; | ||||
|             } | ||||
|             else if (key == "age") { | ||||
|                 // You can remove key-value pair from msgpack::type::variant_ref | ||||
|  | ||||
| #if defined(MSGPACK_USE_CPP03) | ||||
|                 v.erase(it++); | ||||
| #else  // defined(MSGPACK_USE_CPP03) | ||||
| #  if MSGPACK_LIB_STD_CXX | ||||
|                 it = v.erase(std::multimap<msgpack::type::variant_ref, msgpack::type::variant_ref>::const_iterator(it)); | ||||
| #  else  // MSGPACK_LIB_STD_CXX | ||||
|                 it = v.erase(it); | ||||
| #  endif // MSGPACK_LIB_STD_CXX | ||||
| #endif // defined(MSGPACK_USE_CPP03) | ||||
|             } | ||||
|             else if (key == "address") { | ||||
|                 // When you want to append string | ||||
|                 // "Tokyo" -> "Tokyo, JAPAN" | ||||
|                 // Use msgpack::type::variant instead of msgpack::type::variant_ref | ||||
|                 // or do as follows: | ||||
|                 boost::string_ref const& value = it->second.as_boost_string_ref(); | ||||
|                 it->second = std::string(&value.front(), value.size()) + ", JAPAN"; | ||||
|                 ++it; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     template <typename T> | ||||
|     void operator()(T const&) const { | ||||
|         std::cout << "  match others" << std::endl; | ||||
|     } | ||||
| }; | ||||
|  | ||||
| int main() { | ||||
|     std::stringstream ss; | ||||
|     user u; | ||||
|     u.name = "Takatoshi Kondo"; | ||||
|     u.age = 42; | ||||
|     u.address = "Tokyo"; | ||||
|     msgpack::pack(ss, u); | ||||
|  | ||||
|     msgpack::unpacked unp = msgpack::unpack(ss.str().data(), ss.str().size()); | ||||
|     msgpack::object const& obj = unp.get(); | ||||
|     std::cout << "Unpacked msgpack object." << std::endl; | ||||
|     std::cout << obj << std::endl; | ||||
|     msgpack::type::variant_ref v = obj.as<msgpack::type::variant_ref>(); | ||||
|     std::cout << "Applying proc..." << std::endl; | ||||
|     boost::apply_visitor(proc(), v); | ||||
|     msgpack::zone z; | ||||
|     std::cout << "Applied msgpack object." << std::endl; | ||||
|     std::cout << msgpack::object(v, z) << std::endl; | ||||
| } | ||||
							
								
								
									
										32
									
								
								example/c/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								example/c/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,32 @@ | ||||
| INCLUDE_DIRECTORIES ( | ||||
|     ../include | ||||
| ) | ||||
|  | ||||
| LIST (APPEND exec_PROGRAMS | ||||
|     lib_buffer_unpack.c | ||||
|     simple_c.c | ||||
|     speed_test_uint32_array.c | ||||
|     speed_test_uint64_array.c | ||||
|     user_buffer_unpack.c | ||||
| ) | ||||
|  | ||||
| FOREACH (source_file ${exec_PROGRAMS}) | ||||
|     GET_FILENAME_COMPONENT (source_file_we ${source_file} NAME_WE) | ||||
|     ADD_EXECUTABLE ( | ||||
|         ${source_file_we} | ||||
|         ${source_file} | ||||
|     ) | ||||
|     TARGET_LINK_LIBRARIES (${source_file_we} | ||||
|         msgpack | ||||
|     ) | ||||
|     IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") | ||||
|         SET_PROPERTY (TARGET ${source_file_we} APPEND_STRING PROPERTY COMPILE_FLAGS "-Wall -Wextra -Werror -Wno-mismatched-tags -g -O3") | ||||
|     ENDIF () | ||||
|     IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") | ||||
|         IF (CMAKE_CXX_FLAGS MATCHES "/W[0-4]") | ||||
|             STRING(REGEX REPLACE "/W[0-4]" "/W3 /WX" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") | ||||
|         ELSE () | ||||
|             SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3 /WX") | ||||
|         ENDIF () | ||||
|     ENDIF () | ||||
| ENDFOREACH () | ||||
							
								
								
									
										122
									
								
								example/c/lib_buffer_unpack.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										122
									
								
								example/c/lib_buffer_unpack.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,122 @@ | ||||
| #include <msgpack.h> | ||||
| #include <stdio.h> | ||||
| #include <assert.h> | ||||
|  | ||||
|  | ||||
| typedef struct receiver { | ||||
|     msgpack_sbuffer sbuf; | ||||
|     size_t rest; | ||||
| } receiver; | ||||
|  | ||||
| void receiver_init(receiver *r) { | ||||
|     msgpack_packer pk; | ||||
|  | ||||
|     msgpack_sbuffer_init(&r->sbuf); | ||||
|     msgpack_packer_init(&pk, &r->sbuf, msgpack_sbuffer_write); | ||||
|     /* 1st object */ | ||||
|     msgpack_pack_array(&pk, 3); | ||||
|     msgpack_pack_int(&pk, 1); | ||||
|     msgpack_pack_true(&pk); | ||||
|     msgpack_pack_str(&pk, 7); | ||||
|     msgpack_pack_str_body(&pk, "example", 7); | ||||
|     /* 2nd object */ | ||||
|     msgpack_pack_str(&pk, 6); | ||||
|     msgpack_pack_str_body(&pk, "second", 6); | ||||
|     /* 3rd object */ | ||||
|     msgpack_pack_array(&pk, 2); | ||||
|     msgpack_pack_int(&pk, 42); | ||||
|     msgpack_pack_false(&pk); | ||||
|     r->rest = r->sbuf.size; | ||||
| } | ||||
|  | ||||
| size_t receiver_recv(receiver *r, char* buf, size_t try_size) { | ||||
|     size_t off = r->sbuf.size - r->rest; | ||||
|  | ||||
|     size_t actual_size = try_size; | ||||
|     if (actual_size > r->rest) actual_size = r->rest; | ||||
|  | ||||
|     memcpy(buf, r->sbuf.data + off, actual_size); | ||||
|     r->rest -= actual_size; | ||||
|  | ||||
|     return actual_size; | ||||
| } | ||||
|  | ||||
| size_t receiver_to_unpacker(receiver* r, size_t request_size, | ||||
|         msgpack_unpacker *unpacker) | ||||
| { | ||||
|     // make sure there's enough room, or expand the unpacker accordingly | ||||
|     if (msgpack_unpacker_buffer_capacity(unpacker) < request_size) { | ||||
|         msgpack_unpacker_reserve_buffer(unpacker, request_size); | ||||
|         assert(msgpack_unpacker_buffer_capacity(unpacker) >= request_size); | ||||
|     } | ||||
|     size_t recv_len = receiver_recv(r, msgpack_unpacker_buffer(unpacker), | ||||
|                                     request_size); | ||||
|     msgpack_unpacker_buffer_consumed(unpacker, recv_len); | ||||
|     return recv_len; | ||||
| } | ||||
|  | ||||
| #define EACH_RECV_SIZE 4 | ||||
|  | ||||
| void unpack(receiver* r) { | ||||
|     /* buf is allocated by unpacker. */ | ||||
|     msgpack_unpacker* unp = msgpack_unpacker_new(100); | ||||
|     msgpack_unpacked result; | ||||
|     msgpack_unpack_return ret; | ||||
|     size_t recv_len; | ||||
|     int recv_count = 0; | ||||
|     int i = 0; | ||||
|  | ||||
|     msgpack_unpacked_init(&result); | ||||
|     while (true) { | ||||
|         recv_len = receiver_to_unpacker(r, EACH_RECV_SIZE, unp); | ||||
|         if (recv_len == 0) break; // (reached end of input) | ||||
|         printf("receive count: %d %zd bytes received.\n", recv_count++, recv_len); | ||||
|         ret = msgpack_unpacker_next(unp, &result); | ||||
|         while (ret == MSGPACK_UNPACK_SUCCESS) { | ||||
|             msgpack_object obj = result.data; | ||||
|  | ||||
|             /* Use obj. */ | ||||
|             printf("Object no %d:\n", ++i); | ||||
|             msgpack_object_print(stdout, obj); | ||||
|             printf("\n"); | ||||
|             /* If you want to allocate something on the zone, you can use zone. */ | ||||
|             /* msgpack_zone* zone = result.zone; */ | ||||
|             /* The lifetime of the obj and the zone,  */ | ||||
|  | ||||
|             ret = msgpack_unpacker_next(unp, &result); | ||||
|         } | ||||
|         if (ret == MSGPACK_UNPACK_PARSE_ERROR) { | ||||
|             printf("The data in the buf is invalid format.\n"); | ||||
|             msgpack_unpacked_destroy(&result); | ||||
|             return; | ||||
|         } | ||||
|     } | ||||
|     msgpack_unpacked_destroy(&result); | ||||
|     msgpack_unpacker_free(unp); | ||||
| } | ||||
|  | ||||
| int main(void) { | ||||
|     receiver r; | ||||
|     receiver_init(&r); | ||||
|  | ||||
|     unpack(&r); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| /* Output */ | ||||
|  | ||||
| /* | ||||
| receive count: 0 4 bytes received. | ||||
| receive count: 1 4 bytes received. | ||||
| receive count: 2 4 bytes received. | ||||
| Object no 1: | ||||
| [1, true, "example"] | ||||
| receive count: 3 4 bytes received. | ||||
| receive count: 4 4 bytes received. | ||||
| Object no 2: | ||||
| "second" | ||||
| receive count: 5 1 bytes received. | ||||
| Object no 3: | ||||
| [42, false] | ||||
| */ | ||||
							
								
								
									
										47
									
								
								example/c/simple_c.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								example/c/simple_c.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,47 @@ | ||||
| #include <msgpack.h> | ||||
| #include <stdio.h> | ||||
|  | ||||
| void print(char const* buf, unsigned int len) | ||||
| { | ||||
|     size_t i = 0; | ||||
|     for(; i < len ; ++i) | ||||
|         printf("%02x ", 0xff & buf[i]); | ||||
|     printf("\n"); | ||||
| } | ||||
|  | ||||
| int main(void) | ||||
| { | ||||
|     msgpack_sbuffer sbuf; | ||||
|     msgpack_packer pk; | ||||
|     msgpack_zone mempool; | ||||
|     msgpack_object deserialized; | ||||
|  | ||||
|     /* msgpack::sbuffer is a simple buffer implementation. */ | ||||
|     msgpack_sbuffer_init(&sbuf); | ||||
|  | ||||
|     /* serialize values into the buffer using msgpack_sbuffer_write callback function. */ | ||||
|     msgpack_packer_init(&pk, &sbuf, msgpack_sbuffer_write); | ||||
|  | ||||
|     msgpack_pack_array(&pk, 3); | ||||
|     msgpack_pack_int(&pk, 1); | ||||
|     msgpack_pack_true(&pk); | ||||
|     msgpack_pack_str(&pk, 7); | ||||
|     msgpack_pack_str_body(&pk, "example", 7); | ||||
|  | ||||
|     print(sbuf.data, sbuf.size); | ||||
|  | ||||
|     /* deserialize the buffer into msgpack_object instance. */ | ||||
|     /* deserialized object is valid during the msgpack_zone instance alive. */ | ||||
|     msgpack_zone_init(&mempool, 2048); | ||||
|  | ||||
|     msgpack_unpack(sbuf.data, sbuf.size, NULL, &mempool, &deserialized); | ||||
|  | ||||
|     /* print the deserialized object. */ | ||||
|     msgpack_object_print(stdout, deserialized); | ||||
|     puts(""); | ||||
|  | ||||
|     msgpack_zone_destroy(&mempool); | ||||
|     msgpack_sbuffer_destroy(&sbuf); | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user