8631fabdd053d8f6e544a3215a82d62063657623
[senf.git] / Packets / ParseVec.cti
1 // $Id$
2 //
3 // Copyright (C) 2006 
4 // Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
5 // Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
6 //     Stefan Bund <stefan.bund@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 // Definition of inline template functions
24
25 //#include "ParseVec.ih"
26
27 // Custom includes
28
29 #define prefix_ inline
30 ///////////////////////////////cti.p///////////////////////////////////////
31
32 template <class Parser, class SizeParser, class Iterator, class IPacket>
33 prefix_ senf::Parse_Vector<Parser,SizeParser,Iterator,IPacket>::
34 Parse_Vector(SizeParser const & size)
35     : size_(size) 
36 {}
37
38 template <class Parser, class SizeParser, class Iterator, class IPacket>
39 prefix_ senf::Parse_Vector<Parser,SizeParser,Iterator,IPacket>::
40 Parse_Vector(size_parser const & size, Iterator const & i)
41     : ParserBase<Iterator,IPacket>(i), size_(size) 
42 {}
43
44 template <class Parser, class SizeParser, class Iterator, class IPacket>
45 prefix_ unsigned senf::Parse_Vector<Parser,SizeParser,Iterator,IPacket>::bytes()
46     const
47 {
48     return Parser::bytes()*size();
49 }
50
51 template <class Parser, class SizeParser, class Iterator, class IPacket>
52 prefix_ void
53 senf::Parse_Vector<Parser,SizeParser,Iterator,IPacket>::check(Iterator const & e)
54     const
55 {
56     return e-this->i() >= bytes();
57 }
58
59 template <class Parser, class SizeParser, class Iterator, class IPacket>
60 prefix_ void senf::Parse_Vector<Parser,SizeParser,Iterator,IPacket>::init()
61     const
62 {
63     iterator e (end());
64     for (iterator i (begin()); i!=e; ++i) i->init();
65 }
66
67 ///////////////////////////////////////////////////////////////////////////
68
69 template <class Parser, class SizeParser, class Iterator, class IPacket>
70 prefix_ typename senf::Parse_Vector<Parser,SizeParser,Iterator,IPacket>::size_type
71 senf::Parse_Vector<Parser,SizeParser,Iterator,IPacket>::size()
72     const
73 {
74     return size_.value();
75 }
76
77 template <class Parser, class SizeParser, class Iterator, class IPacket>
78 prefix_ bool senf::Parse_Vector<Parser,SizeParser,Iterator,IPacket>::empty()
79     const
80 {
81     return size()==0;
82 }
83
84 template <class Parser, class SizeParser, class Iterator, class IPacket>
85 prefix_ 
86 typename senf::Parse_Vector<Parser,SizeParser,Iterator,IPacket>::iterator
87 senf::Parse_Vector<Parser,SizeParser,Iterator,IPacket>::begin()
88     const
89 {
90     return iterator(this->i());
91 }
92
93 template <class Parser, class SizeParser, class Iterator, class IPacket>
94 prefix_ 
95 typename senf::Parse_Vector<Parser,SizeParser,Iterator,IPacket>::iterator
96 senf::Parse_Vector<Parser,SizeParser,Iterator,IPacket>::end()
97     const
98 {
99     return iterator(this->i()+bytes());
100 }
101
102 template <class Parser, class SizeParser, class Iterator, class IPacket>
103 prefix_ 
104 typename senf::Parse_Vector<Parser,SizeParser,Iterator,IPacket>::range_type
105 senf::Parse_Vector<Parser,SizeParser,Iterator,IPacket>::range()
106     const
107 {
108     return std::make_pair(begin(),end());
109 }
110
111 template <class Parser, class SizeParser, class Iterator, class IPacket>
112 prefix_ 
113 typename senf::Parse_Vector<Parser,SizeParser,Iterator,IPacket>::range_type
114 senf::Parse_Vector<Parser,SizeParser,Iterator,IPacket>::value()
115     const
116 {
117     return range();
118 }
119
120 template <class Parser, class SizeParser, class Iterator, class IPacket>
121 prefix_ 
122 typename senf::Parse_Vector<Parser,SizeParser,Iterator,IPacket>::value_type
123 senf::Parse_Vector<Parser,SizeParser,Iterator,IPacket>::operator[](difference_type i)
124     const
125 {
126     return begin()[i];
127 }
128
129 ///////////////////////////////////////////////////////////////////////////
130 // senf::Parse_Vector_wrapper<Parser,SizeParser,Container>
131
132 template <class Parser, class SizeParser, class Container>
133 template <class P, class SP, class I, class IP>
134 prefix_ senf::Parse_Vector_wrapper<Parser,SizeParser,Container>::
135 Parse_Vector_wrapper(Parse_Vector<P,SP,I,IP> const & vector, Container & container)
136     : i_(vector.i()-container.begin()), size_i_(vector.size_.i()-container.begin()),
137       container_(container) 
138 {}
139
140 template <class Parser, class SizeParser, class Container>
141 prefix_ typename senf::Parse_Vector_wrapper<Parser,SizeParser,Container>::size_type
142 senf::Parse_Vector_wrapper<Parser,SizeParser,Container>::size()
143     const
144 {
145     return SizeParser(container_.begin()+size_i_).value();
146 }
147
148 template <class Parser, class SizeParser, class Container>
149 prefix_ bool senf::Parse_Vector_wrapper<Parser,SizeParser,Container>::empty()
150     const
151 {
152     return size() == 0;
153 }
154
155 template <class Parser, class SizeParser, class Container>
156 prefix_ typename senf::Parse_Vector_wrapper<Parser,SizeParser,Container>::iterator
157 senf::Parse_Vector_wrapper<Parser,SizeParser,Container>::begin()
158     const
159 {
160     return iterator(container_.begin() + i_);
161 }
162
163 template <class Parser, class SizeParser, class Container>
164 prefix_ typename senf::Parse_Vector_wrapper<Parser,SizeParser,Container>::iterator
165 senf::Parse_Vector_wrapper<Parser,SizeParser,Container>::end()
166     const
167 {
168     return iterator(container_.begin() + i_ + Parser::bytes()*size());
169 }
170
171 template <class Parser, class SizeParser, class Container>
172 prefix_ typename senf::Parse_Vector_wrapper<Parser,SizeParser,Container>::range_type
173 senf::Parse_Vector_wrapper<Parser,SizeParser,Container>::range()
174     const
175 {
176     return std::make_pair(begin(), end());
177 }
178
179 template <class Parser, class SizeParser, class Container>
180 prefix_ typename senf::Parse_Vector_wrapper<Parser,SizeParser,Container>::value_type
181 senf::Parse_Vector_wrapper<Parser,SizeParser,Container>::operator[](difference_type i)
182     const
183 {
184     return begin()[i];
185 }
186
187 template <class Parser, class SizeParser, class Container>
188 prefix_ void senf::Parse_Vector_wrapper<Parser,SizeParser,Container>::shift(iterator pos,
189                                                                                size_type n)
190 {
191     container_.insert(pos.raw(),n*Parser::bytes(),0);
192     SizeParser(container_.begin()+size_i_) += n;
193 }
194
195 template <class Parser, class SizeParser, class Container>
196 prefix_ void senf::Parse_Vector_wrapper<Parser,SizeParser,Container>::erase(iterator pos,
197                                                                                size_type n)
198 {
199     container_.erase(pos.raw(),pos.raw()+n*Parser::bytes());
200     SizeParser(container_.begin()+size_i_) -= n;
201 }
202
203 template <class Parser, class SizeParser, class Container>
204 prefix_ void senf::Parse_Vector_wrapper<Parser,SizeParser,Container>::erase(iterator f,
205                                                                                iterator l)
206 {
207     erase(f,l-f);
208 }
209
210 template <class Parser, class SizeParser, class Container>
211 prefix_ void senf::Parse_Vector_wrapper<Parser,SizeParser,Container>::clear()
212 {
213     container_.erase(container_.begin()+i_,container_.begin()+i_+size()*Parser::bytes());
214     SizeParser(container_.begin()+size_i_) = 0;
215 }
216
217 ///////////////////////////////cti.e///////////////////////////////////////
218 #undef prefix_
219
220 \f
221 // Local Variables:
222 // mode: c++
223 // c-file-style: "senf"
224 // End: