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.
18 #include "HLADataElement.hxx"
20 #include <simgear/debug/logstream.hxx>
22 #include "HLADataElementVisitor.hxx"
26 HLADataElement::PathElement::Data::~Data()
30 const HLADataElement::PathElement::FieldData*
31 HLADataElement::PathElement::Data::toFieldData() const
36 const HLADataElement::PathElement::IndexData*
37 HLADataElement::PathElement::Data::toIndexData() const
42 HLADataElement::PathElement::FieldData::FieldData(const std::string& name) :
47 HLADataElement::PathElement::FieldData::~FieldData()
51 const HLADataElement::PathElement::FieldData*
52 HLADataElement::PathElement::FieldData::toFieldData() const
58 HLADataElement::PathElement::FieldData::less(const Data* data) const
60 const FieldData* fieldData = data->toFieldData();
61 // IndexData is allways smaller than FieldData
64 return _name < fieldData->_name;
68 HLADataElement::PathElement::FieldData::equal(const Data* data) const
70 const FieldData* fieldData = data->toFieldData();
71 // IndexData is allways smaller than FieldData
74 return _name == fieldData->_name;
78 HLADataElement::PathElement::FieldData::append(std::string& s) const
80 s.append(1, std::string::value_type('.'));
84 HLADataElement::PathElement::IndexData::IndexData(unsigned index) :
89 HLADataElement::PathElement::IndexData::~IndexData()
93 const HLADataElement::PathElement::IndexData*
94 HLADataElement::PathElement::IndexData::toIndexData() const
100 HLADataElement::PathElement::IndexData::less(const Data* data) const
102 const IndexData* indexData = data->toIndexData();
103 // IndexData is allways smaller than FieldData
106 return _index < indexData->_index;
110 HLADataElement::PathElement::IndexData::equal(const Data* data) const
112 const IndexData* indexData = data->toIndexData();
113 // IndexData is allways smaller than FieldData
116 return _index == indexData->_index;
120 HLADataElement::PathElement::IndexData::append(std::string& s) const
122 s.append(1, std::string::value_type('['));
123 unsigned value = _index;
125 s.append(1, std::string::value_type('0' + value % 10));
126 } while (value /= 10);
127 s.append(1, std::string::value_type(']'));
130 HLADataElement::~HLADataElement()
135 HLADataElement::accept(HLADataElementVisitor& visitor)
137 visitor.apply(*this);
141 HLADataElement::accept(HLAConstDataElementVisitor& visitor) const
143 visitor.apply(*this);
147 HLADataElement::toString(const Path& path)
150 for (Path::const_iterator i = path.begin(); i != path.end(); ++i)
155 HLADataElement::AttributePathPair
156 HLADataElement::toAttributePathPair(const std::string& s)
159 // Skip the initial attribute name if given
160 std::string::size_type i = s.find_first_of("[.");
161 std::string attribute = s.substr(0, i);
162 while (i < s.size()) {
166 while (i < s.size()) {
169 unsigned v = s[i] - '0';
172 SG_LOG(SG_NETWORK, SG_WARN, "HLADataElement: invalid character in array subscript for \""
173 << s << "\" at \"" << attribute << toString(path) << "\"!");
174 return AttributePathPair();
180 path.push_back(index);
185 // Error, . cannot be last
186 if (s.size() <= ++i) {
187 SG_LOG(SG_NETWORK, SG_WARN, "HLADataElement: invalid terminating '.' for \""
189 return AttributePathPair();
191 std::string::size_type e = s.find_first_of("[.", i);
192 path.push_back(s.substr(i, e - i));
198 return AttributePathPair(attribute, path);