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 Packet inline template implementation */
24 //#include "Packet.ih"
28 #define prefix_ inline
29 ///////////////////////////////cti.p///////////////////////////////////////
31 ///////////////////////////////////////////////////////////////////////////
34 // conversion constructors
36 template <class PacketType>
37 prefix_ senf::Packet::Packet(ConcretePacket<PacketType> packet)
38 : packet_(packet.ptr())
41 // interpreter chain access
43 template <class OtherPacket>
44 prefix_ OtherPacket senf::Packet::parseNextAs()
47 return OtherPacket(ptr()->parseNextAs<typename OtherPacket::type>());
50 template <class OtherPacket>
51 prefix_ bool senf::Packet::is()
54 return ptr()->is<typename OtherPacket::type>();
57 template <class OtherPacket>
58 prefix_ OtherPacket senf::Packet::as()
61 return OtherPacket(ptr()->as<typename OtherPacket::type>());
64 template <class OtherPacket>
65 prefix_ OtherPacket senf::Packet::next()
68 OtherPacket p (next<OtherPacket>(nothrow));
69 if (!p) throw InvalidPacketChainException();
74 template <class OtherPacket>
75 prefix_ OtherPacket senf::Packet::next(NoThrow_t)
79 return p ? p.findNext<OtherPacket>(nothrow) : OtherPacket();
82 template <class OtherPacket>
83 prefix_ OtherPacket senf::Packet::prev()
86 OtherPacket p (prev<OtherPacket>(nothrow));
87 if (!p) throw InvalidPacketChainException();
91 template <class OtherPacket>
92 prefix_ OtherPacket senf::Packet::prev(NoThrow_t)
96 return p ? p.findPrev<OtherPacket>(nothrow) : OtherPacket();
99 template <class OtherPacket>
100 prefix_ OtherPacket senf::Packet::findNext()
103 OtherPacket p (findNext<OtherPacket>(nothrow));
104 if (!p) throw InvalidPacketChainException();
108 template <class OtherPacket>
109 prefix_ OtherPacket senf::Packet::findPrev()
112 OtherPacket p (findPrev<OtherPacket>(nothrow));
113 if (!p) throw InvalidPacketChainException();
117 template <class OtherPacket>
118 prefix_ OtherPacket senf::Packet::last()
121 return last().findPrev<OtherPacket>();
124 template <class OtherPacket>
125 prefix_ OtherPacket senf::Packet::last(NoThrow_t)
128 return last().findPrev<OtherPacket>(nothrow);
131 template <class OtherPacket>
132 prefix_ OtherPacket senf::Packet::first()
135 return first().findNext<OtherPacket>();
138 template <class OtherPacket>
139 prefix_ OtherPacket senf::Packet::first(NoThrow_t)
142 return first().findNext<OtherPacket>(nothrow);
145 ///////////////////////////////////////////////////////////////////////////
146 // senf::ConcretePacket<PacketType>
148 // structors and default members
150 template <class PacketType>
151 prefix_ senf::ConcretePacket<PacketType>::ConcretePacket()
154 template <class PacketType>
155 prefix_ typename senf::ConcretePacket<PacketType>::factory_t
156 senf::ConcretePacket<PacketType>::factory()
158 return interpreter::factory();
161 // Create completely new packet
163 template <class PacketType>
164 prefix_ senf::ConcretePacket<PacketType>
165 senf::ConcretePacket<PacketType>::create()
167 return ConcretePacket(interpreter::create());
170 template <class PacketType>
171 prefix_ senf::ConcretePacket<PacketType>
172 senf::ConcretePacket<PacketType>::create(NoInit_t)
174 return ConcretePacket(interpreter::create(interpreter::noinit));
177 template <class PacketType>
178 prefix_ senf::ConcretePacket<PacketType>
179 senf::ConcretePacket<PacketType>::create(size_type size)
181 return ConcretePacket(interpreter::create(size));
184 template <class PacketType>
185 prefix_ senf::ConcretePacket<PacketType>
186 senf::ConcretePacket<PacketType>::create(size_type size, NoInit_t)
188 return ConcretePacket(interpreter::create(size,interpreter::noinit));
191 template <class PacketType>
192 template <class ForwardReadableRange>
193 prefix_ senf::ConcretePacket<PacketType>
194 senf::ConcretePacket<PacketType>::create(ForwardReadableRange const & range)
196 return ConcretePacket(interpreter::create(range));
199 // Create packet as new packet after a given packet
201 template <class PacketType>
202 prefix_ senf::ConcretePacket<PacketType>
203 senf::ConcretePacket<PacketType>::createAfter(Packet packet)
205 return ConcretePacket(interpreter::createAfter(packet.ptr()));
208 template <class PacketType>
209 prefix_ senf::ConcretePacket<PacketType>
210 senf::ConcretePacket<PacketType>::createAfter(Packet packet, NoInit_t)
212 return ConcretePacket(interpreter::createAfter(packet.ptr(),interpreter::noinit));
215 template <class PacketType>
216 prefix_ senf::ConcretePacket<PacketType>
217 senf::ConcretePacket<PacketType>::createAfter(Packet packet, size_type size)
219 return ConcretePacket(interpreter::createAfter(packet.ptr(), size));
222 template <class PacketType>
223 prefix_ senf::ConcretePacket<PacketType>
224 senf::ConcretePacket<PacketType>::createAfter(Packet packet, size_type size, NoInit_t)
226 return ConcretePacket(interpreter::createAfter(packet.ptr(), size, interpreter::noinit));
229 template <class PacketType>
230 template <class ForwardReadableRange>
231 prefix_ senf::ConcretePacket<PacketType>
232 senf::ConcretePacket<PacketType>::createAfter(Packet packet, ForwardReadableRange const & range)
234 return ConcretePacket(interpreter::createAfter(packet.ptr(), range));
237 // Create packet as new packet (header) before a given packet
239 template <class PacketType>
240 prefix_ senf::ConcretePacket<PacketType>
241 senf::ConcretePacket<PacketType>::createBefore(Packet packet)
243 return ConcretePacket(interpreter::createBefore(packet.ptr()));
246 template <class PacketType>
247 prefix_ senf::ConcretePacket<PacketType>
248 senf::ConcretePacket<PacketType>::createBefore(Packet packet, NoInit_t)
250 return ConcretePacket(interpreter::createBefore(packet.ptr(), interpreter::noinit));
253 // Create a clone of the current packet
255 template <class PacketType>
256 prefix_ senf::ConcretePacket<PacketType>
257 senf::ConcretePacket<PacketType>::clone()
260 return ConcretePacket(ptr()->clone());
265 template <class PacketType>
266 prefix_ typename senf::ConcretePacket<PacketType>::type::parser *
267 senf::ConcretePacket<PacketType>::operator->()
270 return ptr()->fields_p();
275 template <class PacketType>
276 prefix_ senf::ConcretePacket<PacketType>::ConcretePacket(typename interpreter::ptr packet_)
280 template <class PacketType>
281 prefix_ typename senf::ConcretePacket<PacketType>::interpreter::ptr
282 senf::ConcretePacket<PacketType>::ptr()
285 return boost::static_pointer_cast< PacketInterpreter<PacketType> >(Packet::ptr());
288 ///////////////////////////////cti.e///////////////////////////////////////
295 // c-file-style: "senf"
296 // indent-tabs-mode: nil
297 // ispell-local-dictionary: "american"
298 // compile-command: "scons -u test"
299 // comment-column: 40