Whitespce cleanup: Remove whitespace at end-on-line, remove tabs, wrap
[senf.git] / senf / Packets / DefaultBundle / ListOptionTypeParser.cti
1 // $Id$
2 //
3 // Copyright (C) 2009
4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 // Competence Center NETwork research (NET), St. Augustin, GERMANY
6 //     Philipp.Batroff@fokus.fraunhofer.de
7 //
8 // This program is free software; you can redistribute it and/or modify
9 // it under the terms of the GNU General Public License as published by
10 // the Free Software Foundation; either version 2 of the License, or
11 // (at your option) any later version.
12 //
13 // This program is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 // GNU General Public License for more details.
17 //
18 // You should have received a copy of the GNU General Public License
19 // along with this program; if not, write to the
20 // Free Software Foundation, Inc.,
21 // 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22
23 /** \file
24     \brief ListOptionTypeParser inline template implementation */
25
26 #include "ListOptionTypeParser.ih"
27
28 // Custom includes
29
30 #define prefix_ inline
31 ///////////////////////////////cti.p///////////////////////////////////////
32
33 ///////////////////////////////////////////////////////////////////////////
34 // senf::detail::ListOptionTypeParser_Policy<ElementParser,AuxPolicy>
35
36 template <class ElementParser, class AuxPolicy>
37 prefix_
38 senf::detail::ListOptionTypeParser_Policy<ElementParser,AuxPolicy>::
39 ListOptionTypeParser_Policy()
40 {}
41
42 template <class ElementParser, class AuxPolicy>
43 template <class Arg>
44 prefix_
45 senf::detail::ListOptionTypeParser_Policy<ElementParser,AuxPolicy>::
46 ListOptionTypeParser_Policy(Arg const & arg)
47     : AuxPolicy(arg)
48 {}
49
50 template <class ElementParser, class AuxPolicy>
51 prefix_ typename senf::detail::ListOptionTypeParser_Policy<ElementParser, AuxPolicy>::size_type
52 senf::detail::ListOptionTypeParser_Policy<ElementParser,AuxPolicy>::bytes(data_iterator i,
53                                                                           state_type s)
54     const
55 {
56     return ((AuxPolicy::aux(i, s) * 8 + 6)  + AuxPolicy::aux_bytes);
57 }
58
59 template <class ElementParser, class AuxPolicy>
60 prefix_ typename senf::detail::ListOptionTypeParser_Policy<ElementParser,AuxPolicy>::size_type
61 senf::detail::ListOptionTypeParser_Policy<ElementParser,AuxPolicy>::size(data_iterator i,
62                                                                          state_type s)
63     const
64 {
65     parser_type p(*this, i, s);
66     container_type c(p);
67     return std::distance(c.begin(), c.end());
68 }
69
70 template <class ElementParser, class AuxPolicy>
71 prefix_ void
72 senf::detail::ListOptionTypeParser_Policy<ElementParser,AuxPolicy>::init(data_iterator i,
73                                                                          state_type s)
74     const
75 {
76     i[0] = 1u;
77     i[1] = 4u;
78     for (unsigned int n = 2;n < 6; ++n)
79         i[n] = 0u;
80     AuxPolicy::aux(0, i, s);
81 }
82
83 ///////////////////////////////////////////////////////////////////////////
84 // senf::detail::ListOptionTypeParser_Policy<ElementParser,BytesParser>
85
86 //constructor
87 template <class ElementParser, class AuxPolicy>
88 prefix_
89 senf::detail::ListOptionTypeParser_Policy<ElementParser,AuxPolicy>::container_policy::
90 container_policy(parser_policy const & p)
91     : AuxPolicy(p)
92 {}
93
94 //destructor
95 template <class ElementParser, class AuxPolicy>
96 prefix_
97 senf::detail::ListOptionTypeParser_Policy<ElementParser,AuxPolicy>::container_policy::
98 ~container_policy()
99 {}
100
101 //construct method
102 template <class ElementParser, class AuxPolicy>
103 prefix_ void
104 senf::detail::ListOptionTypeParser_Policy<ElementParser,AuxPolicy>::container_policy::
105 construct(container_type & c)
106 {
107     safe_data_iterator i (c.data(), c.i()) ;
108     realAux_ = (AuxPolicy::aux(i, c.state()) * 8) + 6;
109     safe_data_iterator e = i + realAux_;
110     for (n_ = 0; i != e;) {
111         unsigned int elByte = senf::bytes(ElementParser(i, c.state()));
112         if (((i + elByte) == e) && (i[0] == 0u || i[0] == 1u)) { //check weather last element is padding or not
113             realAux_ -= std::distance(i, e);
114             c.data().erase(i, e); //delete padding
115             e = i; //set end iterator
116         } else{
117             ++n_;
118             std::advance(i, elByte);
119         }
120     }
121     container_size_ = c.data().size(); //set actual size without padding
122 }
123
124 //destruct method
125 template <class ElementParser, class AuxPolicy>
126 prefix_ void
127 senf::detail::ListOptionTypeParser_Policy<ElementParser,AuxPolicy>::container_policy::
128 destruct(container_type & c)
129 {
130     //data_iterator i (AuxPolicy::adjust(parser_type::get(p).i(), parser_type::get(p).state()));
131     safe_data_iterator i (c.data(), c.i()) ;
132     safe_data_iterator e = i + realAux_;
133     unsigned int padBytes = 0;
134     if (realAux_ == 0)      //if list is empty, 6 padding bytes required!
135       padBytes = 6;
136     else{
137       padBytes = ( (realAux_+2) % 8);
138       if (padBytes != 0)
139           padBytes = 8 - padBytes;
140     }
141     if (padBytes > 0) {
142         c.data().insert(e, padBytes, 0u);
143         if (padBytes > 1) {
144             e[0] = 1u;
145             e[1] = padBytes - 2;
146         } else
147             e[0] = 0;
148         container_size_ += padBytes;
149         realAux_ += padBytes;
150         ++n_;
151     }
152     AuxPolicy::aux(( (realAux_ + 2)/ 8 - 1), i, c.state());
153 }
154
155 //bytes()
156 template <class ElementParser, class AuxPolicy>
157 prefix_ typename senf::detail::ListOptionTypeParser_Policy<
158     ElementParser,AuxPolicy>::container_policy::size_type
159 senf::detail::ListOptionTypeParser_Policy<ElementParser,AuxPolicy>::container_policy::
160 bytes(data_iterator i, state_type s)
161     const
162 {
163     return (realAux_ );
164 }
165
166 //size()
167 template <class ElementParser, class AuxPolicy>
168 prefix_ typename senf::detail::ListOptionTypeParser_Policy<
169     ElementParser,AuxPolicy>::container_policy::size_type
170 senf::detail::ListOptionTypeParser_Policy<ElementParser,AuxPolicy>::container_policy::
171 size(data_iterator i, state_type s)
172     const
173 {
174     return n_;
175 }
176
177 //init()
178 template <class ElementParser, class AuxPolicy>
179 prefix_ void
180 senf::detail::ListOptionTypeParser_Policy<ElementParser,AuxPolicy>::container_policy::
181 init(data_iterator i, state_type s)
182 {
183     realAux_ = 0;
184     n_ = 0;
185     container_size_ = s->size();
186     AuxPolicy::aux(0, i, s);
187 }
188
189 //erase()
190 template <class ElementParser, class AuxPolicy>
191 prefix_ void
192 senf::detail::ListOptionTypeParser_Policy<ElementParser,AuxPolicy>::container_policy::
193 erase(container_type & c, data_iterator p)
194 {
195     size_type b(senf::bytes(ElementParser(p, c.state())));
196     realAux_ -= b;
197     --n_;
198     container_size_ = c.data().size() - b;
199 }
200
201 //insert()
202 template <class ElementParser, class AuxPolicy>
203 prefix_ void
204 senf::detail::ListOptionTypeParser_Policy<ElementParser,AuxPolicy>::container_policy::
205 insert(container_type & c, data_iterator p)
206 {
207     size_type b(senf::bytes(ElementParser(p, c.state())));
208     realAux_ += b;
209     ++n_;
210     container_size_ = c.data().size();
211 }
212
213 //update()
214 template <class ElementParser, class AuxPolicy>
215 prefix_ void
216 senf::detail::ListOptionTypeParser_Policy<ElementParser,AuxPolicy>::container_policy::
217 update(container_type const & c)
218     const
219 {
220     if (container_size_ == c.data().size())
221         return;
222     data_iterator i(AuxPolicy::adjust(c.i(), c.state()));
223     data_iterator j(i);
224     for (size_type n(n_); n; --n, std::advance(j, senf::bytes(ElementParser(j,c.state())))) { ; }
225     realAux_ = std::distance(i, j);
226     container_size_ = c.data().size();
227 }
228
229 //setbegin()
230 template <class ElementParser, class AuxPolicy>
231 prefix_ typename senf::detail::ListOptionTypeParser_Policy<
232     ElementParser,AuxPolicy>::container_policy::data_iterator
233 senf::detail::ListOptionTypeParser_Policy<ElementParser,AuxPolicy>::container_policy::
234 setBegin(container_type const & c, iterator_data & d)
235     const
236 {
237     return c.i();
238 }
239
240 //setEnd()
241 template <class ElementParser, class AuxPolicy>
242 prefix_ typename senf::detail::ListOptionTypeParser_Policy<
243     ElementParser,AuxPolicy>::container_policy::data_iterator
244 senf::detail::ListOptionTypeParser_Policy<ElementParser,AuxPolicy>::container_policy::
245 setEnd(container_type const & c, iterator_data & d)
246     const
247 {
248     return boost::next(c.i(),realAux_);
249 }
250
251 //setFromPosition()
252 template <class ElementParser, class AuxPolicy>
253 prefix_ void
254 senf::detail::ListOptionTypeParser_Policy<ElementParser,AuxPolicy>::container_policy::
255 setFromPosition(container_type const & c, iterator_data & d, data_iterator p)
256     const
257 {}
258
259 //next()
260 template <class ElementParser, class AuxPolicy>
261 prefix_ typename senf::detail::ListOptionTypeParser_Policy<
262     ElementParser,AuxPolicy>::container_policy::data_iterator
263 senf::detail::ListOptionTypeParser_Policy<ElementParser,AuxPolicy>::container_policy::
264 next(container_type const & c, iterator_data & d)
265     const
266 {
267     return boost::next(container_type::iterator::get(d).i(), senf::bytes(ElementParser(container_type::iterator::get(d).i(), c.state())));
268 }
269
270 //raw()
271 template <class ElementParser, class AuxPolicy>
272 prefix_ typename senf::detail::ListOptionTypeParser_Policy<
273     ElementParser,AuxPolicy>::container_policy::data_iterator
274 senf::detail::ListOptionTypeParser_Policy<ElementParser,AuxPolicy>::container_policy::
275 raw(container_type const & c, iterator_data const & d)
276     const
277 {
278     return container_type::iterator::get(d).i();
279 }
280
281 ///////////////////////////////cti.e///////////////////////////////////////
282 #undef prefix_
283
284 \f
285 // Local Variables:
286 // mode: c++
287 // fill-column: 100
288 // comment-column: 40
289 // c-file-style: "senf"
290 // indent-tabs-mode: nil
291 // ispell-local-dictionary: "american"
292 // compile-command: "scons -u test"
293 // End: