1 // Copyright (C) 2009 - 2010 Mathias Froehlich - Mathias.Froehlich@web.de
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Library General Public
5 // License as published by the Free Software Foundation; either
6 // version 2 of the License, or (at your option) any later version.
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 // Library General Public License for more details.
13 // You should have received a copy of the GNU General Public License
14 // along with this program; if not, write to the Free Software
15 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19 # include <simgear_config.h>
22 #include <simgear/compiler.h>
24 #include "HLADataElement.hxx"
26 #include <simgear/debug/logstream.hxx>
28 #include "HLADataElementVisitor.hxx"
32 HLADataElement::PathElement::Data::~Data()
36 const HLADataElement::PathElement::FieldData*
37 HLADataElement::PathElement::Data::toFieldData() const
42 const HLADataElement::PathElement::IndexData*
43 HLADataElement::PathElement::Data::toIndexData() const
48 HLADataElement::PathElement::FieldData::FieldData(const std::string& name) :
53 HLADataElement::PathElement::FieldData::~FieldData()
57 const HLADataElement::PathElement::FieldData*
58 HLADataElement::PathElement::FieldData::toFieldData() const
64 HLADataElement::PathElement::FieldData::less(const Data* data) const
66 const FieldData* fieldData = data->toFieldData();
67 // IndexData is allways smaller than FieldData
70 return _name < fieldData->_name;
74 HLADataElement::PathElement::FieldData::equal(const Data* data) const
76 const FieldData* fieldData = data->toFieldData();
77 // IndexData is allways smaller than FieldData
80 return _name == fieldData->_name;
84 HLADataElement::PathElement::FieldData::append(std::string& s) const
86 s.append(1, std::string::value_type('.'));
90 HLADataElement::PathElement::IndexData::IndexData(unsigned index) :
95 HLADataElement::PathElement::IndexData::~IndexData()
99 const HLADataElement::PathElement::IndexData*
100 HLADataElement::PathElement::IndexData::toIndexData() const
106 HLADataElement::PathElement::IndexData::less(const Data* data) const
108 const IndexData* indexData = data->toIndexData();
109 // IndexData is allways smaller than FieldData
112 return _index < indexData->_index;
116 HLADataElement::PathElement::IndexData::equal(const Data* data) const
118 const IndexData* indexData = data->toIndexData();
119 // IndexData is allways smaller than FieldData
122 return _index == indexData->_index;
126 HLADataElement::PathElement::IndexData::append(std::string& s) const
128 s.append(1, std::string::value_type('['));
129 unsigned value = _index;
131 s.append(1, std::string::value_type('0' + value % 10));
132 } while (value /= 10);
133 s.append(1, std::string::value_type(']'));
136 HLADataElement::~HLADataElement()
141 HLADataElement::setTimeStamp(const SGTimeStamp& timeStamp)
145 _stamp->setTimeStamp(timeStamp);
149 HLADataElement::setTimeStampValid(bool timeStampValid)
153 _stamp->setTimeStampValid(timeStampValid);
157 HLADataElement::getTimeDifference(const SGTimeStamp& timeStamp) const
161 if (!_stamp->getTimeStampValid())
163 return (timeStamp - _stamp->getTimeStamp()).toSecs();
167 HLADataElement::createStamp()
169 _setStamp(new Stamp);
174 HLADataElement::attachStamp(HLADataElement& dataElement)
176 _setStamp(dataElement._getStamp());
180 HLADataElement::clearStamp()
186 HLADataElement::accept(HLADataElementVisitor& visitor)
188 visitor.apply(*this);
192 HLADataElement::accept(HLAConstDataElementVisitor& visitor) const
194 visitor.apply(*this);
198 HLADataElement::toString(const Path& path)
201 for (Path::const_iterator i = path.begin(); i != path.end(); ++i)
206 HLADataElement::StringPathPair
207 HLADataElement::toStringPathPair(const std::string& s)
210 // Skip the initial attribute/parameter name if given
211 std::string::size_type i = s.find_first_of("[.");
212 std::string attribute = s.substr(0, i);
213 while (i < s.size()) {
217 while (i < s.size()) {
220 unsigned v = s[i] - '0';
223 SG_LOG(SG_NETWORK, SG_WARN, "HLADataElement: invalid character in array subscript for \""
224 << s << "\" at \"" << attribute << toString(path) << "\"!");
225 return StringPathPair();
231 path.push_back(index);
236 // Error, . cannot be last
237 if (s.size() <= ++i) {
238 SG_LOG(SG_NETWORK, SG_WARN, "HLADataElement: invalid terminating '.' for \""
240 return StringPathPair();
242 std::string::size_type e = s.find_first_of("[.", i);
243 path.push_back(s.substr(i, e - i));
249 return StringPathPair(attribute, path);
253 HLADataElement::_setStamp(HLADataElement::Stamp* stamp)