123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602 |
- //
- // MessagePack for C++ serializing routine
- //
- // Copyright (C) 2008-2016 FURUHASHI Sadayuki and KONDO Takatoshi
- //
- // Distributed under the Boost Software License, Version 1.0.
- // (See accompanying file LICENSE_1_0.txt or copy at
- // http://www.boost.org/LICENSE_1_0.txt)
- //
- #ifndef MSGPACK_V1_PACK_HPP
- #define MSGPACK_V1_PACK_HPP
- #include "msgpack/v1/pack_decl.hpp"
- #include <stdexcept>
- #include <limits>
- #include <cstring>
- #include <climits>
- namespace msgpack {
- /// @cond
- MSGPACK_API_VERSION_NAMESPACE(v1) {
- /// @endcond
- /// The class template that supports continuous packing.
- /**
- * @tparam Stream Any type that have a member function `Stream write(const char*, size_t s)`
- *
- */
- template <typename Stream>
- class packer {
- public:
- /// Constructor
- /**
- * This constructor is left for compatibility.
- * Use `packer(Stream& s)` instead of the constructor.
- *
- * @param s A pointer to packing destination stream object.
- */
- packer(Stream* s);
- /// Constructor
- /**
- * @param s Packing destination stream object.
- */
- packer(Stream& s);
- public:
- /// Packing function template
- /**
- * @tparam T The type of packing object.
- *
- * @param v a packing object.
- *
- * @return The reference of `*this`.
- */
- template <typename T>
- packer<Stream>& pack(const T& v);
- /// Packing uint8
- /**
- * The byte size of the packed data depends on `d`.
- * The packed type is positive fixnum or uint8.
- * The minimum byte size expression is used.
- * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int
- *
- * @param d a packing object.
- *
- * @return The reference of `*this`.
- */
- packer<Stream>& pack_uint8(uint8_t d);
- /// Packing uint16
- /**
- * The byte size of the packed data depends on `d`.
- * The packed type is positive fixnum, uint8 or uint16.
- * The minimum byte size expression is used.
- * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int
- *
- * @param d a packing object.
- *
- * @return The reference of `*this`.
- */
- packer<Stream>& pack_uint16(uint16_t d);
- /// Packing uint32
- /**
- * The byte size of the packed data depends on `d`.
- * The packed type is positive fixnum, uint8, uint16 or uint32.
- * The minimum byte size expression is used.
- * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int
- *
- * @param d a packing object.
- *
- * @return The reference of `*this`.
- */
- packer<Stream>& pack_uint32(uint32_t d);
- /// Packing uint16
- /**
- * The byte size of the packed data depends on `d`.
- * The packed type is positive fixnum, uint8, uint16, uint32 or uint64.
- * The minimum byte size expression is used.
- * positive fixnum, uint8, uint16, or uint32 is used.
- * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int
- *
- * @param d a packing object.
- *
- * @return The reference of `*this`.
- */
- packer<Stream>& pack_uint64(uint64_t d);
- /// Packing int8
- /**
- * The byte size of the packed data depends on `d`.
- * If `d` is zero or positive, the packed type is positive fixnum, or uint8,
- * else the packed type is negative fixnum, or int8
- * The minimum byte size expression is used.
- * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int
- *
- * @param d a packing object.
- *
- * @return The reference of `*this`.
- */
- packer<Stream>& pack_int8(int8_t d);
- /// Packing int16
- /**
- * The byte size of the packed data depends on `d`.
- * If `d` is zero or positive, the packed type is positive fixnum, uint8, or uint16,
- * else the packed type is negative fixnum, int8, or int16.
- * The minimum byte size expression is used.
- * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int
- *
- * @param d a packing object.
- *
- * @return The reference of `*this`.
- */
- packer<Stream>& pack_int16(int16_t d);
- /// Packing int32
- /**
- * The byte size of the packed data depends on `d`.
- * If `d` is zero or positive, the packed type is positive fixnum, uint8, uint16, or uint32,
- * else the packed type is negative fixnum, int8, int16, or int32.
- * The minimum byte size expression is used.
- * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int
- *
- * @param d a packing object.
- *
- * @return The reference of `*this`.
- */
- packer<Stream>& pack_int32(int32_t d);
- /// Packing int32
- /**
- * The byte size of the packed data depends on `d`.
- * If `d` is zero or positive, the packed type is positive fixnum, uint8, uint16, uint32, or uint64,
- * else the packed type is negative fixnum, int8, int16, int32, or int64.
- * The minimum byte size expression is used.
- * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int
- *
- * @param d a packing object.
- *
- * @return The reference of `*this`.
- */
- packer<Stream>& pack_int64(int64_t d);
- /// Packing uint8 (fixed packed type).
- /**
- * The packed type is always uint8.
- * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int
- *
- * @param d a packing object.
- *
- * @return The reference of `*this`.
- */
- packer<Stream>& pack_fix_uint8(uint8_t d);
- /// Packing uint8 (fixed packed type).
- /**
- * The packed type is always uint16.
- * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int
- *
- * @param d a packing object.
- *
- * @return The reference of `*this`.
- */
- packer<Stream>& pack_fix_uint16(uint16_t d);
- /// Packing uint8 (fixed packed type).
- /**
- * The packed type is always uint32.
- * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int
- *
- * @param d a packing object.
- *
- * @return The reference of `*this`.
- */
- packer<Stream>& pack_fix_uint32(uint32_t d);
- /// Packing uint8 (fixed packed type).
- /**
- * The packed type is always uint64.
- * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int
- *
- * @param d a packing object.
- *
- * @return The reference of `*this`.
- */
- packer<Stream>& pack_fix_uint64(uint64_t d);
- /// Packing uint8 (fixed packed type).
- /**
- * The packed type is always int8.
- * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int
- *
- * @param d a packing object.
- *
- * @return The reference of `*this`.
- */
- packer<Stream>& pack_fix_int8(int8_t d);
- /// Packing uint8 (fixed packed type).
- /**
- * The packed type is always int16.
- * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int
- *
- * @param d a packing object.
- *
- * @return The reference of `*this`.
- */
- packer<Stream>& pack_fix_int16(int16_t d);
- /// Packing uint8 (fixed packed type).
- /**
- * The packed type is always int32.
- * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int
- *
- * @param d a packing object.
- *
- * @return The reference of `*this`.
- */
- packer<Stream>& pack_fix_int32(int32_t d);
- /// Packing uint8 (fixed packed type).
- /**
- * The packed type is always int64.
- * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int
- *
- * @param d a packing object.
- *
- * @return The reference of `*this`.
- */
- packer<Stream>& pack_fix_int64(int64_t d);
- /// Packing char
- /**
- * The byte size of the packed data depends on `d`.
- * If `d` is zero or positive, the packed type is positive fixnum, or uint*,
- * else the packed type is negative fixnum, or int*
- * The minimum byte size expression is used.
- * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int
- *
- * @param d a packing object.
- *
- * @return The reference of `*this`.
- */
- packer<Stream>& pack_char(char d);
- /// Packing signed char
- /**
- * The byte size of the packed data depends on `d`.
- * If `d` is zero or positive, the packed type is positive fixnum, or uint*,
- * else the packed type is negative fixnum, or int*
- * The minimum byte size expression is used.
- * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int
- *
- * @param d a packing object.
- *
- * @return The reference of `*this`.
- */
- packer<Stream>& pack_signed_char(signed char d);
- /// Packing short
- /**
- * The byte size of the packed data depends on `d`.
- * If `d` is zero or positive, the packed type is positive fixnum, or uint*,
- * else the packed type is negative fixnum, or int*
- * The minimum byte size expression is used.
- * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int
- *
- * @param d a packing object.
- *
- * @return The reference of `*this`.
- */
- packer<Stream>& pack_short(short d);
- /// Packing int
- /**
- * The byte size of the packed data depends on `d`.
- * If `d` is zero or positive, the packed type is positive fixnum, or uint*,
- * else the packed type is negative fixnum, or int*
- * The minimum byte size expression is used.
- * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int
- *
- * @param d a packing object.
- *
- * @return The reference of `*this`.
- */
- packer<Stream>& pack_int(int d);
- /// Packing long
- /**
- * The byte size of the packed data depends on `d`.
- * If `d` is zero or positive, the packed type is positive fixnum, or uint*,
- * else the packed type is negative fixnum, or int*
- * The minimum byte size expression is used.
- * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int
- *
- * @param d a packing object.
- *
- * @return The reference of `*this`.
- */
- packer<Stream>& pack_long(long d);
- /// Packing long long
- /**
- * The byte size of the packed data depends on `d`.
- * If `d` is zero or positive, the packed type is positive fixnum, or uint*,
- * else the packed type is negative fixnum, or int*
- * The minimum byte size expression is used.
- * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int
- *
- * @param d a packing object.
- *
- * @return The reference of `*this`.
- */
- packer<Stream>& pack_long_long(long long d);
- /// Packing unsigned char
- /**
- * The byte size of the packed data depends on `d`.
- * The packed type is positive fixnum, or uint*.
- * The minimum byte size expression is used.
- * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int
- *
- * @param d a packing object.
- *
- * @return The reference of `*this`.
- */
- packer<Stream>& pack_unsigned_char(unsigned char d);
- /// Packing unsigned short
- /**
- * The byte size of the packed data depends on `d`.
- * The packed type is positive fixnum, or uint*.
- * The minimum byte size expression is used.
- * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int
- *
- * @param d a packing object.
- *
- * @return The reference of `*this`.
- */
- packer<Stream>& pack_unsigned_short(unsigned short d);
- /// Packing unsigned int
- /**
- * The byte size of the packed data depends on `d`.
- * The packed type is positive fixnum, or uint*.
- * The minimum byte size expression is used.
- * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int
- *
- * @param d a packing object.
- *
- * @return The reference of `*this`.
- */
- packer<Stream>& pack_unsigned_int(unsigned int d);
- /// Packing unsigned long
- /**
- * The byte size of the packed data depends on `d`.
- * The packed type is positive fixnum, or uint*.
- * The minimum byte size expression is used.
- * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int
- *
- * @param d a packing object.
- *
- * @return The reference of `*this`.
- */
- packer<Stream>& pack_unsigned_long(unsigned long d);
- /// Packing unsigned long long
- /**
- * The byte size of the packed data depends on `d`.
- * The packed type is positive fixnum, or uint*.
- * The minimum byte size expression is used.
- * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-int
- *
- * @param d a packing object.
- *
- * @return The reference of `*this`.
- */
- packer<Stream>& pack_unsigned_long_long(unsigned long long d);
- /// Packing float
- /**
- * The packed type is float32.
- * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-float
- *
- * @param d a packing object.
- *
- * @return The reference of `*this`.
- */
- packer<Stream>& pack_float(float d);
- /// Packing double
- /**
- * The packed type is float64.
- * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-float
- *
- * @param d a packing object.
- *
- * @return The reference of `*this`.
- */
- packer<Stream>& pack_double(double d);
- /// Packing nil
- /**
- * The packed type is nil.
- * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-nil
- *
- * @return The reference of `*this`.
- */
- packer<Stream>& pack_nil();
- /// Packing true
- /**
- * The packed type is bool, value is true.
- * See https://github.com/msgpack/msgpack/blob/master/spec.md#bool-format-family
- *
- * @return The reference of `*this`.
- */
- packer<Stream>& pack_true();
- /// Packing false
- /**
- * The packed type is bool, value is false.
- * See https://github.com/msgpack/msgpack/blob/master/spec.md#bool-format-family
- *
- * @return The reference of `*this`.
- */
- packer<Stream>& pack_false();
- /// Packing array header and size
- /**
- * The packed type is array header and array size.
- * You need to pack `n` msgpack objects following this header and size.
- * See https://github.com/msgpack/msgpack/blob/master/spec.md#array-format-family
- *
- * @param n The number of array elements (array size).
- *
- * @return The reference of `*this`.
- */
- packer<Stream>& pack_array(uint32_t n);
- /// Packing map header and size
- /**
- * The packed type is map header and map size.
- * You need to pack `n` pairs of msgpack objects following this header and size.
- * See https://github.com/msgpack/msgpack/blob/master/spec.md#map-format-family
- *
- * @param n The number of array elements (array size).
- *
- * @return The reference of `*this`.
- */
- packer<Stream>& pack_map(uint32_t n);
- /// Packing str header and length
- /**
- * The packed type is str header and length.
- * The minimum byte size length expression is used.
- * You need to call `pack_str_body(const char* b, uint32_t l)` after this function calling with the same `l` value.
- * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-str
- *
- * @param l The length of string.
- *
- * @return The reference of `*this`.
- */
- packer<Stream>& pack_str(uint32_t l);
- /// Packing str body
- /**
- * You need to call this function just after `pack_str(uint32_t l)` calling.
- * The value `l` should be the same as `pack_str(uint32_t l)` argument `l`.
- * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-str
- *
- * @param l The length of string.
- *
- * @return The reference of `*this`.
- */
- packer<Stream>& pack_str_body(const char* b, uint32_t l);
- /// Packing raw (v4) header and length
- /**
- * The packed type is raw header and length.
- * The minimum byte size length expression is used.
- * The format raw (v4) is old MessagePack version4 format.
- * You need to call `pack_v4raw_body(const char* b, uint32_t l)` after this function calling with the same `l` value.
- * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-str
- *
- * @param l The length of string.
- *
- * @return The reference of `*this`.
- */
- packer<Stream>& pack_v4raw(uint32_t l);
- /// Packing raw (v4) body
- /**
- * The format raw (v4) is old MessagePack version4 format.
- * You need to call this function just after `pack_v4raw(uint32_t l)` calling.
- * The value `l` should be the same as `pack_v4raw(uint32_t l)` argument `l`.
- * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-str
- *
- * @param l The length of string.
- *
- * @return The reference of `*this`.
- */
- packer<Stream>& pack_v4raw_body(const char* b, uint32_t l);
- /// Packing bin header and length
- /**
- * The packed type is bin header and length.
- * The minimum byte size length expression is used.
- * You need to call `pack_bin_body(const char* b, uint32_t l)` after this function calling with the same `l` value.
- * See https://github.com/msgpack/msgpack/blob/master/spec.md#bin-format-family
- *
- * @param l The length of string.
- *
- * @return The reference of `*this`.
- */
- packer<Stream>& pack_bin(uint32_t l);
- /// Packing bin body
- /**
- * You need to call this function just after `pack_bin(uint32_t l)` calling.
- * The value `l` should be the same as `pack_bin(uint32_t l)` argument `l`.
- * See https://github.com/msgpack/msgpack/blob/master/spec.md#bin-format-family
- *
- * @param l The length of string.
- *
- * @return The reference of `*this`.
- */
- packer<Stream>& pack_bin_body(const char* b, uint32_t l);
- /// Packing ext header, type, and length
- /**
- * The packed type is ext.
- * The minimum byte size length expression is used.
- * The length 1, 2, 4, 8, and 16 can be encoded in the header.
- * You need to call `pack_ext_body(const char* b, uint32_t l)` after this function calling with the same `l` value.
- * See https://github.com/msgpack/msgpack/blob/master/spec.md#formats-ext
- *
- * @param l The length of string.
- *
- * @return The reference of `*this`.
- */
- packer<Stream>& pack_ext(size_t l, int8_t type);
- /// Packing ext body
- /**
- * You need to call this function just after `pack_ext(size_t l, int8_t type)` calling.
- * The value `l` should be the same as `pack_ext(size_t l, int8_t type)` argument `l`.
- * See https://github.com/msgpack/msgpack/blob/master/spec.md#bin-format-family
- *
- * @param l The length of string.
- *
- * @return The reference of `*this`.
- */
- packer<Stream>& pack_ext_body(const char* b, uint32_t l);
- private:
- template <typename T>
- void pack_imp_uint8(T d);
- template <typename T>
- void pack_imp_uint16(T d);
- template <typename T>
- void pack_imp_uint32(T d);
- template <typename T>
- void pack_imp_uint64(T d);
- template <typename T>
- void pack_imp_int8(T d);
- template <typename T>
- void pack_imp_int16(T d);
- template <typename T>
- void pack_imp_int32(T d);
- template <typename T>
- void pack_imp_int64(T d);
- void append_buffer(const char* buf, size_t len)
- { m_stream.write(buf, len); }
- private:
- Stream& m_stream;
- #if defined(MSGPACK_USE_CPP03)
- private:
- packer(const packer&);
- packer& operator=(const packer&);
- packer();
- #else // defined(MSGPACK_USE_CPP03)
- public:
- packer(const packer&) = delete;
- packer& operator=(const packer&) = delete;
- packer() = delete;
- #endif // defined(MSGPACK_USE_CPP03)
- };
- /// Pack the value as MessagePack format into the stream
- /**
- * This function template is left for compatibility.
- * Use `void pack(Stream& s, const T& v)` instead of the function template.
- *
- * @tparam Stream Any type that have a member function `Stream write(const char*, size_t s)`
- * @tparam T Any type that is adapted to MessagePack
- * @param s The pointer to packing destination stream
- * @param v Packing value
- */
- template <typename Stream, typename T>
- inline void pack(Stream* s, const T& v)
- {
- packer<Stream>(*s).pack(v);
- }
- /// Pack the value as MessagePack format into the stream
- /**
- * @tparam Stream Any type that have a member function `Stream write(const char*, size_t s)`
- * @tparam T Any type that is adapted to MessagePack
- * @param s Packing destination stream
- * @param v Packing value
- */
- template <typename Stream, typename T>
- inline void pack(Stream& s, const T& v)
- {
- packer<Stream>(s).pack(v);
- }
- #if MSGPACK_ENDIAN_LITTLE_BYTE
- template <typename T>
- inline char take8_8(T d) {
- return static_cast<char>(reinterpret_cast<uint8_t*>(&d)[0]);
- }
- template <typename T>
- inline char take8_16(T d) {
- return static_cast<char>(reinterpret_cast<uint8_t*>(&d)[0]);
- }
- template <typename T>
- inline char take8_32(T d) {
- return static_cast<char>(reinterpret_cast<uint8_t*>(&d)[0]);
- }
- template <typename T>
- inline char take8_64(T d) {
- return static_cast<char>(reinterpret_cast<uint8_t*>(&d)[0]);
- }
- #elif MSGPACK_ENDIAN_BIG_BYTE
- template <typename T>
- inline char take8_8(T d) {
- return static_cast<char>(reinterpret_cast<uint8_t*>(&d)[0]);
- }
- template <typename T>
- inline char take8_16(T d) {
- return static_cast<char>(reinterpret_cast<uint8_t*>(&d)[1]);
- }
- template <typename T>
- inline char take8_32(T d) {
- return static_cast<char>(reinterpret_cast<uint8_t*>(&d)[3]);
- }
- template <typename T>
- inline char take8_64(T d) {
- return static_cast<char>(reinterpret_cast<uint8_t*>(&d)[7]);
- }
- #else
- #error msgpack-c supports only big endian and little endian
- #endif
- template <typename Stream>
- inline packer<Stream>::packer(Stream* s) : m_stream(*s) { }
- template <typename Stream>
- inline packer<Stream>::packer(Stream& s) : m_stream(s) { }
- template <typename Stream>
- inline packer<Stream>& packer<Stream>::pack_uint8(uint8_t d)
- { pack_imp_uint8(d); return *this; }
- template <typename Stream>
- inline packer<Stream>& packer<Stream>::pack_uint16(uint16_t d)
- { pack_imp_uint16(d); return *this; }
- template <typename Stream>
- inline packer<Stream>& packer<Stream>::pack_uint32(uint32_t d)
- { pack_imp_uint32(d); return *this; }
- template <typename Stream>
- inline packer<Stream>& packer<Stream>::pack_uint64(uint64_t d)
- { pack_imp_uint64(d); return *this; }
- template <typename Stream>
- inline packer<Stream>& packer<Stream>::pack_int8(int8_t d)
- { pack_imp_int8(d); return *this; }
- template <typename Stream>
- inline packer<Stream>& packer<Stream>::pack_int16(int16_t d)
- { pack_imp_int16(d); return *this; }
- template <typename Stream>
- inline packer<Stream>& packer<Stream>::pack_int32(int32_t d)
- { pack_imp_int32(d); return *this; }
- template <typename Stream>
- inline packer<Stream>& packer<Stream>::pack_int64(int64_t d)
- { pack_imp_int64(d); return *this;}
- template <typename Stream>
- inline packer<Stream>& packer<Stream>::pack_fix_uint8(uint8_t d)
- {
- char buf[2] = {static_cast<char>(0xccu), take8_8(d)};
- append_buffer(buf, 2);
- return *this;
- }
- template <typename Stream>
- inline packer<Stream>& packer<Stream>::pack_fix_uint16(uint16_t d)
- {
- char buf[3];
- buf[0] = static_cast<char>(0xcdu); _msgpack_store16(&buf[1], d);
- append_buffer(buf, 3);
- return *this;
- }
- template <typename Stream>
- inline packer<Stream>& packer<Stream>::pack_fix_uint32(uint32_t d)
- {
- char buf[5];
- buf[0] = static_cast<char>(0xceu); _msgpack_store32(&buf[1], d);
- append_buffer(buf, 5);
- return *this;
- }
- template <typename Stream>
- inline packer<Stream>& packer<Stream>::pack_fix_uint64(uint64_t d)
- {
- char buf[9];
- buf[0] = static_cast<char>(0xcfu); _msgpack_store64(&buf[1], d);
- append_buffer(buf, 9);
- return *this;
- }
- template <typename Stream>
- inline packer<Stream>& packer<Stream>::pack_fix_int8(int8_t d)
- {
- char buf[2] = {static_cast<char>(0xd0u), take8_8(d)};
- append_buffer(buf, 2);
- return *this;
- }
- template <typename Stream>
- inline packer<Stream>& packer<Stream>::pack_fix_int16(int16_t d)
- {
- char buf[3];
- buf[0] = static_cast<char>(0xd1u); _msgpack_store16(&buf[1], d);
- append_buffer(buf, 3);
- return *this;
- }
- template <typename Stream>
- inline packer<Stream>& packer<Stream>::pack_fix_int32(int32_t d)
- {
- char buf[5];
- buf[0] = static_cast<char>(0xd2u); _msgpack_store32(&buf[1], d);
- append_buffer(buf, 5);
- return *this;
- }
- template <typename Stream>
- inline packer<Stream>& packer<Stream>::pack_fix_int64(int64_t d)
- {
- char buf[9];
- buf[0] = static_cast<char>(0xd3u); _msgpack_store64(&buf[1], d);
- append_buffer(buf, 9);
- return *this;
- }
- template <typename Stream>
- inline packer<Stream>& packer<Stream>::pack_char(char d)
- {
- #if defined(CHAR_MIN)
- #if CHAR_MIN < 0
- pack_imp_int8(d);
- #else
- pack_imp_uint8(d);
- #endif
- #else
- #error CHAR_MIN is not defined
- #endif
- return *this;
- }
- template <typename Stream>
- inline packer<Stream>& packer<Stream>::pack_signed_char(signed char d)
- {
- pack_imp_int8(d);
- return *this;
- }
- template <typename Stream>
- inline packer<Stream>& packer<Stream>::pack_short(short d)
- {
- #if defined(SIZEOF_SHORT)
- #if SIZEOF_SHORT == 2
- pack_imp_int16(d);
- #elif SIZEOF_SHORT == 4
- pack_imp_int32(d);
- #else
- pack_imp_int64(d);
- #endif
- #elif defined(SHRT_MAX)
- #if SHRT_MAX == 0x7fff
- pack_imp_int16(d);
- #elif SHRT_MAX == 0x7fffffff
- pack_imp_int32(d);
- #else
- pack_imp_int64(d);
- #endif
- #else
- if(sizeof(short) == 2) {
- pack_imp_int16(d);
- } else if(sizeof(short) == 4) {
- pack_imp_int32(d);
- } else {
- pack_imp_int64(d);
- }
- #endif
- return *this;
- }
- template <typename Stream>
- inline packer<Stream>& packer<Stream>::pack_int(int d)
- {
- #if defined(SIZEOF_INT)
- #if SIZEOF_INT == 2
- pack_imp_int16(d);
- #elif SIZEOF_INT == 4
- pack_imp_int32(d);
- #else
- pack_imp_int64(d);
- #endif
- #elif defined(INT_MAX)
- #if INT_MAX == 0x7fff
- pack_imp_int16(d);
- #elif INT_MAX == 0x7fffffff
- pack_imp_int32(d);
- #else
- pack_imp_int64(d);
- #endif
- #else
- if(sizeof(int) == 2) {
- pack_imp_int16(d);
- } else if(sizeof(int) == 4) {
- pack_imp_int32(d);
- } else {
- pack_imp_int64(d);
- }
- #endif
- return *this;
- }
- template <typename Stream>
- inline packer<Stream>& packer<Stream>::pack_long(long d)
- {
- #if defined(SIZEOF_LONG)
- #if SIZEOF_LONG == 2
- pack_imp_int16(d);
- #elif SIZEOF_LONG == 4
- pack_imp_int32(d);
- #else
- pack_imp_int64(d);
- #endif
- #elif defined(LONG_MAX)
- #if LONG_MAX == 0x7fffL
- pack_imp_int16(d);
- #elif LONG_MAX == 0x7fffffffL
- pack_imp_int32(d);
- #else
- pack_imp_int64(d);
- #endif
- #else
- if(sizeof(long) == 2) {
- pack_imp_int16(d);
- } else if(sizeof(long) == 4) {
- pack_imp_int32(d);
- } else {
- pack_imp_int64(d);
- }
- #endif
- return *this;
- }
- template <typename Stream>
- inline packer<Stream>& packer<Stream>::pack_long_long(long long d)
- {
- #if defined(SIZEOF_LONG_LONG)
- #if SIZEOF_LONG_LONG == 2
- pack_imp_int16(d);
- #elif SIZEOF_LONG_LONG == 4
- pack_imp_int32(d);
- #else
- pack_imp_int64(d);
- #endif
- #elif defined(LLONG_MAX)
- #if LLONG_MAX == 0x7fffL
- pack_imp_int16(d);
- #elif LLONG_MAX == 0x7fffffffL
- pack_imp_int32(d);
- #else
- pack_imp_int64(d);
- #endif
- #else
- if(sizeof(long long) == 2) {
- pack_imp_int16(d);
- } else if(sizeof(long long) == 4) {
- pack_imp_int32(d);
- } else {
- pack_imp_int64(d);
- }
- #endif
- return *this;
- }
- template <typename Stream>
- inline packer<Stream>& packer<Stream>::pack_unsigned_char(unsigned char d)
- {
- pack_imp_uint8(d);
- return *this;
- }
- template <typename Stream>
- inline packer<Stream>& packer<Stream>::pack_unsigned_short(unsigned short d)
- {
- #if defined(SIZEOF_SHORT)
- #if SIZEOF_SHORT == 2
- pack_imp_uint16(d);
- #elif SIZEOF_SHORT == 4
- pack_imp_uint32(d);
- #else
- pack_imp_uint64(d);
- #endif
- #elif defined(USHRT_MAX)
- #if USHRT_MAX == 0xffffU
- pack_imp_uint16(d);
- #elif USHRT_MAX == 0xffffffffU
- pack_imp_uint32(d);
- #else
- pack_imp_uint64(d);
- #endif
- #else
- if(sizeof(unsigned short) == 2) {
- pack_imp_uint16(d);
- } else if(sizeof(unsigned short) == 4) {
- pack_imp_uint32(d);
- } else {
- pack_imp_uint64(d);
- }
- #endif
- return *this;
- }
- template <typename Stream>
- inline packer<Stream>& packer<Stream>::pack_unsigned_int(unsigned int d)
- {
- #if defined(SIZEOF_INT)
- #if SIZEOF_INT == 2
- pack_imp_uint16(d);
- #elif SIZEOF_INT == 4
- pack_imp_uint32(d);
- #else
- pack_imp_uint64(d);
- #endif
- #elif defined(UINT_MAX)
- #if UINT_MAX == 0xffffU
- pack_imp_uint16(d);
- #elif UINT_MAX == 0xffffffffU
- pack_imp_uint32(d);
- #else
- pack_imp_uint64(d);
- #endif
- #else
- if(sizeof(unsigned int) == 2) {
- pack_imp_uint16(d);
- } else if(sizeof(unsigned int) == 4) {
- pack_imp_uint32(d);
- } else {
- pack_imp_uint64(d);
- }
- #endif
- return *this;
- }
- template <typename Stream>
- inline packer<Stream>& packer<Stream>::pack_unsigned_long(unsigned long d)
- {
- #if defined(SIZEOF_LONG)
- #if SIZEOF_LONG == 2
- pack_imp_uint16(d);
- #elif SIZEOF_LONG == 4
- pack_imp_uint32(d);
- #else
- pack_imp_uint64(d);
- #endif
- #elif defined(ULONG_MAX)
- #if ULONG_MAX == 0xffffUL
- pack_imp_uint16(d);
- #elif ULONG_MAX == 0xffffffffUL
- pack_imp_uint32(d);
- #else
- pack_imp_uint64(d);
- #endif
- #else
- if(sizeof(unsigned long) == 2) {
- pack_imp_uint16(d);
- } else if(sizeof(unsigned long) == 4) {
- pack_imp_uint32(d);
- } else {
- pack_imp_uint64(d);
- }
- #endif
- return *this;
- }
- template <typename Stream>
- inline packer<Stream>& packer<Stream>::pack_unsigned_long_long(unsigned long long d)
- {
- #if defined(SIZEOF_LONG_LONG)
- #if SIZEOF_LONG_LONG == 2
- pack_imp_uint16(d);
- #elif SIZEOF_LONG_LONG == 4
- pack_imp_uint32(d);
- #else
- pack_imp_uint64(d);
- #endif
- #elif defined(ULLONG_MAX)
- #if ULLONG_MAX == 0xffffUL
- pack_imp_uint16(d);
- #elif ULLONG_MAX == 0xffffffffUL
- pack_imp_uint32(d);
- #else
- pack_imp_uint64(d);
- #endif
- #else
- if(sizeof(unsigned long long) == 2) {
- pack_imp_uint16(d);
- } else if(sizeof(unsigned long long) == 4) {
- pack_imp_uint32(d);
- } else {
- pack_imp_uint64(d);
- }
- #endif
- return *this;
- }
- template <typename Stream>
- inline packer<Stream>& packer<Stream>::pack_float(float d)
- {
- union { float f; uint32_t i; } mem;
- mem.f = d;
- char buf[5];
- buf[0] = static_cast<char>(0xcau); _msgpack_store32(&buf[1], mem.i);
- append_buffer(buf, 5);
- return *this;
- }
- template <typename Stream>
- inline packer<Stream>& packer<Stream>::pack_double(double d)
- {
- union { double f; uint64_t i; } mem;
- mem.f = d;
- char buf[9];
- buf[0] = static_cast<char>(0xcbu);
- #if defined(TARGET_OS_IPHONE)
- // ok
- #elif defined(__arm__) && !(__ARM_EABI__) // arm-oabi
- // https://github.com/msgpack/msgpack-perl/pull/1
- mem.i = (mem.i & 0xFFFFFFFFUL) << 32UL | (mem.i >> 32UL);
- #endif
- _msgpack_store64(&buf[1], mem.i);
- append_buffer(buf, 9);
- return *this;
- }
- template <typename Stream>
- inline packer<Stream>& packer<Stream>::pack_nil()
- {
- const char d = static_cast<char>(0xc0u);
- append_buffer(&d, 1);
- return *this;
- }
- template <typename Stream>
- inline packer<Stream>& packer<Stream>::pack_true()
- {
- const char d = static_cast<char>(0xc3u);
- append_buffer(&d, 1);
- return *this;
- }
- template <typename Stream>
- inline packer<Stream>& packer<Stream>::pack_false()
- {
- const char d = static_cast<char>(0xc2u);
- append_buffer(&d, 1);
- return *this;
- }
- template <typename Stream>
- inline packer<Stream>& packer<Stream>::pack_array(uint32_t n)
- {
- if(n < 16) {
- char d = static_cast<char>(0x90u | n);
- append_buffer(&d, 1);
- } else if(n < 65536) {
- char buf[3];
- buf[0] = static_cast<char>(0xdcu); _msgpack_store16(&buf[1], static_cast<uint16_t>(n));
- append_buffer(buf, 3);
- } else {
- char buf[5];
- buf[0] = static_cast<char>(0xddu); _msgpack_store32(&buf[1], static_cast<uint32_t>(n));
- append_buffer(buf, 5);
- }
- return *this;
- }
- template <typename Stream>
- inline packer<Stream>& packer<Stream>::pack_map(uint32_t n)
- {
- if(n < 16) {
- unsigned char d = static_cast<unsigned char>(0x80u | n);
- char buf = take8_8(d);
- append_buffer(&buf, 1);
- } else if(n < 65536) {
- char buf[3];
- buf[0] = static_cast<char>(0xdeu); _msgpack_store16(&buf[1], static_cast<uint16_t>(n));
- append_buffer(buf, 3);
- } else {
- char buf[5];
- buf[0] = static_cast<char>(0xdfu); _msgpack_store32(&buf[1], static_cast<uint32_t>(n));
- append_buffer(buf, 5);
- }
- return *this;
- }
- template <typename Stream>
- inline packer<Stream>& packer<Stream>::pack_str(uint32_t l)
- {
- if(l < 32) {
- unsigned char d = static_cast<uint8_t>(0xa0u | l);
- char buf = take8_8(d);
- append_buffer(&buf, 1);
- } else if(l < 256) {
- char buf[2];
- buf[0] = static_cast<char>(0xd9u); buf[1] = static_cast<uint8_t>(l);
- append_buffer(buf, 2);
- } else if(l < 65536) {
- char buf[3];
- buf[0] = static_cast<char>(0xdau); _msgpack_store16(&buf[1], static_cast<uint16_t>(l));
- append_buffer(buf, 3);
- } else {
- char buf[5];
- buf[0] = static_cast<char>(0xdbu); _msgpack_store32(&buf[1], static_cast<uint32_t>(l));
- append_buffer(buf, 5);
- }
- return *this;
- }
- template <typename Stream>
- inline packer<Stream>& packer<Stream>::pack_str_body(const char* b, uint32_t l)
- {
- append_buffer(b, l);
- return *this;
- }
- // Raw (V4)
- template <typename Stream>
- inline packer<Stream>& packer<Stream>::pack_v4raw(uint32_t l)
- {
- if(l < 32) {
- unsigned char d = static_cast<uint8_t>(0xa0u | l);
- char buf = take8_8(d);
- append_buffer(&buf, 1);
- } else if(l < 65536) {
- char buf[3];
- buf[0] = static_cast<char>(0xdau); _msgpack_store16(&buf[1], static_cast<uint16_t>(l));
- append_buffer(buf, 3);
- } else {
- char buf[5];
- buf[0] = static_cast<char>(0xdbu); _msgpack_store32(&buf[1], static_cast<uint32_t>(l));
- append_buffer(buf, 5);
- }
- return *this;
- }
- template <typename Stream>
- inline packer<Stream>& packer<Stream>::pack_v4raw_body(const char* b, uint32_t l)
- {
- append_buffer(b, l);
- return *this;
- }
- template <typename Stream>
- inline packer<Stream>& packer<Stream>::pack_bin(uint32_t l)
- {
- if(l < 256) {
- char buf[2];
- buf[0] = static_cast<char>(0xc4u); buf[1] = static_cast<uint8_t>(l);
- append_buffer(buf, 2);
- } else if(l < 65536) {
- char buf[3];
- buf[0] = static_cast<char>(0xc5u); _msgpack_store16(&buf[1], static_cast<uint16_t>(l));
- append_buffer(buf, 3);
- } else {
- char buf[5];
- buf[0] = static_cast<char>(0xc6u); _msgpack_store32(&buf[1], static_cast<uint32_t>(l));
- append_buffer(buf, 5);
- }
- return *this;
- }
- template <typename Stream>
- inline packer<Stream>& packer<Stream>::pack_bin_body(const char* b, uint32_t l)
- {
- append_buffer(b, l);
- return *this;
- }
- template <typename Stream>
- inline packer<Stream>& packer<Stream>::pack_ext(size_t l, int8_t type)
- {
- switch(l) {
- case 1: {
- char buf[2];
- buf[0] = static_cast<char>(0xd4u);
- buf[1] = static_cast<char>(type);
- append_buffer(buf, 2);
- } break;
- case 2: {
- char buf[2];
- buf[0] = static_cast<char>(0xd5u);
- buf[1] = static_cast<char>(type);
- append_buffer(buf, 2);
- } break;
- case 4: {
- char buf[2];
- buf[0] = static_cast<char>(0xd6u);
- buf[1] = static_cast<char>(type);
- append_buffer(buf, 2);
- } break;
- case 8: {
- char buf[2];
- buf[0] = static_cast<char>(0xd7u);
- buf[1] = static_cast<char>(type);
- append_buffer(buf, 2);
- } break;
- case 16: {
- char buf[2];
- buf[0] = static_cast<char>(0xd8u);
- buf[1] = static_cast<char>(type);
- append_buffer(buf, 2);
- } break;
- default:
- if(l < 256) {
- char buf[3];
- buf[0] = static_cast<char>(0xc7u);
- buf[1] = static_cast<char>(l);
- buf[2] = static_cast<char>(type);
- append_buffer(buf, 3);
- } else if(l < 65536) {
- char buf[4];
- buf[0] = static_cast<char>(0xc8u);
- _msgpack_store16(&buf[1], static_cast<uint16_t>(l));
- buf[3] = static_cast<char>(type);
- append_buffer(buf, 4);
- } else {
- char buf[6];
- buf[0] = static_cast<char>(0xc9u);
- _msgpack_store32(&buf[1], static_cast<uint32_t>(l));
- buf[5] = static_cast<char>(type);
- append_buffer(buf, 6);
- }
- break;
- }
- return *this;
- }
- template <typename Stream>
- inline packer<Stream>& packer<Stream>::pack_ext_body(const char* b, uint32_t l)
- {
- append_buffer(b, l);
- return *this;
- }
- template <typename Stream>
- template <typename T>
- inline void packer<Stream>::pack_imp_uint8(T d)
- {
- if(d < (1<<7)) {
- /* fixnum */
- char buf = take8_8(d);
- append_buffer(&buf, 1);
- } else {
- /* unsigned 8 */
- char buf[2] = {static_cast<char>(0xccu), take8_8(d)};
- append_buffer(buf, 2);
- }
- }
- template <typename Stream>
- template <typename T>
- inline void packer<Stream>::pack_imp_uint16(T d)
- {
- if(d < (1<<7)) {
- /* fixnum */
- char buf = take8_16(d);
- append_buffer(&buf, 1);
- } else if(d < (1<<8)) {
- /* unsigned 8 */
- char buf[2] = {static_cast<char>(0xccu), take8_16(d)};
- append_buffer(buf, 2);
- } else {
- /* unsigned 16 */
- char buf[3];
- buf[0] = static_cast<char>(0xcdu); _msgpack_store16(&buf[1], static_cast<uint16_t>(d));
- append_buffer(buf, 3);
- }
- }
- template <typename Stream>
- template <typename T>
- inline void packer<Stream>::pack_imp_uint32(T d)
- {
- if(d < (1<<8)) {
- if(d < (1<<7)) {
- /* fixnum */
- char buf = take8_32(d);
- append_buffer(&buf, 1);
- } else {
- /* unsigned 8 */
- char buf[2] = {static_cast<char>(0xccu), take8_32(d)};
- append_buffer(buf, 2);
- }
- } else {
- if(d < (1<<16)) {
- /* unsigned 16 */
- char buf[3];
- buf[0] = static_cast<char>(0xcdu); _msgpack_store16(&buf[1], static_cast<uint16_t>(d));
- append_buffer(buf, 3);
- } else {
- /* unsigned 32 */
- char buf[5];
- buf[0] = static_cast<char>(0xceu); _msgpack_store32(&buf[1], static_cast<uint32_t>(d));
- append_buffer(buf, 5);
- }
- }
- }
- template <typename Stream>
- template <typename T>
- inline void packer<Stream>::pack_imp_uint64(T d)
- {
- if(d < (1ULL<<8)) {
- if(d < (1ULL<<7)) {
- /* fixnum */
- char buf = take8_64(d);
- append_buffer(&buf, 1);
- } else {
- /* unsigned 8 */
- char buf[2] = {static_cast<char>(0xccu), take8_64(d)};
- append_buffer(buf, 2);
- }
- } else {
- if(d < (1ULL<<16)) {
- /* unsigned 16 */
- char buf[3];
- buf[0] = static_cast<char>(0xcdu); _msgpack_store16(&buf[1], static_cast<uint16_t>(d));
- append_buffer(buf, 3);
- } else if(d < (1ULL<<32)) {
- /* unsigned 32 */
- char buf[5];
- buf[0] = static_cast<char>(0xceu); _msgpack_store32(&buf[1], static_cast<uint32_t>(d));
- append_buffer(buf, 5);
- } else {
- /* unsigned 64 */
- char buf[9];
- buf[0] = static_cast<char>(0xcfu); _msgpack_store64(&buf[1], d);
- append_buffer(buf, 9);
- }
- }
- }
- template <typename Stream>
- template <typename T>
- inline void packer<Stream>::pack_imp_int8(T d)
- {
- if(d < -(1<<5)) {
- /* signed 8 */
- char buf[2] = {static_cast<char>(0xd0u), take8_8(d)};
- append_buffer(buf, 2);
- } else {
- /* fixnum */
- char buf = take8_8(d);
- append_buffer(&buf, 1);
- }
- }
- template <typename Stream>
- template <typename T>
- inline void packer<Stream>::pack_imp_int16(T d)
- {
- if(d < -(1<<5)) {
- if(d < -(1<<7)) {
- /* signed 16 */
- char buf[3];
- buf[0] = static_cast<char>(0xd1u); _msgpack_store16(&buf[1], static_cast<int16_t>(d));
- append_buffer(buf, 3);
- } else {
- /* signed 8 */
- char buf[2] = {static_cast<char>(0xd0u), take8_16(d)};
- append_buffer(buf, 2);
- }
- } else if(d < (1<<7)) {
- /* fixnum */
- char buf = take8_16(d);
- append_buffer(&buf, 1);
- } else {
- if(d < (1<<8)) {
- /* unsigned 8 */
- char buf[2] = {static_cast<char>(0xccu), take8_16(d)};
- append_buffer(buf, 2);
- } else {
- /* unsigned 16 */
- char buf[3];
- buf[0] = static_cast<char>(0xcdu); _msgpack_store16(&buf[1], static_cast<uint16_t>(d));
- append_buffer(buf, 3);
- }
- }
- }
- template <typename Stream>
- template <typename T>
- inline void packer<Stream>::pack_imp_int32(T d)
- {
- if(d < -(1<<5)) {
- if(d < -(1<<15)) {
- /* signed 32 */
- char buf[5];
- buf[0] = static_cast<char>(0xd2u); _msgpack_store32(&buf[1], static_cast<int32_t>(d));
- append_buffer(buf, 5);
- } else if(d < -(1<<7)) {
- /* signed 16 */
- char buf[3];
- buf[0] = static_cast<char>(0xd1u); _msgpack_store16(&buf[1], static_cast<int16_t>(d));
- append_buffer(buf, 3);
- } else {
- /* signed 8 */
- char buf[2] = { static_cast<char>(0xd0u), take8_32(d)};
- append_buffer(buf, 2);
- }
- } else if(d < (1<<7)) {
- /* fixnum */
- char buf = take8_32(d);
- append_buffer(&buf, 1);
- } else {
- if(d < (1<<8)) {
- /* unsigned 8 */
- char buf[2] = { static_cast<char>(0xccu), take8_32(d)};
- append_buffer(buf, 2);
- } else if(d < (1<<16)) {
- /* unsigned 16 */
- char buf[3];
- buf[0] = static_cast<char>(0xcdu); _msgpack_store16(&buf[1], static_cast<uint16_t>(d));
- append_buffer(buf, 3);
- } else {
- /* unsigned 32 */
- char buf[5];
- buf[0] = static_cast<char>(0xceu); _msgpack_store32(&buf[1], static_cast<uint32_t>(d));
- append_buffer(buf, 5);
- }
- }
- }
- template <typename Stream>
- template <typename T>
- inline void packer<Stream>::pack_imp_int64(T d)
- {
- if(d < -(1LL<<5)) {
- if(d < -(1LL<<15)) {
- if(d < -(1LL<<31)) {
- /* signed 64 */
- char buf[9];
- buf[0] = static_cast<char>(0xd3u); _msgpack_store64(&buf[1], d);
- append_buffer(buf, 9);
- } else {
- /* signed 32 */
- char buf[5];
- buf[0] = static_cast<char>(0xd2u); _msgpack_store32(&buf[1], static_cast<int32_t>(d));
- append_buffer(buf, 5);
- }
- } else {
- if(d < -(1<<7)) {
- /* signed 16 */
- char buf[3];
- buf[0] = static_cast<char>(0xd1u); _msgpack_store16(&buf[1], static_cast<int16_t>(d));
- append_buffer(buf, 3);
- } else {
- /* signed 8 */
- char buf[2] = {static_cast<char>(0xd0u), take8_64(d)};
- append_buffer(buf, 2);
- }
- }
- } else if(d < (1<<7)) {
- /* fixnum */
- char buf = take8_64(d);
- append_buffer(&buf, 1);
- } else {
- if(d < (1LL<<16)) {
- if(d < (1<<8)) {
- /* unsigned 8 */
- char buf[2] = {static_cast<char>(0xccu), take8_64(d)};
- append_buffer(buf, 2);
- } else {
- /* unsigned 16 */
- char buf[3];
- buf[0] = static_cast<char>(0xcdu); _msgpack_store16(&buf[1], static_cast<uint16_t>(d));
- append_buffer(buf, 3);
- }
- } else {
- if(d < (1LL<<32)) {
- /* unsigned 32 */
- char buf[5];
- buf[0] = static_cast<char>(0xceu); _msgpack_store32(&buf[1], static_cast<uint32_t>(d));
- append_buffer(buf, 5);
- } else {
- /* unsigned 64 */
- char buf[9];
- buf[0] = static_cast<char>(0xcfu); _msgpack_store64(&buf[1], d);
- append_buffer(buf, 9);
- }
- }
- }
- }
- /// @cond
- } // MSGPACK_API_VERSION_NAMESPACE(v1)
- /// @endcond
- } // namespace msgpack
- #endif // MSGPACK_V1_PACK_HPP
|