4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
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
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.
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.
19 // The Original Code is Fraunhofer FOKUS code.
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.
26 // Stefan Bund <g0dil@berlios.de>
29 \brief ArrayParser inline template implementation */
31 #include "ArrayParser.ih"
34 #include <senf/Utils/senfassert.hh>
36 #define prefix_ inline
37 //-/////////////////////////////////////////////////////////////////////////////////////////////////
39 //-/////////////////////////////////////////////////////////////////////////////////////////////////
40 // senf::ArrayParser<elements,ElementParser>
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)
47 // Container interface
49 template <unsigned elements, class ElementParser>
50 prefix_ typename senf::ArrayParser<elements,ElementParser>::size_type
51 senf::ArrayParser<elements,ElementParser>::size()
56 template <unsigned elements, class ElementParser>
57 prefix_ typename senf::ArrayParser<elements,ElementParser>::iterator
58 senf::ArrayParser<elements,ElementParser>::begin()
61 return iterator(i(),state());
64 template <unsigned elements, class ElementParser>
65 prefix_ typename senf::ArrayParser<elements,ElementParser>::iterator
66 senf::ArrayParser<elements,ElementParser>::end()
69 return iterator(boost::next(i(),fixed_bytes),state());
72 template <unsigned elements, class ElementParser>
73 prefix_ typename senf::ArrayParser<elements,ElementParser>::value_type
74 senf::ArrayParser<elements,ElementParser>::operator[](difference_type i)
77 // Access out of range element
78 SENF_ASSERT( i>=0 && i < difference_type(elements), "Access to out-of-range array element" );
82 //-/////////////////////////////////////////////////////////////////////////////////////////////////
83 // senf::detail::ArrayParser_iterator<ElementParser>
85 template <class ElementParser>
86 prefix_ senf::detail::ArrayParser_iterator<ElementParser>::ArrayParser_iterator()
90 template <class ElementParser>
91 prefix_ senf::detail::ArrayParser_iterator<ElementParser>::
92 ArrayParser_iterator(PacketParserBase::data_iterator const & i, PacketParserBase::state_type s)
96 template <class ElementParser>
98 senf::detail::ArrayParser_iterator<ElementParser>::operator[](int i)
101 return (*this+i).dereference();
104 template <class ElementParser>
105 prefix_ senf::PacketParserBase::data_iterator
106 senf::detail::ArrayParser_iterator<ElementParser>::raw()
112 // iterator_facade interface
114 template <class ElementParser>
115 prefix_ ElementParser
116 senf::detail::ArrayParser_iterator<ElementParser>::dereference()
119 return ElementParser(i_,s_);
122 template <class ElementParser>
124 senf::detail::ArrayParser_iterator<ElementParser>::
125 equal(ArrayParser_iterator const & other)
131 template <class ElementParser>
132 prefix_ int senf::detail::ArrayParser_iterator<ElementParser>::
133 distance_to(ArrayParser_iterator const & other)
136 return (other.i_-i_)/ElementParser::fixed_bytes;
139 template <class ElementParser>
140 prefix_ void senf::detail::ArrayParser_iterator<ElementParser>::increment()
142 i_ += ElementParser::fixed_bytes;
145 template <class ElementParser>
146 prefix_ void senf::detail::ArrayParser_iterator<ElementParser>::decrement()
148 i_ -= ElementParser::fixed_bytes;
151 template <class ElementParser>
152 prefix_ void senf::detail::ArrayParser_iterator<ElementParser>::advance(int n)
154 i_ += n*ElementParser::fixed_bytes;
157 //-/////////////////////////////////////////////////////////////////////////////////////////////////
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