00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00026 #ifndef HH_SENF_Packets_AuxParser_
00027 #define HH_SENF_Packets_AuxParser_ 1
00028
00029 #ifndef HH_SENF_Packets_Packets_
00030 #error "Don't include 'AuxParser.hh' directly, include 'Packets.hh'"
00031 #endif
00032
00033
00034 #include "PacketParser.hh"
00035 #include "SafeIterator.hh"
00036
00037
00038
00039
00040 namespace senf {
00041 namespace detail {
00042
00047 template <class P>
00048 struct PrefixAuxParserPolicy
00049 {
00050 typedef PrefixAuxParserPolicy WrapperPolicy;
00051 typedef PrefixAuxParserPolicy ParserPolicy;
00052
00053 static PacketParserBase::size_type const aux_bytes = P::fixed_bytes;
00054
00055 typename P::value_type aux(PacketParserBase::data_iterator i, PacketParserBase::state_type s) const;
00056 void aux(typename P::value_type const & v, PacketParserBase::data_iterator i, PacketParserBase::state_type s) const;
00057 PacketParserBase::data_iterator adjust(PacketParserBase::data_iterator i, PacketParserBase::state_type s) const;
00058 };
00059
00064 template <class P, unsigned Dist>
00065 struct FixedAuxParserPolicy
00066 {
00067 typedef FixedAuxParserPolicy WrapperPolicy;
00068 typedef FixedAuxParserPolicy ParserPolicy;
00069
00070 static PacketParserBase::size_type const aux_bytes = 0;
00071
00072 typename P::value_type aux(PacketParserBase::data_iterator i, PacketParserBase::state_type s) const;
00073 void aux(typename P::value_type const & v, PacketParserBase::data_iterator i, PacketParserBase::state_type s) const;
00074 PacketParserBase::data_iterator adjust(PacketParserBase::data_iterator i, PacketParserBase::state_type s) const;
00075 };
00076
00077 template <class P> struct DynamicWrapperAuxParserPolicy;
00078
00083 template <class P>
00084 struct DynamicAuxParserPolicy
00085 {
00086 typedef DynamicWrapperAuxParserPolicy<P> WrapperPolicy;
00087 typedef DynamicAuxParserPolicy<P> ParserPolicy;
00088
00089 static PacketParserBase::size_type const aux_bytes = 0;
00090
00091 DynamicAuxParserPolicy(P p);
00092 DynamicAuxParserPolicy(WrapperPolicy const & other);
00093
00094 typename P::value_type aux(PacketParserBase::data_iterator i, PacketParserBase::state_type s) const;
00095 void aux(typename P::value_type const & v, PacketParserBase::data_iterator i, PacketParserBase::state_type s) const;
00096 PacketParserBase::data_iterator adjust(PacketParserBase::data_iterator i, PacketParserBase::state_type s) const;
00097
00098 mutable P p_;
00099 };
00100
00106 template <class P>
00107 struct DynamicWrapperAuxParserPolicy
00108 {
00109 typedef DynamicWrapperAuxParserPolicy<P> WrapperPolicy;
00110 typedef DynamicAuxParserPolicy<P> ParserPolicy;
00111
00112 static PacketParserBase::size_type const aux_bytes = 0;
00113
00114 DynamicWrapperAuxParserPolicy(ParserPolicy const & other);
00115
00116 typename P::value_type aux(PacketParserBase::data_iterator i, PacketParserBase::state_type s) const;
00117 void aux(typename P::value_type const & v, PacketParserBase::data_iterator i, PacketParserBase::state_type s) const;
00118 PacketParserBase::data_iterator adjust(PacketParserBase::data_iterator i, PacketParserBase::state_type s) const;
00119
00120 mutable SafePacketParserWrapper<P> p_;
00121 };
00122
00135 template <class Policy, class Transform>
00136 struct TransformAuxParserPolicy
00137 : public Policy
00138 {
00139 typedef TransformAuxParserPolicy<typename Policy::WrapperPolicy, Transform> WrapperPolicy;
00140 typedef TransformAuxParserPolicy<typename Policy::ParserPolicy, Transform> ParserPolicy;
00141
00142 static PacketParserBase::size_type const aux_bytes = Policy::aux_bytes;
00143
00144 TransformAuxParserPolicy();
00145 template <class Arg> TransformAuxParserPolicy(Arg const & arg);
00146
00147 typename Transform::value_type aux(PacketParserBase::data_iterator i, PacketParserBase::state_type s) const;
00148 void aux(typename Transform::value_type const & v, PacketParserBase::data_iterator i, PacketParserBase::state_type s) const;
00149 };
00150
00151 struct PacketSizeAuxParserPolicy
00152 {
00153 typedef PacketSizeAuxParserPolicy WrapperPolicy;
00154 typedef PacketSizeAuxParserPolicy ParserPolicy;
00155
00156 static PacketParserBase::size_type const aux_bytes = 0;
00157
00158 PacketParserBase::size_type aux(PacketParserBase::data_iterator i, PacketParserBase::state_type s) const;
00159 void aux(unsigned v, PacketParserBase::data_iterator i, PacketParserBase::state_type s) const;
00160 PacketParserBase::data_iterator adjust(PacketParserBase::data_iterator i, PacketParserBase::state_type s) const;
00161 };
00162 }}
00163
00164
00165 #endif
00166 #if !defined(HH_SENF_Packets_Packets__decls_) && !defined(HH_SENF_Packets_AuxParser_i_)
00167 #define HH_SENF_Packets_AuxParser_i_
00168 #include "AuxParser.cci"
00169
00170 #include "AuxParser.cti"
00171 #endif
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182