13 #ifndef CARBONATE_H_INCLUDED
14 #define CARBONATE_H_INCLUDED
22 typedef unsigned char carbon_t;
34 const int k_carbon_footprint = -8;
35 const int k_base_offset = -k_carbon_footprint;
36 const int k_type_offset = 4;
37 const uint32_t k_carbon_id = 0xA9;
39 const uint32_t k_size_mask = 0x00FFFFFF;
46 template<
typename T,
typename U >
47 U& struct_to_msg(T& src, U& dest)
55 template<
typename T,
typename U >
56 U& msg_to_struct(T& src, U& dest)
64 template<
typename T,
typename U >
73 template<
typename T,
typename U >
74 U& msg_to_struct(T& src, U& dest)
85 carbon_t* carbon_ptr(Hg_msg_t* p_msg)
92 carbon_t* p_base =
static_cast<carbon_t*
>(p_msg);
93 std::advance(p_base, k_base_offset);
97 || p_base[0] != k_carbon_id)
105 carbon_t* carbon_ptr(
const Hg_msg_t* p_msg)
107 return carbon_ptr(const_cast<Hg_msg_t*>(p_msg));
114 size_t carbon_size(
const Hg_msg_t* p_msg)
116 carbon_t* p_base = carbon_ptr(p_msg);
121 memcpy(&size, p_base, 4);
123 return size & k_size_mask;
130 Hg_type_t carbon_type(
const Hg_msg_t* p_msg)
132 carbon_t* p_base = carbon_ptr(p_msg);
137 memcpy(&type, p_base + k_type_offset, 4);
149 #include <CarbonTestDefs.h>
151 #include <Pb/type_list.h>
152 #include <Pb/size_at.h>
163 #define k_color_map 0
169 template< Hg_type_t IdT,
172 T* Hg_msg_cast(C::carbon_t* p_msg);
175 Hg::color_map_t* Hg_msg_cast<k_color_map, Hg::color_map_t>(C::carbon_t* p_msg)
177 return reinterpret_cast<Hg::color_map_t*
>(p_msg);
181 Hg::pt3d_t* Hg_msg_cast<k_pt3d, Hg::pt3d_t>(C::carbon_t* p_msg)
183 return reinterpret_cast<Hg::pt3d_t*
>(p_msg);
187 Hg::ray_t* Hg_msg_cast<k_ray, Hg::ray_t>(C::carbon_t* p_msg)
189 return reinterpret_cast<Hg::ray_t*
>(p_msg);
193 Hg::vertex_t* Hg_msg_cast<k_vertex, Hg::vertex_t>(C::carbon_t* p_msg)
195 return reinterpret_cast<Hg::vertex_t*
>(p_msg);
199 size_t GetTypeSize(
int v)
219 size_t GetTotalSize(Hg_msg_t* p_src)
224 Hg_type_t
id = C::carbon_type(p_src);
231 Hg::color_map_t* m = Hg_msg_cast<k_color_map, Hg::color_map_t>(p_src);
236 Hg::pt3d_t* m = Hg_msg_cast<k_pt3d, Hg::pt3d_t>(p_src);
241 Hg::ray_t* m = Hg_msg_cast<k_ray, Hg::ray_t>(p_src);
246 Hg::vertex_t* m = Hg_msg_cast<k_vertex, Hg::vertex_t>(p_src);