Tuple.cpp
Go to the documentation of this file.
1/*
2 * This file is part of ArmarX.
3 *
4 * Copyright (C) 2012-2016, High Performance Humanoid Technologies (H2T),
5 * Karlsruhe Institute of Technology (KIT), all rights reserved.
6 *
7 * ArmarX is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 *
11 * ArmarX is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 *
19 * @author Fabian Peller-Konrad (fabian dot peller-konrad at kit dot edu)
20 * @copyright http://www.gnu.org/licenses/gpl-2.0.txt
21 * GNU General Public License
22 */
23
24// Header
25#include "Tuple.h"
26
27#include <SimoxUtility/algorithm/vector.hpp>
28#include <SimoxUtility/meta/type_name.h>
29
31{
33 detail::ContainerGenerator<type::Tuple, Tuple>(
34 "std::tuple<" + simox::alg::join(ExtractCppTypenames(e.getAcceptedTypes()), ", ") + ">",
35 "std::tuple<" + simox::alg::join(ExtractCppTypenames(e.getAcceptedTypes()), ", ") + ">",
36 simox::meta::get_type_name<data::dto::List>(),
37 simox::meta::get_type_name<type::dto::Tuple>(),
38 e)
39 {
40 }
41
42 std::vector<std::string>
44 {
45 std::vector<std::string> ret;
46 for (const auto& child : type.getAcceptedTypes())
47 {
48 auto child_s = FromAronType(*child);
49 ret = simox::alg::appended(ret, child_s->getRequiredIncludes());
50 }
51 return ret;
52 }
53
55 Tuple::getResetSoftBlock(const std::string& cppAccessor) const
56 {
57 CppBlockPtr block_if_data = std::make_shared<CppBlock>();
58 std::string resolved_accessor = resolveMaybeAccessor(cppAccessor);
59
60 unsigned int i = 0;
61 for (const auto& child : type.getAcceptedTypes())
62 {
63 auto child_s = FromAronType(*child);
64 CppBlockPtr b2 = child_s->getResetSoftBlock("std::get<" + std::to_string(i++) + ">(" +
65 resolved_accessor + ")");
66 block_if_data->appendBlock(b2);
67 }
68 return this->resolveMaybeResetSoftBlock(block_if_data, cppAccessor);
69 }
70
72 Tuple::getWriteTypeBlock(const std::string& typeAccessor,
73 const std::string& cppAccessor,
74 const Path& p,
75 std::string& variantAccessor) const
76 {
77 CppBlockPtr block_if_data = std::make_shared<CppBlock>();
78 std::string resolved_accessor = resolveMaybeAccessor(cppAccessor);
79 std::string escaped_accessor = EscapeAccessor(cppAccessor);
80 variantAccessor = ARON_VARIANT_RETURN_ACCESSOR + "_" + escaped_accessor;
81
82 const std::string acceptedTypesAccessor = variantAccessor + "_tupleAcceptedTypes";
83 block_if_data->addLine("std::vector<_Aron_T> " + acceptedTypesAccessor + ";");
84
85 unsigned int i = 0;
86 for (const auto& type : type.getAcceptedTypes())
87 {
88 std::string accessor_iterator =
89 "std::get<" + std::to_string(i) + ">(" + resolved_accessor + ");";
90 auto type_s = FromAronType(*type);
91 std::string nextVariantAccessor;
92 Path nextPath = p.withAcceptedTypeIndex(i++);
93 CppBlockPtr b2 = type_s->getWriteTypeBlock(type_s->getInstantiatedCppTypename(),
94 accessor_iterator,
95 nextPath,
96 nextVariantAccessor);
97 block_if_data->appendBlock(b2);
98 block_if_data->addLine(acceptedTypesAccessor + ".push_back(" + nextVariantAccessor +
99 ");");
100 }
101 block_if_data->addLine("auto " + variantAccessor + " = " + ARON_WRITER_ACCESSOR +
102 ".writeTuple(" + acceptedTypesAccessor + ", " +
103 conversion::Maybe2CppString.at(type.getMaybe()) + ", " +
104 "armarx::aron::Path(" + ARON_PATH_ACCESSOR + ", {" +
105 simox::alg::join(p.getPath(), ", ") + "})); // of " + cppAccessor);
106 return block_if_data;
107 }
108
110 Tuple::getWriteBlock(const std::string& cppAccessor,
111 const Path& p,
112 std::string& variantAccessor) const
113 {
114 CppBlockPtr block_if_data = std::make_shared<CppBlock>();
115 std::string resolved_accessor = resolveMaybeAccessor(cppAccessor);
116 std::string escaped_accessor = EscapeAccessor(cppAccessor);
117 variantAccessor = ARON_VARIANT_RETURN_ACCESSOR + "_" + escaped_accessor;
118
119 const std::string elementsAccessor = variantAccessor + "_tupleElements";
120 block_if_data->addLine("std::vector<_Aron_T> " + elementsAccessor + ";");
121
122 unsigned int i = 0;
123 for (const auto& type : type.getAcceptedTypes())
124 {
125 std::string accessor_iterator =
126 "std::get<" + std::to_string(i) + ">(" + resolved_accessor + ");";
127 auto type_s = FromAronType(*type);
128 std::string nextVariantAccessor;
129 Path nextPath = p.withElement("\"" + std::to_string(i++) + "\"");
130 CppBlockPtr b2 =
131 type_s->getWriteBlock(accessor_iterator, nextPath, nextVariantAccessor);
132 block_if_data->addLine("auto " + nextVariantAccessor + " = " + ARON_WRITER_ACCESSOR +
133 ".writeNull();");
134 block_if_data->appendBlock(b2);
135 block_if_data->addLine(elementsAccessor + ".push_back(" + nextVariantAccessor + ");");
136 }
137
138 block_if_data->addLine(variantAccessor + " = " + ARON_WRITER_ACCESSOR + ".writeTuple(" +
139 elementsAccessor + ", " + "armarx::aron::Path(" +
140 ARON_PATH_ACCESSOR + ", {" + simox::alg::join(p.getPath(), ", ") +
141 "})); // of " + cppAccessor);
142 return resolveMaybeWriteBlock(block_if_data, cppAccessor);
143 }
144
146 Tuple::getReadBlock(const std::string& cppAccessor, const std::string& variantAccessor) const
147 {
148 CppBlockPtr block_if_data = std::make_shared<CppBlock>();
149 std::string escaped_accessor = EscapeAccessor(cppAccessor);
150 std::string resolved_accessor = resolveMaybeAccessor(cppAccessor);
151 std::string elements_accessor =
152 ARON_VARIABLE_PREFIX + "_" + escaped_accessor + "_tupleElements";
153
154 block_if_data->addLine("std::vector<_Aron_TNonConst> " + elements_accessor + ";");
155 block_if_data->addLine("" + ARON_READER_ACCESSOR + ".readList(" + elements_accessor +
156 "); // of " + cppAccessor);
157
158 unsigned int i = 0;
159 for (const auto& type : type.getAcceptedTypes())
160 {
161 auto type_s = FromAronType(*type);
162 CppBlockPtr b2 = type_s->getReadBlock(
163 "std::get<" + std::to_string(i) + ">(" + resolved_accessor + ")",
164 elements_accessor + "[" + std::to_string(i) + "]");
165 block_if_data->appendBlock(b2);
166 i++;
167 }
168 return resolveMaybeReadBlock(block_if_data, cppAccessor, variantAccessor);
169 }
170} // namespace armarx::aron::codegenerator::cpp::generator
The Path class.
Definition Path.h:36
std::vector< std::string > getPath() const
Definition Path.cpp:87
Path withElement(const std::string &, bool escape=false) const
Definition Path.cpp:163
Path withAcceptedTypeIndex(int, bool escape=false) const
Definition Path.cpp:185
std::string resolveMaybeAccessor(const std::string &) const
CppBlockPtr resolveMaybeReadBlock(const CppBlockPtr &, const std::string &, const std::string &) const
static std::string EscapeAccessor(const std::string &)
Definition Generator.cpp:53
CppBlockPtr resolveMaybeResetSoftBlock(const CppBlockPtr &, const std::string &) const
static const std::string ARON_READER_ACCESSOR
Definition Generator.h:164
static std::vector< std::string > ExtractCppTypenames(const std::vector< type::VariantPtr > &)
Definition Generator.cpp:80
static const std::string ARON_PATH_ACCESSOR
Definition Generator.h:163
static const std::string ARON_VARIABLE_PREFIX
Definition Generator.h:160
static const std::string ARON_WRITER_ACCESSOR
Definition Generator.h:165
static std::unique_ptr< Generator > FromAronType(const type::Variant &)
Definition Generator.cpp:91
static const std::string ARON_VARIANT_RETURN_ACCESSOR
Definition Generator.h:167
CppBlockPtr resolveMaybeWriteBlock(const CppBlockPtr &, const std::string &) const
CppBlockPtr getReadBlock(const std::string &cppAccessor, const std::string &variantAccessor) const final
Definition Tuple.cpp:146
std::vector< std::string > getRequiredIncludes() const final
Definition Tuple.cpp:43
CppBlockPtr getWriteTypeBlock(const std::string &typeAccessor, const std::string &cppAccessor, const Path &, std::string &variantAccessor) const final
Definition Tuple.cpp:72
CppBlockPtr getWriteBlock(const std::string &cppAccessor, const Path &, std::string &variantAccessor) const final
Definition Tuple.cpp:110
CppBlockPtr getResetSoftBlock(const std::string &cppAccessor) const final
Definition Tuple.cpp:55
The Tuple class.
Definition Tuple.h:39
const std::map< type::Maybe, std::string > Maybe2CppString
Definition Generator.h:48
A convenience header to include all aron files (full include, not forward declared)
std::shared_ptr< CppBlock > CppBlockPtr
Definition CppBlock.h:37
Definition Impl.cpp:41