Merged revisions 262,264-265,267-282,284-298,300-311 via svnmerge from
[senf.git] / Packets / PacketInterpreter.cci
1 // Copyright (C) 2007 
2 // Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
3 // Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
4 //     Stefan Bund <g0dil@berlios.de>
5 //
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.
10 //
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.
15 //
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.
20
21 /** \file
22     \brief PacketInterpreter inline non-template implementation */
23
24 // Custom includes
25 #include <boost/utility.hpp>
26
27 #define prefix_ inline
28 ///////////////////////////////cci.p///////////////////////////////////////
29
30 ///////////////////////////////////////////////////////////////////////////
31 // senf::PacketInterpreterBase
32
33 // Structors and default members
34
35 prefix_ senf::PacketInterpreterBase::factory_t senf::PacketInterpreterBase::no_factory()
36 {
37     return 0;
38 }
39
40 // Interpreter chain access
41
42 prefix_ senf::PacketInterpreterBase::ptr senf::PacketInterpreterBase::next()
43 {
44     return ptr(impl().next(this));
45 }
46
47 prefix_ senf::PacketInterpreterBase::ptr senf::PacketInterpreterBase::prev()
48 {
49     return ptr(impl().prev(this));
50 }
51
52 prefix_ senf::PacketInterpreterBase::ptr senf::PacketInterpreterBase::first()
53 {
54     return ptr(impl().first());
55 }
56
57 prefix_ senf::PacketInterpreterBase::ptr senf::PacketInterpreterBase::last()
58 {
59     return ptr(impl().last());
60 }
61
62 prefix_ senf::PacketInterpreterBase::ptr
63 senf::PacketInterpreterBase::parseNextAs(factory_t factory)
64 {
65     return factory->parseNext(ptr(this));
66 }
67
68 // Data access
69
70 prefix_ senf::PacketData & senf::PacketInterpreterBase::data()
71 {
72     return (*this);
73 }
74
75 // Access to the abstract interface
76
77 prefix_ senf::PacketInterpreterBase::optional_range
78 senf::PacketInterpreterBase::nextPacketRange()
79 {
80     return v_nextPacketRange();
81 }
82
83 prefix_ senf::TypeIdValue senf::PacketInterpreterBase::typeId()
84 {
85     return v_type();
86 }
87
88 prefix_ senf::PacketInterpreterBase::factory_t senf::PacketInterpreterBase::factory()
89 {
90     return v_factory();
91 }
92
93 prefix_ senf::PacketInterpreterBase::factory_t senf::PacketInterpreterBase::nextPacketType()
94 {
95     return v_nextPacketType();
96 }
97
98 ////////////////////////////////////////
99 // protected members
100
101 // protected structors
102
103 prefix_ senf::PacketInterpreterBase::PacketInterpreterBase(detail::PacketImpl * impl,
104                                                            iterator b, iterator e, Append_t)
105     : PacketData(std::distance(impl->begin(),b),
106                  std::distance(impl->begin(),e))
107 {
108     impl->appendInterpreter(this);
109 }
110
111 prefix_ senf::PacketInterpreterBase::PacketInterpreterBase(detail::PacketImpl * impl,
112                                                            iterator b, iterator e, Prepend_t)
113     : PacketData(std::distance(impl->begin(),b),
114                  std::distance(impl->begin(),e))
115 {
116         impl->prependInterpreter(this);
117 }
118
119 prefix_ senf::PacketInterpreterBase::ptr
120 senf::PacketInterpreterBase::appendClone(detail::PacketImpl * impl, iterator base,
121                                          iterator new_base)
122 {
123     return v_appendClone(impl,base,new_base);
124 }
125
126 prefix_ senf::PacketInterpreterBase::ptr
127 senf::PacketInterpreterBase::appendClone(detail::PacketImpl * impl, range r)
128 {
129     return v_appendClone(impl,r);
130 }
131
132 ////////////////////////////////////////
133 // private members
134
135 // reference/memory management
136
137 prefix_ void senf::PacketInterpreterBase::add_ref()
138 {
139     intrusive_refcount_t<PacketInterpreterBase>::add_ref();
140     if (impl_)
141         impl_->add_ref();
142 }
143
144 prefix_ bool senf::PacketInterpreterBase::release()
145 {
146     if (impl_) 
147         // This call will set impl_ to 0 if we just removed the last reference ...
148         impl_->release();
149     return intrusive_refcount_t<PacketInterpreterBase>::release() && !impl_;
150 }
151
152 // containment management. Only to be called by PacketImpl.
153
154 prefix_ void senf::PacketInterpreterBase::assignImpl(detail::PacketImpl * impl)
155 {
156     BOOST_ASSERT(!impl_);
157     impl_ = impl;
158     impl_->add_ref(refcount());
159 }
160
161 prefix_ void senf::PacketInterpreterBase::releaseImpl()
162 {
163     BOOST_ASSERT(impl_);
164     refcount_t refc (refcount());
165     if (refc) {
166         impl_->release(refc);
167         impl_ = 0;
168     } else {
169         impl_ = 0;
170         delete this;
171     }
172 }
173
174
175 ///////////////////////////////cci.e///////////////////////////////////////
176 #undef prefix_
177
178 \f
179 // Local Variables:
180 // mode: c++
181 // fill-column: 100
182 // c-file-style: "senf"
183 // indent-tabs-mode: nil
184 // ispell-local-dictionary: "american"
185 // End: