messagepack implementation for embedded systems (mbed / arduino)

Dependents:   hello_message_pack

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers float.hpp Source File

float.hpp

00001 //
00002 // MessagePack for C++ static resolution routine
00003 //
00004 // Copyright (C) 2008-2009 FURUHASHI Sadayuki
00005 //
00006 //    Distributed under the Boost Software License, Version 1.0.
00007 //    (See accompanying file LICENSE_1_0.txt or copy at
00008 //    http://www.boost.org/LICENSE_1_0.txt)
00009 //
00010 #ifndef MSGPACK_TYPE_FLOAT_HPP
00011 #define MSGPACK_TYPE_FLOAT_HPP
00012 
00013 #include "msgpack/versioning.hpp"
00014 #include "msgpack/object_fwd.hpp"
00015 #include <vector>
00016 
00017 namespace msgpack {
00018 
00019 /// @cond
00020 MSGPACK_API_VERSION_NAMESPACE(v1) {
00021 /// @endcond
00022 
00023 // FIXME check overflow, underflow
00024 
00025 namespace adaptor {
00026 
00027 template <>
00028 struct convert<float> {
00029     msgpack::object const& operator()(msgpack::object const& o, float& v) const {
00030         if(o.type == msgpack::type::FLOAT) {
00031             v = static_cast<float>(o.via.f64);
00032         }
00033         else if (o.type == msgpack::type::POSITIVE_INTEGER) {
00034             v = static_cast<float>(o.via.u64);
00035         }
00036         else if (o.type == msgpack::type::NEGATIVE_INTEGER) {
00037             v = static_cast<float>(o.via.i64);
00038         }
00039         else {
00040 //            throw msgpack::type_error();
00041         }
00042         return o;
00043     }
00044 };
00045 
00046 template <>
00047 struct pack<float> {
00048     template <typename Stream>
00049     msgpack::packer<Stream> & operator()(msgpack::packer<Stream> & o, const float& v) const {
00050         o.pack_float(v);
00051         return o;
00052     }
00053 };
00054 
00055 
00056 template <>
00057 struct convert<double> {
00058     msgpack::object const& operator()(msgpack::object const& o, double& v) const {
00059         if(o.type == msgpack::type::FLOAT) {
00060             v = o.via.f64;
00061         }
00062         else if (o.type == msgpack::type::POSITIVE_INTEGER) {
00063             v = static_cast<double>(o.via.u64);
00064         }
00065         else if (o.type == msgpack::type::NEGATIVE_INTEGER) {
00066             v = static_cast<double>(o.via.i64);
00067         }
00068         else {
00069 //            throw msgpack::type_error();
00070         }
00071         return o;
00072     }
00073 };
00074 
00075 template <>
00076 struct pack<double> {
00077     template <typename Stream>
00078     msgpack::packer<Stream> & operator()(msgpack::packer<Stream> & o, const double& v) const {
00079         o.pack_double(v);
00080         return o;
00081     }
00082 };
00083 
00084 
00085 template <>
00086 struct object<float> {
00087     void operator()(msgpack::object& o, float v) const {
00088         o.type = msgpack::type::FLOAT;
00089         o.via.f64 = static_cast<double>(v);
00090     }
00091 };
00092 
00093 template <>
00094 struct object<double> {
00095     void operator()(msgpack::object& o, double v) const {
00096         o.type = msgpack::type::FLOAT;
00097         o.via.f64 = v;
00098     }
00099 };
00100 
00101 template <>
00102 struct object_with_zone<float> {
00103     void operator()(msgpack::object::with_zone& o, float v) const {
00104         static_cast<msgpack::object&>(o) << v;
00105     }
00106 };
00107 
00108 template <>
00109 struct object_with_zone<double> {
00110     void operator()(msgpack::object::with_zone& o, double v) const {
00111         static_cast<msgpack::object&>(o) << v;
00112     }
00113 };
00114 
00115 } // namespace adaptor
00116 
00117 /// @cond
00118 }  // MSGPACK_API_VERSION_NAMESPACE(v1)
00119 /// @endcond
00120 
00121 }  // namespace msgpack
00122 
00123 #endif // MSGPACK_TYPE_FLOAT_HPP