Line | Branch | Exec | Source |
---|---|---|---|
1 | // Copyright (c) 2014, LAAS-CNRS | ||
2 | // Authors: Joseph Mirabel (joseph.mirabel@laas.fr) | ||
3 | // | ||
4 | |||
5 | // Redistribution and use in source and binary forms, with or without | ||
6 | // modification, are permitted provided that the following conditions are | ||
7 | // met: | ||
8 | // | ||
9 | // 1. Redistributions of source code must retain the above copyright | ||
10 | // notice, this list of conditions and the following disclaimer. | ||
11 | // | ||
12 | // 2. Redistributions in binary form must reproduce the above copyright | ||
13 | // notice, this list of conditions and the following disclaimer in the | ||
14 | // documentation and/or other materials provided with the distribution. | ||
15 | // | ||
16 | // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
17 | // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
18 | // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||
19 | // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
20 | // HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
21 | // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||
22 | // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||
23 | // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||
24 | // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
25 | // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
26 | // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH | ||
27 | // DAMAGE. | ||
28 | |||
29 | #include <hpp/util/debug.hh> | ||
30 | #include <stdexcept> | ||
31 | // #include <resource_retriever/retriever.h> | ||
32 | |||
33 | #include <pinocchio/parsers/utils.hpp> // ::pinocchio::retrieveResourcePath | ||
34 | #include <pinocchio/utils/file-explorer.hpp> // ::pinocchio::rosPaths | ||
35 | |||
36 | #include "hpp/manipulation/parser/parser.hh" | ||
37 | #include "hpp/manipulation/srdf/factories.hh" | ||
38 | |||
39 | namespace hpp { | ||
40 | namespace manipulation { | ||
41 | namespace parser { | ||
42 | 9 | Parser::Parser(bool fillWithDefaultFactories, FactoryType defaultFactory) | |
43 | 9 | : root_(NULL), defaultFactory_(defaultFactory) { | |
44 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 7 times.
|
9 | if (fillWithDefaultFactories) { |
45 |
2/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
|
4 | addObjectFactory("robot", create<srdf::RobotFactory>); |
46 |
2/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
|
4 | addObjectFactory("handle", create<srdf::HandleFactory>); |
47 |
2/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
|
4 | addObjectFactory("gripper", create<srdf::GripperFactory>); |
48 |
2/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
|
4 | addObjectFactory("position", create<srdf::PositionFactory>); |
49 |
2/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
|
4 | addObjectFactory("mask", create<SequenceFactory<bool> >); |
50 |
2/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
|
4 | addObjectFactory("mask_complement", create<SequenceFactory<bool> >); |
51 |
2/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
|
4 | addObjectFactory("contact", create<srdf::ContactFactory>); |
52 |
2/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
|
4 | addObjectFactory("point", create<srdf::ContactFactory::PointFactory>); |
53 |
2/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
|
4 | addObjectFactory("triangle", create<srdf::ContactFactory::TriangleFactory>); |
54 |
2/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
|
4 | addObjectFactory("shape", create<srdf::ContactFactory::ShapeFactory>); |
55 | |||
56 | /// This removes warnings | ||
57 |
2/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
|
4 | addObjectFactory("link", create<ObjectFactory>); |
58 |
2/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
|
4 | addObjectFactory("disable_collisions", create<IgnoreTagFactory>); |
59 |
2/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
|
4 | addObjectFactory("material", create<IgnoreTagFactory>); |
60 |
2/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
|
4 | addObjectFactory("texture", create<IgnoreTagFactory>); |
61 | } | ||
62 | 9 | } | |
63 | |||
64 | 9 | Parser::~Parser() { | |
65 | 9 | for (ObjectFactoryList::iterator it = objectFactories_.begin(); | |
66 |
2/2✓ Branch 3 taken 61 times.
✓ Branch 4 taken 9 times.
|
70 | it != objectFactories_.end(); ++it) |
67 |
1/2✓ Branch 1 taken 61 times.
✗ Branch 2 not taken.
|
61 | delete *it; |
68 |
2/4✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 9 times.
✗ Branch 3 not taken.
|
9 | if (root_ != NULL) delete root_; |
69 | 9 | } | |
70 | |||
71 | 6 | void Parser::parseString(const std::string& xmlString, DevicePtr_t robot) { | |
72 | 6 | device_ = robot; | |
73 | |||
74 | 6 | loadString(xmlString.c_str()); | |
75 | try { | ||
76 |
1/2✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
|
6 | parse(); |
77 | ✗ | } catch (const std::exception& exc) { | |
78 | ✗ | std::ostringstream oss; | |
79 | ✗ | oss << "in XML string, " << exc.what(); | |
80 | ✗ | throw std::runtime_error(oss.str().c_str()); | |
81 | ✗ | } | |
82 | 6 | } | |
83 | |||
84 | 3 | void Parser::parseFile(const std::string& filename, DevicePtr_t robot) { | |
85 | 3 | device_ = robot; | |
86 | |||
87 | std::string fn = | ||
88 |
2/4✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
|
3 | ::pinocchio::retrieveResourcePath(filename, ::pinocchio::rosPaths()); |
89 |
1/2✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
|
3 | loadFile(fn.c_str()); |
90 | try { | ||
91 |
1/2✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
|
3 | parse(); |
92 | ✗ | } catch (const std::exception& exc) { | |
93 | ✗ | std::ostringstream oss; | |
94 | ✗ | oss << "in " << filename << ", " << exc.what(); | |
95 | ✗ | throw std::runtime_error(oss.str().c_str()); | |
96 | ✗ | } | |
97 | 3 | } | |
98 | |||
99 | 3 | void Parser::loadFile(const char* filename) { | |
100 | 3 | doc_.LoadFile(filename); | |
101 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
|
3 | if (doc_.Error()) { |
102 | ✗ | std::cerr << doc_.ErrorStr() << std::endl; | |
103 | ✗ | return; | |
104 | } | ||
105 | } | ||
106 | |||
107 | 6 | void Parser::loadString(const char* xmlstring) { | |
108 | 6 | doc_.Parse(xmlstring); | |
109 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
|
6 | if (doc_.Error()) { |
110 | ✗ | std::cerr << doc_.ErrorStr() << std::endl; | |
111 | } | ||
112 | 6 | } | |
113 | |||
114 | 9 | void Parser::parse() { | |
115 | 9 | const XMLElement* el = doc_.RootElement(); | |
116 |
1/4✓ Branch 3 taken 9 times.
✗ Branch 4 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
|
9 | root_ = new RootFactory(device_); |
117 | 9 | root_->prefix(prefix_); | |
118 |
2/2✓ Branch 0 taken 9 times.
✓ Branch 1 taken 9 times.
|
18 | while (el != NULL) { |
119 | 9 | parseElement(el, root_); | |
120 | 9 | el = el->NextSiblingElement(); | |
121 | } | ||
122 | 9 | for (ObjectFactoryList::iterator it = objectFactories_.begin(); | |
123 |
2/2✓ Branch 3 taken 61 times.
✓ Branch 4 taken 9 times.
|
70 | it != objectFactories_.end(); ++it) |
124 |
1/2✓ Branch 2 taken 61 times.
✗ Branch 3 not taken.
|
61 | (*it)->finishFile(); |
125 | 9 | } | |
126 | |||
127 | 37 | void Parser::addObjectFactory(const std::string& tagname, FactoryType factory) { | |
128 | ObjectFactoryInsertRet ret = | ||
129 |
2/4✓ Branch 1 taken 37 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 37 times.
✗ Branch 5 not taken.
|
37 | objFactoryMap_.insert(ObjectFactoryPair(tagname, factory)); |
130 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 37 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
37 | if (!ret.second) throw std::logic_error("This tagname already exist"); |
131 | 37 | } | |
132 | |||
133 | 61 | void Parser::parseElement(const XMLElement* element, ObjectFactory* parent) { | |
134 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 61 times.
|
95 | if (element == NULL) return; |
135 | |||
136 | 61 | ObjectFactory* o = NULL; | |
137 | /// Look for this element in the map | ||
138 |
3/6✓ Branch 1 taken 61 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 61 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 61 times.
✗ Branch 8 not taken.
|
122 | ObjectFactoryMap::const_iterator it = objFactoryMap_.find(element->Value()); |
139 |
2/2✓ Branch 3 taken 55 times.
✓ Branch 4 taken 6 times.
|
61 | if (it != objFactoryMap_.end()) { |
140 |
1/2✓ Branch 2 taken 55 times.
✗ Branch 3 not taken.
|
55 | o = it->second(parent, element); |
141 | } else { | ||
142 |
1/2✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
|
6 | o = defaultFactory_(parent, element); |
143 | hppDout(warning, "I have no factory for tag " << o->tagName()); | ||
144 | } | ||
145 |
1/2✓ Branch 1 taken 61 times.
✗ Branch 2 not taken.
|
61 | objectFactories_.push_back(o); |
146 |
3/4✓ Branch 1 taken 61 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 34 times.
✓ Branch 4 taken 27 times.
|
61 | if (!o->init()) return; |
147 | 27 | const XMLAttribute* attr = element->FirstAttribute(); | |
148 |
2/2✓ Branch 0 taken 26 times.
✓ Branch 1 taken 27 times.
|
53 | while (attr != NULL) { |
149 |
1/2✓ Branch 1 taken 26 times.
✗ Branch 2 not taken.
|
26 | o->setAttribute(attr); |
150 | 26 | attr = attr->Next(); | |
151 | } | ||
152 |
2/4✓ Branch 1 taken 27 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 27 times.
|
27 | if (!o->finishAttributes()) return; |
153 | |||
154 | /// Loop over is child tags | ||
155 | 27 | const XMLNode* el = element->FirstChild(); | |
156 |
2/2✓ Branch 0 taken 59 times.
✓ Branch 1 taken 27 times.
|
86 | while (el != NULL) { |
157 |
3/4✓ Branch 1 taken 59 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 52 times.
✓ Branch 4 taken 7 times.
|
59 | if (el->ToElement() != NULL) { |
158 |
2/4✓ Branch 1 taken 52 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 52 times.
✗ Branch 5 not taken.
|
52 | parseElement(el->ToElement(), o); |
159 |
2/4✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 7 times.
✗ Branch 4 not taken.
|
7 | } else if (el->ToUnknown() != NULL) { |
160 | hppDout(warning, "Unknown Node in XML file: " << el->Value()); | ||
161 |
2/4✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 7 times.
✗ Branch 4 not taken.
|
7 | } else if (el->ToText() != NULL) { |
162 |
2/4✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
|
7 | o->addTextChild(el->ToText()); |
163 | ✗ | } else if (el->ToComment() != NULL) { | |
164 | } | ||
165 | 59 | el = el->NextSibling(); | |
166 | } | ||
167 |
1/2✓ Branch 1 taken 27 times.
✗ Branch 2 not taken.
|
27 | o->finishTags(); |
168 | } | ||
169 | |||
170 | 1 | std::ostream& Parser::print(std::ostream& os) const { | |
171 | 1 | os << "Parser with " << objectFactories_.size() << " object." << std::endl; | |
172 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
1 | if (root_ != NULL) os << *root_; |
173 | 1 | return os; | |
174 | } | ||
175 | |||
176 | 1 | std::ostream& operator<<(std::ostream& os, const Parser& p) { | |
177 | 1 | return p.print(os); | |
178 | } | ||
179 | |||
180 | 8 | std::ostream& operator<<(std::ostream& os, const ObjectFactory& o) { | |
181 | 8 | return o.print(os); | |
182 | } | ||
183 | |||
184 | 61 | ObjectFactory::ObjectFactory(ObjectFactory* parent, const XMLElement* element) | |
185 | 61 | : parent_(parent), root_(NULL), element_(element), id_(-1) { | |
186 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 61 times.
|
61 | if (parent_ == NULL) { |
187 | ✗ | root_ = dynamic_cast<RootFactory*>(this); | |
188 | ✗ | if (root_ == NULL) | |
189 | throw std::logic_error( | ||
190 | ✗ | "ObjectFactory with no parent must be RootFactory"); | |
191 | } else { | ||
192 |
1/2✓ Branch 1 taken 61 times.
✗ Branch 2 not taken.
|
61 | root_ = parent_->root(); |
193 |
2/4✓ Branch 0 taken 61 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 61 times.
✗ Branch 4 not taken.
|
61 | if (element_ != NULL) parent_->addChild(this); |
194 | } | ||
195 | 61 | } | |
196 | |||
197 | 9 | ObjectFactory::ObjectFactory(RootFactory* root) | |
198 | 9 | : parent_(NULL), root_(root), element_(NULL), id_(-1) {} | |
199 | |||
200 | 27 | bool ObjectFactory::init() { return true; } | |
201 | |||
202 | 25 | bool ObjectFactory::finishAttributes() { return true; } | |
203 | |||
204 | 12 | void ObjectFactory::finishTags() {} | |
205 | |||
206 | 61 | void ObjectFactory::finishFile() {} | |
207 | |||
208 | ✗ | void ObjectFactory::addTextChild(const XMLText* /* text */) {} | |
209 | |||
210 | 69 | std::string ObjectFactory::tagName() const { | |
211 |
4/6✓ Branch 0 taken 68 times.
✓ Branch 1 taken 1 times.
✓ Branch 3 taken 68 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 68 times.
✗ Branch 7 not taken.
|
205 | if (element_ != NULL) return element_->Value(); |
212 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | return "No element"; |
213 | } | ||
214 | |||
215 | 16 | std::string ObjectFactory::name() const { return name_; } | |
216 | |||
217 | 16 | void ObjectFactory::name(const std::string& n) { name_ = n; } | |
218 | |||
219 |
2/4✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16 times.
✗ Branch 5 not taken.
|
48 | void ObjectFactory::name(const char* n) { name(std::string(n)); } |
220 | |||
221 | ✗ | ObjectFactory* ObjectFactory::parent() { return parent_; } | |
222 | |||
223 | 77 | RootFactory* ObjectFactory::root() { | |
224 | // if (parent_ == NULL) | ||
225 | // return this; | ||
226 | 77 | return root_; | |
227 | } | ||
228 | |||
229 | ✗ | bool ObjectFactory::hasParent() const { return parent_ != NULL; } | |
230 | |||
231 | ✗ | const XMLElement* ObjectFactory::XMLelement() { return element_; } | |
232 | |||
233 | 23 | void ObjectFactory::impl_setAttribute(const XMLAttribute* /* attr */) {} | |
234 | |||
235 | 61 | void ObjectFactory::addChild(ObjectFactory* child) { | |
236 |
3/6✓ Branch 1 taken 61 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 61 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 61 times.
✗ Branch 8 not taken.
|
61 | children_[child->tagName()].push_back(child); |
237 | 61 | } | |
238 | |||
239 | 16 | ObjectFactory::ObjectFactoryList ObjectFactory::getChildrenOfType( | |
240 | std::string type) { | ||
241 | 16 | return children_[type]; | |
242 | } | ||
243 | |||
244 | 2 | bool ObjectFactory::getChildOfType(std::string type, ObjectFactory*& o) { | |
245 |
2/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
|
2 | ObjectFactoryList l = getChildrenOfType(type); |
246 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
|
2 | if (l.empty()) { |
247 | ✗ | throw std::invalid_argument("Tag " + tagName() + " has no child of type " + | |
248 | ✗ | type); | |
249 | } | ||
250 | 2 | o = l.front(); | |
251 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
|
2 | if (l.size() != 1) { |
252 | hppDout(warning, "Tag " << tagName() << " has several children of type " | ||
253 | << type << ". All but the first will be ignored."); | ||
254 | ✗ | return false; | |
255 | } | ||
256 | 2 | return true; | |
257 | 2 | } | |
258 | |||
259 | 8 | std::ostream& ObjectFactory::print(std::ostream& os) const { | |
260 |
6/12✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 8 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 8 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 8 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 8 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 8 times.
✗ Branch 18 not taken.
|
8 | os << "ObjectFactory " << tagName() << " with name " << name() << std::endl; |
261 | 8 | for (ChildrenMap::const_iterator itTagName = children_.begin(); | |
262 |
2/2✓ Branch 3 taken 12 times.
✓ Branch 4 taken 8 times.
|
20 | itTagName != children_.end(); ++itTagName) |
263 | 12 | for (ObjectFactoryList::const_iterator itObj = itTagName->second.begin(); | |
264 |
2/2✓ Branch 4 taken 7 times.
✓ Branch 5 taken 12 times.
|
19 | itObj != itTagName->second.end(); ++itObj) |
265 |
1/2✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
|
7 | os << **itObj; |
266 | 8 | return os; | |
267 | } | ||
268 | |||
269 | 26 | void ObjectFactory::setAttribute(const XMLAttribute* attr) { | |
270 |
2/4✓ Branch 1 taken 26 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 26 times.
✗ Branch 5 not taken.
|
26 | std::string n = std::string(attr->Name()); |
271 |
3/4✓ Branch 1 taken 26 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 16 times.
✓ Branch 4 taken 10 times.
|
26 | if (n == "name") |
272 |
2/4✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16 times.
✗ Branch 5 not taken.
|
16 | name(attr->Value()); |
273 |
2/4✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 10 times.
|
10 | else if (n == "id") { |
274 | int v; | ||
275 | ✗ | if (attr->QueryIntValue(&v) != tinyxml2::XML_SUCCESS) { | |
276 | hppDout(error, "Attribute ID " << attr->Value() << " is incorrect."); | ||
277 | } else { | ||
278 | ✗ | id_ = (int)v; | |
279 | } | ||
280 | } | ||
281 |
3/6✓ Branch 1 taken 26 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 26 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 26 times.
✗ Branch 8 not taken.
|
26 | attrMap_[n] = attr->Value(); |
282 |
1/2✓ Branch 1 taken 26 times.
✗ Branch 2 not taken.
|
26 | impl_setAttribute(attr); |
283 | 26 | } | |
284 | |||
285 | 20 | bool ObjectFactory::hasAttribute(const std::string& attr) const { | |
286 |
1/2✓ Branch 2 taken 20 times.
✗ Branch 3 not taken.
|
20 | return attrMap_.find(attr) != attrMap_.end(); |
287 | } | ||
288 | |||
289 | 9 | std::string ObjectFactory::getAttribute(const std::string& attr) const { | |
290 |
1/2✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
|
9 | AttributeMap::const_iterator it = attrMap_.find(attr); |
291 |
1/2✗ Branch 2 not taken.
✓ Branch 3 taken 9 times.
|
9 | if (it == attrMap_.end()) { |
292 | hppDout(error, "Asking for attribute " << attr); | ||
293 | ✗ | return std::string(); | |
294 | } | ||
295 |
1/2✓ Branch 2 taken 9 times.
✗ Branch 3 not taken.
|
9 | return it->second; |
296 | } | ||
297 | |||
298 | 9 | RootFactory::RootFactory(const DevicePtr_t dev) | |
299 |
1/2✓ Branch 3 taken 9 times.
✗ Branch 4 not taken.
|
27 | : ObjectFactory(this), device_(dev), prefix_("") {} |
300 | |||
301 | 10 | DevicePtr_t RootFactory::device() const { return device_; } | |
302 | } // namespace parser | ||
303 | } // namespace manipulation | ||
304 | } // namespace hpp | ||
305 |