RSB  0.9.6
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Int64Converter.cpp
Go to the documentation of this file.
1 /* ============================================================
2  *
3  * This file is a part of the RSB project
4  *
5  * Copyright (C) 2010 by Johannes Wienke <jwienke at techfak dot uni-bielefeld dot de>
6  * Copyright (C) 2011, 2013 Jan Moringen <jmoringe@techfak.uni-bielefeld.de>
7  *
8  * This file may be licensed under the terms of the
9  * GNU Lesser General Public License Version 3 (the ``LGPL''),
10  * or (at your option) any later version.
11  *
12  * Software distributed under the License is distributed
13  * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either
14  * express or implied. See the LGPL for the specific language
15  * governing rights and limitations.
16  *
17  * You should have received a copy of the LGPL along with this
18  * program. If not, go to http://www.gnu.org/licenses/lgpl.html
19  * or write to the Free Software Foundation, Inc.,
20  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21  *
22  * The development of this software was supported by:
23  * CoR-Lab, Research Institute for Cognition and Robotics
24  * Bielefeld University
25  *
26  * ============================================================ */
27 
28 #include "Int64Converter.h"
29 
30 #include <boost/cstdint.hpp>
31 
32 #include "SerializationException.h"
33 
34 using namespace std;
35 
36 using namespace boost;
37 
38 namespace rsb {
39 namespace converter {
40 
41 const string Int64Converter::WIRE_SCHEMA = "int64";
42 
43 Int64Converter::Int64Converter() :
44  Converter<string> (WIRE_SCHEMA, RSB_TYPE_TAG(int64_t)) {
45 }
46 
48 }
49 
50 string Int64Converter::serialize(const AnnotatedData& data, string& wire) {
51  assert(data.first == this->getDataType());
52 
53  boost::shared_ptr<int64_t> number = boost::static_pointer_cast<int64_t>(data.second);
54  wire.resize(8);
55  for (int64_t i = 0; i < 8; ++i) {
56  wire[i] = (unsigned char) ((*number & (0xffull << (i * 8ull))) >> (i * 8ull));
57  }
58  return WIRE_SCHEMA;
59 }
60 
61 AnnotatedData Int64Converter::deserialize(const string& wireSchema,
62  const string& wire) {
63  assert(wireSchema == WIRE_SCHEMA);
64  assert(wire.size() == 8);
65 
66  boost::shared_ptr<int64_t> number(new int64_t(0));
67  for (int64_t i = 0; i < 8; ++i) {
68  *number |= ((int64_t) ((unsigned char) wire[i]) << (i * 8ull));
69  }
70  return make_pair(getDataType(), number);
71 }
72 
73 }
74 }
std::pair< std::string, boost::shared_ptr< void > > AnnotatedData
A combination of data type and the actual data.
Definition: Event.h:256
std::string serialize(const AnnotatedData &data, std::string &wire)
Serialized the given domain object to the wire.
#define RSB_TYPE_TAG(T)
Definition: Converter.h:45
virtual std::string getDataType() const
Returns the name of the data type this converter is applicable for.
Definition: Converter.h:86
static const std::string WIRE_SCHEMA
AnnotatedData deserialize(const std::string &wireSchema, const std::string &wire)
Deserializes a domain object from a wire type.