Merged revisions 262,264-265,267-282,284-298,300-311 via svnmerge from
[senf.git] / Packets / ParseListB.cti
1 // Copyright (C) 2007 
2 // Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
3 // Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
4 //     Stefan Bund <g0dil@berlios.de>
5 //
6 // This program is free software; you can redistribute it and/or modify
7 // it under the terms of the GNU General Public License as published by
8 // the Free Software Foundation; either version 2 of the License, or
9 // (at your option) any later version.
10 //
11 // This program is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 // GNU General Public License for more details.
15 //
16 // You should have received a copy of the GNU General Public License
17 // along with this program; if not, write to the
18 // Free Software Foundation, Inc.,
19 // 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
20
21 /** \file
22     \brief ParseListB inline template implementation */
23
24 #include "ParseListB.ih"
25
26 // Custom includes
27
28 #define prefix_ inline
29 ///////////////////////////////cti.p///////////////////////////////////////
30
31 ///////////////////////////////////////////////////////////////////////////
32 // senf::detail::Parse_ListB_Policy<ElementParser,BytesParser>
33
34 template <class ElementParser, class BytesParser>
35 prefix_ typename senf::detail::Parse_ListB_Policy<ElementParser,BytesParser>::size_type
36 senf::detail::Parse_ListB_Policy<ElementParser,BytesParser>::bytes(iterator i, state_type s)
37     const
38 {
39     return BytesParser(i,s) + BytesParser::fixed_bytes;
40 }
41
42 template <class ElementParser, class BytesParser>
43 prefix_ typename senf::detail::Parse_ListB_Policy<ElementParser,BytesParser>::size_type
44 senf::detail::Parse_ListB_Policy<ElementParser,BytesParser>::size(iterator i, state_type s)
45     const
46 {
47     parser_type l (i,s);
48     return std::distance(l.begin(),l.end());
49 }
50
51 template <class ElementParser, class BytesParser>
52 prefix_ void senf::detail::Parse_ListB_Policy<ElementParser,BytesParser>::init(iterator i,
53                                                                                state_type s)
54     const
55 {}
56
57 ///////////////////////////////////////////////////////////////////////////
58 // senf::detail::Parse_ListB_Policy<ElementParser,BytesParser>::iterator_policy
59
60 template <class ElementParser, class BytesParser>
61 prefix_ typename senf::detail::Parse_ListB_Policy<ElementParser,BytesParser>::iterator
62 senf::detail::Parse_ListB_Policy<ElementParser,BytesParser>::iterator_policy::
63 setBegin(iterator i, state_type s)
64 {
65     return boost::next(i,BytesParser::fixed_bytes);
66 }
67
68 template <class ElementParser, class BytesParser>
69 prefix_ typename senf::detail::Parse_ListB_Policy<ElementParser,BytesParser>::iterator
70 senf::detail::Parse_ListB_Policy<ElementParser,BytesParser>::iterator_policy::
71 setEnd(iterator i, state_type s)
72 {
73     return boost::next(i,BytesParser(i,s) + BytesParser::fixed_bytes);
74 }
75
76 template <class ElementParser, class BytesParser>
77 prefix_ void
78 senf::detail::Parse_ListB_Policy<ElementParser,BytesParser>::iterator_policy::
79 setFromPosition(iterator i, state_type s, iterator p)
80 {}
81
82 template <class ElementParser, class BytesParser>
83 prefix_ typename senf::detail::Parse_ListB_Policy<ElementParser,BytesParser>::iterator
84 senf::detail::Parse_ListB_Policy<ElementParser,BytesParser>::iterator_policy::next(iterator i,
85                                                                                    state_type s)
86 {
87     return boost::next(i,senf::bytes(ElementParser(i,s)));
88 }
89
90 template <class ElementParser, class BytesParser>
91 prefix_ typename senf::detail::Parse_ListB_Policy<ElementParser,BytesParser>::iterator
92 senf::detail::Parse_ListB_Policy<ElementParser,BytesParser>::iterator_policy::raw(iterator i,
93                                                                                   state_type s)
94     const
95 {
96     return i;
97 }
98
99 ///////////////////////////////////////////////////////////////////////////
100 // senf::detail::Parse_ListB_Policy<ElementParser,BytesParser>
101
102 template <class ElementParser, class BytesParser>
103 prefix_
104 senf::detail::Parse_ListB_Policy<ElementParser,BytesParser>::container_policy::
105 container_policy(parser_type const & list)
106 {
107     iterator const e (boost::next(list.i(),list.bytes()));
108     iterator i (boost::next(list.i(), BytesParser::fixed_bytes));
109     for(n_=0; i!=e; ++n_, std::advance(i,ElementParser(i,list.state()).bytes())) ;
110     container_size_ = list.data().size();
111 }
112
113 template <class ElementParser, class BytesParser>
114 prefix_ typename senf::detail::Parse_ListB_Policy<ElementParser,BytesParser>::size_type
115 senf::detail::Parse_ListB_Policy<ElementParser,BytesParser>::container_policy::
116 bytes(iterator i, state_type s)
117     const
118 {
119     return BytesParser(i,s) + BytesParser::fixed_bytes;
120 }
121
122 template <class ElementParser, class BytesParser>
123 prefix_ typename senf::detail::Parse_ListB_Policy<ElementParser,BytesParser>::size_type
124 senf::detail::Parse_ListB_Policy<ElementParser,BytesParser>::container_policy::
125 size(iterator i, state_type s)
126     const
127 {
128     return n_;
129 }
130
131 template <class ElementParser, class BytesParser>
132 prefix_ void
133 senf::detail::Parse_ListB_Policy<ElementParser,BytesParser>::container_policy::
134 erase(iterator i, state_type s, iterator p)
135 {
136     size_type b (senf::bytes(ElementParser(p,s)));
137     BytesParser(i,s) -= b;
138     --n_;
139     // The container will be reduced by b bytes directly after this call
140     container_size_ = s->size()-b;
141 }
142
143 template <class ElementParser, class BytesParser>
144 prefix_ void
145 senf::detail::Parse_ListB_Policy<ElementParser,BytesParser>::container_policy::
146 insert(iterator i, state_type s, iterator p)
147 {
148     BytesParser(i,s) += senf::bytes(ElementParser(p,s));
149     ++n_;
150     container_size_ = s->size();
151 }
152
153 template <class ElementParser, class BytesParser>
154 prefix_ void
155 senf::detail::Parse_ListB_Policy<ElementParser,BytesParser>::container_policy::
156 init(iterator i, state_type s)
157 {
158     n_ = 0;
159     container_size_ = s->size();
160 }
161
162 template <class ElementParser, class BytesParser>
163 prefix_ void
164 senf::detail::Parse_ListB_Policy<ElementParser,BytesParser>::container_policy::
165 update(iterator i, state_type s)
166     const
167 {
168     if (container_size_ == s->size())
169         return;
170     iterator j (boost::next(i,BytesParser::fixed_bytes));
171     for (size_type n (n_); n; --n, std::advance(j,ElementParser(j,s).bytes())) ;
172     BytesParser(i,s) = std::distance(i,j) - BytesParser::fixed_bytes;
173     container_size_ = s->size();
174 }
175
176 ///////////////////////////////cti.e///////////////////////////////////////
177 #undef prefix_
178
179 \f
180 // Local Variables:
181 // mode: c++
182 // fill-column: 100
183 // comment-column: 40
184 // c-file-style: "senf"
185 // indent-tabs-mode: nil
186 // ispell-local-dictionary: "american"
187 // compile-command: "scons -u test"
188 // End: