Packets: not really a smart but efficient 'shortcut' for ConcretePacket::next() ...
[senf.git] / senf / Packets / PacketInterpreter.cci
1 // $Id$
2 //
3 // Copyright (C) 2007
4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 //
6 // The contents of this file are subject to the Fraunhofer FOKUS Public License
7 // Version 1.0 (the "License"); you may not use this file except in compliance
8 // with the License. You may obtain a copy of the License at 
9 // http://senf.berlios.de/license.html
10 //
11 // The Fraunhofer FOKUS Public License Version 1.0 is based on, 
12 // but modifies the Mozilla Public License Version 1.1.
13 // See the full license text for the amendments.
14 //
15 // Software distributed under the License is distributed on an "AS IS" basis, 
16 // WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 
17 // for the specific language governing rights and limitations under the License.
18 //
19 // The Original Code is Fraunhofer FOKUS code.
20 //
21 // The Initial Developer of the Original Code is Fraunhofer-Gesellschaft e.V. 
22 // (registered association), Hansastraße 27 c, 80686 Munich, Germany.
23 // All Rights Reserved.
24 //
25 // Contributor(s):
26 //   Stefan Bund <g0dil@berlios.de>
27
28 /** \file
29     \brief PacketInterpreter inline non-template implementation */
30
31 // Custom includes
32 #include <senf/Utils/senfassert.hh>
33 #include <boost/utility.hpp>
34
35 #define prefix_ inline
36 //-/////////////////////////////////////////////////////////////////////////////////////////////////
37
38 //-/////////////////////////////////////////////////////////////////////////////////////////////////
39 // senf::PacketInterpreterBase
40
41 // Structors and default members
42
43 prefix_ senf::PacketInterpreterBase::factory_t senf::PacketInterpreterBase::no_factory()
44 {
45     return 0;
46 }
47
48 // Interpreter chain access
49
50 prefix_ senf::PacketInterpreterBase::ptr senf::PacketInterpreterBase::next()
51 {
52     return ptr(impl().next(this));
53 }
54
55 prefix_ senf::PacketInterpreterBase::ptr senf::PacketInterpreterBase::prev()
56 {
57     return ptr(impl().prev(this));
58 }
59
60 prefix_ senf::PacketInterpreterBase::ptr senf::PacketInterpreterBase::first()
61 {
62     return ptr(impl().first());
63 }
64
65 prefix_ senf::PacketInterpreterBase::ptr senf::PacketInterpreterBase::last()
66 {
67     return ptr(impl().last());
68 }
69
70 prefix_ senf::PacketInterpreterBase::ptr
71 senf::PacketInterpreterBase::parseNextAs(factory_t factory, PacketInterpreterBase::optional_range const & range)
72 {
73     return factory->parseNext(ptr(this), range);
74 }
75
76 // Data access
77
78 prefix_ senf::PacketData & senf::PacketInterpreterBase::data()
79 {
80     return (*this);
81 }
82
83 // Access to the abstract interface
84
85 prefix_ senf::PacketInterpreterBase::optional_range
86 senf::PacketInterpreterBase::nextPacketRange()
87 {
88     return v_nextPacketRange();
89 }
90
91 prefix_ senf::TypeIdValue senf::PacketInterpreterBase::typeId()
92 {
93     return v_type();
94 }
95
96 prefix_ senf::PacketInterpreterBase::factory_t senf::PacketInterpreterBase::factory()
97 {
98     return v_factory();
99 }
100
101 prefix_ senf::PacketInterpreterBase::factory_t senf::PacketInterpreterBase::nextPacketType()
102 {
103     return v_nextPacketType();
104 }
105
106 prefix_ void senf::PacketInterpreterBase::clearAnnotations()
107 {
108     return impl().clearAnnotations();
109 }
110
111 //-/////////////////////////////////////////////////////////////////////////////////////////////////
112 // protected members
113
114 // protected structors
115
116 prefix_ senf::PacketInterpreterBase::PacketInterpreterBase(detail::PacketImpl * impl,
117                                                            iterator b, iterator e, Append_t)
118     : PacketData(std::distance(impl->begin(),b),
119                  std::distance(impl->begin(),e))
120 {
121     impl->appendInterpreter(this);
122 }
123
124 prefix_ senf::PacketInterpreterBase::PacketInterpreterBase(detail::PacketImpl * impl,
125                                                            iterator b, iterator e, Prepend_t)
126     : PacketData(std::distance(impl->begin(),b),
127                  std::distance(impl->begin(),e))
128 {
129     impl->prependInterpreter(this);
130 }
131
132 prefix_ senf::PacketInterpreterBase::PacketInterpreterBase(detail::PacketImpl * impl,
133                                                            iterator b, iterator e, ptr before)
134     : PacketData(std::distance(impl->begin(),b),
135                  std::distance(impl->begin(),e))
136 {
137     impl->prependInterpreter(this, before.get());
138 }
139
140 prefix_ senf::PacketInterpreterBase::ptr
141 senf::PacketInterpreterBase::appendClone(detail::PacketImpl * impl, iterator base,
142                                          iterator new_base)
143 {
144     return v_appendClone(impl,base,new_base);
145 }
146
147 prefix_ senf::PacketInterpreterBase::ptr
148 senf::PacketInterpreterBase::appendClone(detail::PacketImpl * impl, range r)
149 {
150     return v_appendClone(impl,r);
151 }
152
153 //-/////////////////////////////////////////////////////////////////////////////////////////////////
154 // private members
155
156 // containment management. Only to be called by PacketImpl.
157
158 prefix_ void senf::PacketInterpreterBase::assignImpl(detail::PacketImpl * impl)
159 {
160     SENF_ASSERT(!impl_, "Internal failure: PacketInterpreter added to two Packets");
161     impl_ = impl;
162     if (refcount())
163         impl_->add_ref();
164 }
165
166 prefix_ void senf::PacketInterpreterBase::releaseImpl()
167 {
168     SENF_ASSERT(impl_, "Internal failure: release of lone PacketInterpreter");
169     if (refcount()) {
170         detail::PacketImpl * i (impl_);
171         impl_ = 0;
172         // This call might delete this ...
173         i->release();
174     } else {
175         impl_ = 0;
176         delete this;
177     }
178 }
179
180 prefix_ void senf::intrusive_ptr_add_ref(PacketInterpreterBase const * p)
181 {
182     if (! p->refcount())
183         const_cast<PacketInterpreterBase *>(p)->add_ref();
184     else
185         const_cast<PacketInterpreterBase *>(p)->intrusive_refcount_base::add_ref();
186 }
187
188 prefix_ void senf::intrusive_ptr_release(PacketInterpreterBase const * p)
189 {
190     if (p->refcount() <= 1)
191         const_cast<PacketInterpreterBase *>(p)->release();
192     else
193         const_cast<PacketInterpreterBase *>(p)->intrusive_refcount_base::release();
194 }
195
196 //-/////////////////////////////////////////////////////////////////////////////////////////////////
197 #undef prefix_
198
199 \f
200 // Local Variables:
201 // mode: c++
202 // fill-column: 100
203 // c-file-style: "senf"
204 // indent-tabs-mode: nil
205 // ispell-local-dictionary: "american"
206 // compile-command: "scons -u test"
207 // comment-column: 40
208 // End: