switch to new MPL based Fraunhofer FOKUS Public License
[senf.git] / senf / Packets / ArrayParser.cti
1 // $Id$
2 //
3 // Copyright (C) 2006
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 ArrayParser inline template implementation */
30
31 #include "ArrayParser.ih"
32
33 // Custom includes
34 #include <senf/Utils/senfassert.hh>
35
36 #define prefix_ inline
37 //-/////////////////////////////////////////////////////////////////////////////////////////////////
38
39 //-/////////////////////////////////////////////////////////////////////////////////////////////////
40 // senf::ArrayParser<elements,ElementParser>
41
42 template <unsigned elements, class ElementParser>
43 prefix_ senf::ArrayParser<elements,ElementParser>::ArrayParser(data_iterator i, state_type s)
44     : PacketParserBase(i,s,fixed_bytes)
45 {}
46
47 // Container interface
48
49 template <unsigned elements, class ElementParser>
50 prefix_ typename senf::ArrayParser<elements,ElementParser>::size_type
51 senf::ArrayParser<elements,ElementParser>::size()
52 {
53     return elements;
54 }
55
56 template <unsigned elements, class ElementParser>
57 prefix_ typename senf::ArrayParser<elements,ElementParser>::iterator
58 senf::ArrayParser<elements,ElementParser>::begin()
59     const
60 {
61     return iterator(i(),state());
62 }
63
64 template <unsigned elements, class ElementParser>
65 prefix_ typename senf::ArrayParser<elements,ElementParser>::iterator
66 senf::ArrayParser<elements,ElementParser>::end()
67     const
68 {
69     return iterator(boost::next(i(),fixed_bytes),state());
70 }
71
72 template <unsigned elements, class ElementParser>
73 prefix_ typename senf::ArrayParser<elements,ElementParser>::value_type
74 senf::ArrayParser<elements,ElementParser>::operator[](difference_type i)
75     const
76 {
77     // Access out of range element
78     SENF_ASSERT( i>=0 && i < difference_type(elements), "Access to out-of-range array element" );
79     return begin()[i];
80 }
81
82 //-/////////////////////////////////////////////////////////////////////////////////////////////////
83 // senf::detail::ArrayParser_iterator<ElementParser>
84
85 template <class ElementParser>
86 prefix_ senf::detail::ArrayParser_iterator<ElementParser>::ArrayParser_iterator()
87     : i_()
88 {}
89
90 template <class ElementParser>
91 prefix_  senf::detail::ArrayParser_iterator<ElementParser>::
92 ArrayParser_iterator(PacketParserBase::data_iterator const & i, PacketParserBase::state_type s)
93     : i_(i), s_(s)
94 {}
95
96 template <class ElementParser>
97 prefix_ ElementParser
98 senf::detail::ArrayParser_iterator<ElementParser>::operator[](int i)
99     const
100 {
101     return (*this+i).dereference();
102 }
103
104 template <class ElementParser>
105 prefix_ senf::PacketParserBase::data_iterator
106 senf::detail::ArrayParser_iterator<ElementParser>::raw()
107     const
108 {
109     return i_;
110 }
111
112 // iterator_facade interface
113
114 template <class ElementParser>
115 prefix_ ElementParser
116 senf::detail::ArrayParser_iterator<ElementParser>::dereference()
117     const
118 {
119     return ElementParser(i_,s_);
120 }
121
122 template <class ElementParser>
123 prefix_ bool
124 senf::detail::ArrayParser_iterator<ElementParser>::
125 equal(ArrayParser_iterator const & other)
126     const
127 {
128     return i_==other.i_;
129 }
130
131 template <class ElementParser>
132 prefix_ int senf::detail::ArrayParser_iterator<ElementParser>::
133 distance_to(ArrayParser_iterator const & other)
134     const
135 {
136     return (other.i_-i_)/ElementParser::fixed_bytes;
137 }
138
139 template <class ElementParser>
140 prefix_ void senf::detail::ArrayParser_iterator<ElementParser>::increment()
141 {
142     i_ += ElementParser::fixed_bytes;
143 }
144
145 template <class ElementParser>
146 prefix_ void senf::detail::ArrayParser_iterator<ElementParser>::decrement()
147 {
148     i_ -= ElementParser::fixed_bytes;
149 }
150
151 template <class ElementParser>
152 prefix_ void senf::detail::ArrayParser_iterator<ElementParser>::advance(int n)
153 {
154     i_ += n*ElementParser::fixed_bytes;
155 }
156
157 //-/////////////////////////////////////////////////////////////////////////////////////////////////
158 #undef prefix_
159
160 \f
161 // Local Variables:
162 // mode: c++
163 // fill-column: 100
164 // c-file-style: "senf"
165 // indent-tabs-mode: nil
166 // ispell-local-dictionary: "american"
167 // compile-command: "scons -u test"
168 // comment-column: 40
169 // End: