00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00026 #include "ArrayParser.ih"
00027
00028
00029 #include <senf/Utils/senfassert.hh>
00030
00031 #define prefix_ inline
00032
00033
00034
00035
00036
00037 template <unsigned elements, class ElementParser>
00038 prefix_ senf::ArrayParser<elements,ElementParser>::ArrayParser(data_iterator i, state_type s)
00039 : PacketParserBase(i,s,fixed_bytes)
00040 {}
00041
00042
00043
00044 template <unsigned elements, class ElementParser>
00045 prefix_ typename senf::ArrayParser<elements,ElementParser>::size_type
00046 senf::ArrayParser<elements,ElementParser>::size()
00047 {
00048 return elements;
00049 }
00050
00051 template <unsigned elements, class ElementParser>
00052 prefix_ typename senf::ArrayParser<elements,ElementParser>::iterator
00053 senf::ArrayParser<elements,ElementParser>::begin()
00054 const
00055 {
00056 return iterator(i(),state());
00057 }
00058
00059 template <unsigned elements, class ElementParser>
00060 prefix_ typename senf::ArrayParser<elements,ElementParser>::iterator
00061 senf::ArrayParser<elements,ElementParser>::end()
00062 const
00063 {
00064 return iterator(boost::next(i(),fixed_bytes),state());
00065 }
00066
00067 template <unsigned elements, class ElementParser>
00068 prefix_ typename senf::ArrayParser<elements,ElementParser>::value_type
00069 senf::ArrayParser<elements,ElementParser>::operator[](difference_type i)
00070 const
00071 {
00072
00073 SENF_ASSERT( i>=0 && i < difference_type(elements), "Access to out-of-range array element" );
00074 return begin()[i];
00075 }
00076
00077
00078
00079
00080 template <class ElementParser>
00081 prefix_ senf::detail::ArrayParser_iterator<ElementParser>::ArrayParser_iterator()
00082 : i_()
00083 {}
00084
00085 template <class ElementParser>
00086 prefix_ senf::detail::ArrayParser_iterator<ElementParser>::
00087 ArrayParser_iterator(PacketParserBase::data_iterator const & i, PacketParserBase::state_type s)
00088 : i_(i), s_(s)
00089 {}
00090
00091 template <class ElementParser>
00092 prefix_ ElementParser
00093 senf::detail::ArrayParser_iterator<ElementParser>::operator[](int i)
00094 const
00095 {
00096 return (*this+i).dereference();
00097 }
00098
00099 template <class ElementParser>
00100 prefix_ senf::PacketParserBase::data_iterator
00101 senf::detail::ArrayParser_iterator<ElementParser>::raw()
00102 const
00103 {
00104 return i_;
00105 }
00106
00107
00108
00109 template <class ElementParser>
00110 prefix_ ElementParser
00111 senf::detail::ArrayParser_iterator<ElementParser>::dereference()
00112 const
00113 {
00114 return ElementParser(i_,s_);
00115 }
00116
00117 template <class ElementParser>
00118 prefix_ bool
00119 senf::detail::ArrayParser_iterator<ElementParser>::
00120 equal(ArrayParser_iterator const & other)
00121 const
00122 {
00123 return i_==other.i_;
00124 }
00125
00126 template <class ElementParser>
00127 prefix_ int senf::detail::ArrayParser_iterator<ElementParser>::
00128 distance_to(ArrayParser_iterator const & other)
00129 const
00130 {
00131 return (other.i_-i_)/ElementParser::fixed_bytes;
00132 }
00133
00134 template <class ElementParser>
00135 prefix_ void senf::detail::ArrayParser_iterator<ElementParser>::increment()
00136 {
00137 i_ += ElementParser::fixed_bytes;
00138 }
00139
00140 template <class ElementParser>
00141 prefix_ void senf::detail::ArrayParser_iterator<ElementParser>::decrement()
00142 {
00143 i_ -= ElementParser::fixed_bytes;
00144 }
00145
00146 template <class ElementParser>
00147 prefix_ void senf::detail::ArrayParser_iterator<ElementParser>::advance(int n)
00148 {
00149 i_ += n*ElementParser::fixed_bytes;
00150 }
00151
00152
00153 #undef prefix_
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164