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