messagepack implementation for embedded systems (mbed / arduino)
Dependents: hello_message_pack
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
Generated on Tue Jul 12 2022 22:51:45 by 1.7.2