]> git.mxchange.org Git - simgear.git/blob - simgear/hla/HLADataElement.cxx
Merge remote branch 'origin/releases/2.2.0' into next
[simgear.git] / simgear / hla / HLADataElement.cxx
1 // Copyright (C) 2009 - 2010  Mathias Froehlich - Mathias.Froehlich@web.de
2 //
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.
7 //
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.
12 //
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.
16 //
17
18 #include "HLADataElement.hxx"
19
20 #include <simgear/debug/logstream.hxx>
21
22 namespace simgear {
23
24 HLADataElement::PathElement::Data::~Data()
25 {
26 }
27
28 const HLADataElement::PathElement::FieldData*
29 HLADataElement::PathElement::Data::toFieldData() const
30 {
31     return 0;
32 }
33
34 const HLADataElement::PathElement::IndexData*
35 HLADataElement::PathElement::Data::toIndexData() const
36 {
37     return 0;
38 }
39
40 HLADataElement::PathElement::FieldData::FieldData(const std::string& name) :
41     _name(name)
42 {
43 }
44
45 HLADataElement::PathElement::FieldData::~FieldData()
46 {
47 }
48
49 const HLADataElement::PathElement::FieldData*
50 HLADataElement::PathElement::FieldData::toFieldData() const
51 {
52     return this;
53 }
54
55 bool
56 HLADataElement::PathElement::FieldData::less(const Data* data) const
57 {
58     const FieldData* fieldData = data->toFieldData();
59     // IndexData is allways smaller than FieldData
60     if (!fieldData)
61         return false;
62     return _name < fieldData->_name;
63 }
64
65 bool
66 HLADataElement::PathElement::FieldData::equal(const Data* data) const
67 {
68     const FieldData* fieldData = data->toFieldData();
69     // IndexData is allways smaller than FieldData
70     if (!fieldData)
71         return false;
72     return _name == fieldData->_name;
73 }
74
75 void
76 HLADataElement::PathElement::FieldData::append(std::string& s) const
77 {
78     s.append(1, std::string::value_type('.'));
79     s.append(_name);
80 }
81
82 HLADataElement::PathElement::IndexData::IndexData(unsigned index) :
83     _index(index)
84 {
85 }
86
87 HLADataElement::PathElement::IndexData::~IndexData()
88 {
89 }
90
91 const HLADataElement::PathElement::IndexData*
92 HLADataElement::PathElement::IndexData::toIndexData() const
93 {
94     return this;
95 }
96
97 bool
98 HLADataElement::PathElement::IndexData::less(const Data* data) const
99 {
100     const IndexData* indexData = data->toIndexData();
101     // IndexData is allways smaller than FieldData
102     if (!indexData)
103         return true;
104     return _index < indexData->_index;
105 }
106
107 bool
108 HLADataElement::PathElement::IndexData::equal(const Data* data) const
109 {
110     const IndexData* indexData = data->toIndexData();
111     // IndexData is allways smaller than FieldData
112     if (!indexData)
113         return false;
114     return _index == indexData->_index;
115 }
116
117 void
118 HLADataElement::PathElement::IndexData::append(std::string& s) const
119 {
120     s.append(1, std::string::value_type('['));
121     unsigned value = _index;
122     do {
123         s.append(1, std::string::value_type('0' + value % 10));
124     } while (value /= 10);
125     s.append(1, std::string::value_type(']'));
126 }
127
128 HLADataElement::~HLADataElement()
129 {
130 }
131
132 std::string
133 HLADataElement::toString(const Path& path)
134 {
135     std::string s;
136     for (Path::const_iterator i = path.begin(); i != path.end(); ++i)
137         i->append(s);
138     return s;
139 }
140
141 HLADataElement::AttributePathPair
142 HLADataElement::toAttributePathPair(const std::string& s)
143 {
144     Path path;
145     // Skip the initial attribute name if given
146     std::string::size_type i = s.find_first_of("[.");
147     std::string attribute = s.substr(0, i);
148     while (i < s.size()) {
149         if (s[i] == '[') {
150             ++i;
151             unsigned index = 0;
152             while (i < s.size()) {
153                 if (s[i] == ']')
154                     break;
155                 unsigned v = s[i] - '0';
156                 // Error, no number
157                 if (10 <= v) {
158                     SG_LOG(SG_NETWORK, SG_WARN, "HLADataElement: invalid character in array subscript for \""
159                            << s << "\" at \"" << attribute << toString(path) << "\"!");
160                     return AttributePathPair();
161                 }
162                 index *= 10;
163                 index += v;
164                 ++i;
165             }
166             path.push_back(index);
167             ++i;
168             continue;
169         }
170         if (s[i] == '.') {
171             // Error, . cannot be last
172             if (s.size() <= ++i) {
173                 SG_LOG(SG_NETWORK, SG_WARN, "HLADataElement: invalid terminating '.' for \""
174                        << s << "\"!");
175                 return AttributePathPair();
176             }
177             std::string::size_type e = s.find_first_of("[.", i);
178             path.push_back(s.substr(i, e - i));
179             i = e;
180             continue;
181         }
182     }
183
184     return AttributePathPair(attribute, path);
185 }
186
187 }