2 // Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
3 // Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
4 // Stefan Bund <g0dil@berlios.de>
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.
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.
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.
22 \brief ParseListB inline template implementation */
24 #include "ParseListB.ih"
28 #define prefix_ inline
29 ///////////////////////////////cti.p///////////////////////////////////////
31 ///////////////////////////////////////////////////////////////////////////
32 // senf::detail::Parse_ListB_Policy<ElementParser,BytesParser>
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)
39 return BytesParser(i,s) + BytesParser::fixed_bytes;
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)
48 return std::distance(l.begin(),l.end());
51 template <class ElementParser, class BytesParser>
52 prefix_ void senf::detail::Parse_ListB_Policy<ElementParser,BytesParser>::init(iterator i,
57 ///////////////////////////////////////////////////////////////////////////
58 // senf::detail::Parse_ListB_Policy<ElementParser,BytesParser>::iterator_policy
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)
65 return boost::next(i,BytesParser::fixed_bytes);
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)
73 return boost::next(i,BytesParser(i,s) + BytesParser::fixed_bytes);
76 template <class ElementParser, class BytesParser>
78 senf::detail::Parse_ListB_Policy<ElementParser,BytesParser>::iterator_policy::
79 setFromPosition(iterator i, state_type s, iterator p)
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,
87 return boost::next(i,senf::bytes(ElementParser(i,s)));
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,
99 ///////////////////////////////////////////////////////////////////////////
100 // senf::detail::Parse_ListB_Policy<ElementParser,BytesParser>
102 template <class ElementParser, class BytesParser>
104 senf::detail::Parse_ListB_Policy<ElementParser,BytesParser>::container_policy::
105 container_policy(parser_type const & list)
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();
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)
119 return BytesParser(i,s) + BytesParser::fixed_bytes;
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)
131 template <class ElementParser, class BytesParser>
133 senf::detail::Parse_ListB_Policy<ElementParser,BytesParser>::container_policy::
134 erase(iterator i, state_type s, iterator p)
136 size_type b (senf::bytes(ElementParser(p,s)));
137 BytesParser(i,s) -= b;
139 // The container will be reduced by b bytes directly after this call
140 container_size_ = s->size()-b;
143 template <class ElementParser, class BytesParser>
145 senf::detail::Parse_ListB_Policy<ElementParser,BytesParser>::container_policy::
146 insert(iterator i, state_type s, iterator p)
148 BytesParser(i,s) += senf::bytes(ElementParser(p,s));
150 container_size_ = s->size();
153 template <class ElementParser, class BytesParser>
155 senf::detail::Parse_ListB_Policy<ElementParser,BytesParser>::container_policy::
156 init(iterator i, state_type s)
159 container_size_ = s->size();
162 template <class ElementParser, class BytesParser>
164 senf::detail::Parse_ListB_Policy<ElementParser,BytesParser>::container_policy::
165 update(iterator i, state_type s)
168 if (container_size_ == s->size())
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();
176 ///////////////////////////////cti.e///////////////////////////////////////
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"