470ed6523334f249d7cdafa0bf752057c9abf248
[senf.git] / senf / Packets / PacketInterpreter.cci
1 // $Id$
2 //
3 // Copyright (C) 2007
4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 // Competence Center NETwork research (NET), St. Augustin, GERMANY
6 //     Stefan Bund <g0dil@berlios.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 /** \file
24     \brief PacketInterpreter inline non-template implementation */
25
26 // Custom includes
27 #include <senf/Utils/senfassert.hh>
28 #include <boost/utility.hpp>
29
30 #define prefix_ inline
31 ///////////////////////////////cci.p///////////////////////////////////////
32
33 ///////////////////////////////////////////////////////////////////////////
34 // senf::PacketInterpreterBase
35
36 // Structors and default members
37
38 prefix_ senf::PacketInterpreterBase::factory_t senf::PacketInterpreterBase::no_factory()
39 {
40     return 0;
41 }
42
43 // Interpreter chain access
44
45 prefix_ senf::PacketInterpreterBase::ptr senf::PacketInterpreterBase::next()
46 {
47     return ptr(impl().next(this));
48 }
49
50 prefix_ senf::PacketInterpreterBase::ptr senf::PacketInterpreterBase::prev()
51 {
52     return ptr(impl().prev(this));
53 }
54
55 prefix_ senf::PacketInterpreterBase::ptr senf::PacketInterpreterBase::first()
56 {
57     return ptr(impl().first());
58 }
59
60 prefix_ senf::PacketInterpreterBase::ptr senf::PacketInterpreterBase::last()
61 {
62     return ptr(impl().last());
63 }
64
65 prefix_ senf::PacketInterpreterBase::ptr
66 senf::PacketInterpreterBase::parseNextAs(factory_t factory)
67 {
68     return factory->parseNext(ptr(this));
69 }
70
71 // Data access
72
73 prefix_ senf::PacketData & senf::PacketInterpreterBase::data()
74 {
75     return (*this);
76 }
77
78 // Access to the abstract interface
79
80 prefix_ senf::PacketInterpreterBase::optional_range
81 senf::PacketInterpreterBase::nextPacketRange()
82 {
83     return v_nextPacketRange();
84 }
85
86 prefix_ senf::TypeIdValue senf::PacketInterpreterBase::typeId()
87 {
88     return v_type();
89 }
90
91 prefix_ senf::PacketInterpreterBase::factory_t senf::PacketInterpreterBase::factory()
92 {
93     return v_factory();
94 }
95
96 prefix_ senf::PacketInterpreterBase::factory_t senf::PacketInterpreterBase::nextPacketType()
97 {
98     return v_nextPacketType();
99 }
100
101 prefix_ void senf::PacketInterpreterBase::clearAnnotations()
102 {
103     return impl().clearAnnotations();
104 }
105
106 ////////////////////////////////////////
107 // protected members
108
109 // protected structors
110
111 prefix_ senf::PacketInterpreterBase::PacketInterpreterBase(detail::PacketImpl * impl,
112                                                            iterator b, iterator e, Append_t)
113     : PacketData(std::distance(impl->begin(),b),
114                  std::distance(impl->begin(),e))
115 {
116     impl->appendInterpreter(this);
117 }
118
119 prefix_ senf::PacketInterpreterBase::PacketInterpreterBase(detail::PacketImpl * impl,
120                                                            iterator b, iterator e, Prepend_t)
121     : PacketData(std::distance(impl->begin(),b),
122                  std::distance(impl->begin(),e))
123 {
124     impl->prependInterpreter(this);
125 }
126
127 prefix_ senf::PacketInterpreterBase::PacketInterpreterBase(detail::PacketImpl * impl,
128                                                            iterator b, iterator e, ptr before)
129     : PacketData(std::distance(impl->begin(),b),
130                  std::distance(impl->begin(),e))
131 {
132     impl->prependInterpreter(this, before.get());
133 }
134
135 prefix_ senf::PacketInterpreterBase::ptr
136 senf::PacketInterpreterBase::appendClone(detail::PacketImpl * impl, iterator base,
137                                          iterator new_base)
138 {
139     return v_appendClone(impl,base,new_base);
140 }
141
142 prefix_ senf::PacketInterpreterBase::ptr
143 senf::PacketInterpreterBase::appendClone(detail::PacketImpl * impl, range r)
144 {
145     return v_appendClone(impl,r);
146 }
147
148 ////////////////////////////////////////
149 // private members
150
151 // containment management. Only to be called by PacketImpl.
152
153 prefix_ void senf::PacketInterpreterBase::assignImpl(detail::PacketImpl * impl)
154 {
155     SENF_ASSERT(!impl_, "Internal failure: PacketInterpreter added to two Packets");
156     impl_ = impl;
157     if (refcount())
158         impl_->add_ref();
159 }
160
161 prefix_ void senf::PacketInterpreterBase::releaseImpl()
162 {
163     SENF_ASSERT(impl_, "Internal failure: release of lone PacketInterpreter");
164     if (refcount()) {
165         detail::PacketImpl * i (impl_);
166         impl_ = 0;
167         // This call might delete this ...
168         i->release();
169     } else {
170         impl_ = 0;
171         delete this;
172     }
173 }
174
175 prefix_ void senf::intrusive_ptr_add_ref(PacketInterpreterBase const * p)
176 {
177     if (! p->refcount())
178         const_cast<PacketInterpreterBase *>(p)->add_ref();
179     else
180         const_cast<PacketInterpreterBase *>(p)->intrusive_refcount_base::add_ref();
181 }
182
183 prefix_ void senf::intrusive_ptr_release(PacketInterpreterBase const * p)
184 {
185     if (p->refcount() <= 1)
186         const_cast<PacketInterpreterBase *>(p)->release();
187     else
188         const_cast<PacketInterpreterBase *>(p)->intrusive_refcount_base::release();
189 }
190
191 ///////////////////////////////cci.e///////////////////////////////////////
192 #undef prefix_
193
194 \f
195 // Local Variables:
196 // mode: c++
197 // fill-column: 100
198 // c-file-style: "senf"
199 // indent-tabs-mode: nil
200 // ispell-local-dictionary: "american"
201 // compile-command: "scons -u test"
202 // comment-column: 40
203 // End: