1 //
2 // MessagePack for C++ static resolution routine
3 //
4 // Copyright (C) 2008-2009 FURUHASHI Sadayuki
5 //
6 //    Distributed under the Boost Software License, Version 1.0.
7 //    (See accompanying file LICENSE_1_0.txt or copy at
8 //    http://www.boost.org/LICENSE_1_0.txt)
9 //
10 #ifndef MSGPACK_V1_TYPE_FLOAT_HPP
11 #define MSGPACK_V1_TYPE_FLOAT_HPP
12 
13 #include "msgpack/versioning.hpp"
14 #include "msgpack/object_fwd.hpp"
15 #include <vector>
16 
17 namespace msgpack {
18 
19 /// @cond
MSGPACK_API_VERSION_NAMESPACE(v1)20 MSGPACK_API_VERSION_NAMESPACE(v1) {
21 /// @endcond
22 
23 // FIXME check overflow, underflow
24 
25 namespace adaptor {
26 
27 template <>
28 struct convert<float> {
29     msgpack::object const& operator()(msgpack::object const& o, float& v) const {
30         if(o.type == msgpack::type::FLOAT32 || o.type == msgpack::type::FLOAT64) {
31             v = static_cast<float>(o.via.f64);
32         }
33         else if (o.type == msgpack::type::POSITIVE_INTEGER) {
34             v = static_cast<float>(o.via.u64);
35         }
36         else if (o.type == msgpack::type::NEGATIVE_INTEGER) {
37             v = static_cast<float>(o.via.i64);
38         }
39         else {
40             throw msgpack::type_error();
41         }
42         return o;
43     }
44 };
45 
46 template <>
47 struct pack<float> {
48     template <typename Stream>
49     msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const float& v) const {
50         o.pack_float(v);
51         return o;
52     }
53 };
54 
55 
56 template <>
57 struct convert<double> {
58     msgpack::object const& operator()(msgpack::object const& o, double& v) const {
59         if(o.type == msgpack::type::FLOAT32 || o.type == msgpack::type::FLOAT64) {
60             v = o.via.f64;
61         }
62         else if (o.type == msgpack::type::POSITIVE_INTEGER) {
63             v = static_cast<double>(o.via.u64);
64         }
65         else if (o.type == msgpack::type::NEGATIVE_INTEGER) {
66             v = static_cast<double>(o.via.i64);
67         }
68         else {
69             throw msgpack::type_error();
70         }
71         return o;
72     }
73 };
74 
75 template <>
76 struct pack<double> {
77     template <typename Stream>
78     msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const double& v) const {
79         o.pack_double(v);
80         return o;
81     }
82 };
83 
84 
85 template <>
86 struct object<float> {
87     void operator()(msgpack::object& o, float v) const {
88         o.type = msgpack::type::FLOAT32;
89         o.via.f64 = static_cast<double>(v);
90     }
91 };
92 
93 template <>
94 struct object<double> {
95     void operator()(msgpack::object& o, double v) const {
96         o.type = msgpack::type::FLOAT64;
97         o.via.f64 = v;
98     }
99 };
100 
101 template <>
102 struct object_with_zone<float> {
103     void operator()(msgpack::object::with_zone& o, float v) const {
104         static_cast<msgpack::object&>(o) << v;
105     }
106 };
107 
108 template <>
109 struct object_with_zone<double> {
110     void operator()(msgpack::object::with_zone& o, double v) const {
111         static_cast<msgpack::object&>(o) << v;
112     }
113 };
114 
115 } // namespace adaptor
116 
117 /// @cond
118 }  // MSGPACK_API_VERSION_NAMESPACE(v1)
119 /// @endcond
120 
121 }  // namespace msgpack
122 
123 #endif // MSGPACK_V1_TYPE_FLOAT_HPP
124