c6f46caac52c6dc98ab885fde7fd797ff6e5c003
[senf.git] / Packets / ParseArray.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 "ParseArray.ih"
26
27 // Custom includes
28 #include <algorithm>
29 #if defined(_STLP_ALGORITHM) || (__GNUC__<4 && __GNUC_MINOR__<4)
30 #define copy_n std::copy_n
31 #else
32 #include <ext/algorithm>
33 #define copy_n __gnu_cxx::copy_n
34 #endif
35
36 #define prefix_ inline
37 ///////////////////////////////cti.p///////////////////////////////////////
38
39 template <unsigned elements, class Parser, class Iterator, class IPacket>
40 prefix_ senf::Parse_Array<elements,Parser,Iterator,IPacket>::Parse_Array()
41 {}
42
43 template <unsigned elements, class Parser, class Iterator, class IPacket>
44 prefix_
45 senf::Parse_Array<elements,Parser,Iterator,IPacket>::Parse_Array(Iterator const & i)
46     : ParserBase<Iterator,IPacket>(i) 
47 {}
48
49 template <unsigned elements, class Parser, class Iterator, class IPacket>
50 prefix_ unsigned senf::Parse_Array<elements,Parser,Iterator,IPacket>::bytes()
51 {
52     return elements*Parser::bytes();
53 }
54
55 template <unsigned elements, class Parser, class Iterator, class IPacket>
56 prefix_ bool
57 senf::Parse_Array<elements,Parser,Iterator,IPacket>::check(Iterator const & e)
58     const
59 {
60     return e-this->i() >= bytes();
61 }
62
63 template <unsigned elements, class Parser, class Iterator, class IPacket>
64 prefix_ void senf::Parse_Array<elements,Parser,Iterator,IPacket>::init()
65     const
66 {
67     iterator e=end();
68     for (iterator i=begin(); i!=e; ++i) i->init();
69 }
70
71 ///////////////////////////////////////////////////////////////////////////
72
73 template <unsigned elements, class Parser, class Iterator, class IPacket>
74 prefix_ typename senf::Parse_Array<elements,Parser,Iterator,IPacket>::size_type
75 senf::Parse_Array<elements,Parser,Iterator,IPacket>::size()
76 {
77     return elements;
78 }
79
80 template <unsigned elements, class Parser, class Iterator, class IPacket>
81 prefix_ typename senf::Parse_Array<elements,Parser,Iterator,IPacket>::iterator
82 senf::Parse_Array<elements,Parser,Iterator,IPacket>::begin()
83     const
84 {
85     return iterator(this->i());
86 }
87
88 template <unsigned elements, class Parser, class Iterator, class IPacket>
89 prefix_ typename senf::Parse_Array<elements,Parser,Iterator,IPacket>::iterator
90 senf::Parse_Array<elements,Parser,Iterator,IPacket>::end()
91     const
92 {
93     return iterator(this->i()+bytes());
94 }
95
96 template <unsigned elements, class Parser, class Iterator, class IPacket>
97 prefix_ typename senf::Parse_Array<elements,Parser,Iterator,IPacket>::range_type
98 senf::Parse_Array<elements,Parser,Iterator,IPacket>::range()
99     const
100 {
101     return std::make_pair(begin(),end());
102 }
103
104 template <unsigned elements, class Parser, class Iterator, class IPacket>
105 prefix_ typename senf::Parse_Array<elements,Parser,Iterator,IPacket>::iterator
106 senf::Parse_Array<elements,Parser,Iterator,IPacket>::value()
107     const
108 {
109     return begin();
110 }
111
112 template <unsigned elements, class Parser, class Iterator, class IPacket>
113 prefix_ typename senf::Parse_Array<elements,Parser,Iterator,IPacket>::value_type
114 senf::Parse_Array<elements,Parser,Iterator,IPacket>::operator[](difference_type i)
115     const
116 {
117     return begin()[i];
118 }
119
120 template <unsigned elements, class Parser, class Iterator, class IPacket>
121 template <class InputIterator>
122 prefix_ senf::Parse_Array<elements,Parser,Iterator,IPacket> const &
123 senf::Parse_Array<elements,Parser,Iterator,IPacket>::operator=(InputIterator const & i)
124 {
125     copy_n(i,size(),begin());
126 }
127
128 ///////////////////////////////////////////////////////////////////////////
129
130 template <class Parser, class Iterator>
131 prefix_ Iterator senf::impl::Parse_Array_iterator<Parser,Iterator>::raw()
132     const
133 {
134     return i_;
135 }
136
137 template <class Parser, class Iterator>
138 prefix_ Parser senf::impl::Parse_Array_iterator<Parser,Iterator>::operator[](int i)
139     const
140 {
141     return (*this+i).dereference();
142 }
143
144 template <class Parser, class Iterator>
145 prefix_ senf::impl::Parse_Array_iterator<Parser,Iterator>::Parse_Array_iterator()
146     : i_()
147 {}
148
149 template <class Parser, class Iterator>
150 prefix_  senf::impl::Parse_Array_iterator<Parser,Iterator>::
151 Parse_Array_iterator(Iterator const & i)
152     : i_(i)
153 {}
154
155 template <class Parser, class Iterator>
156 prefix_ Parser
157 senf::impl::Parse_Array_iterator<Parser,Iterator>::dereference()
158     const
159 {
160     return Parser(i_);
161 }
162
163 template <class Parser, class Iterator>
164 prefix_ bool senf::impl::Parse_Array_iterator<Parser,Iterator>::
165 equal(Parse_Array_iterator const & other)
166     const
167 {
168     return i_==other.i_;
169 }
170
171 template <class Parser, class Iterator>
172 prefix_ int senf::impl::Parse_Array_iterator<Parser,Iterator>::
173 distance_to(Parse_Array_iterator const & other)
174     const
175 {
176     return (other.i_-i_)/Parser::bytes();
177 }
178
179 template <class Parser, class Iterator>
180 prefix_ void senf::impl::Parse_Array_iterator<Parser,Iterator>::increment()
181 {
182     i_ += Parser::bytes();
183 }
184
185 template <class Parser, class Iterator>
186 prefix_ void senf::impl::Parse_Array_iterator<Parser,Iterator>::decrement()
187 {
188     i_ -= Parser::bytes();
189 }
190
191 template <class Parser, class Iterator>
192 prefix_ void
193 senf::impl::Parse_Array_iterator<Parser,Iterator>::advance(int n)
194 {
195     i_ += n*Parser::bytes();
196 }
197
198 #undef copy_n
199 ///////////////////////////////cti.e///////////////////////////////////////
200 #undef prefix_
201
202 \f
203 // Local Variables:
204 // mode: c++
205 // c-file-style: "senf"
206 // End: