00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00026 #include "PacketParser.ih"
00027
00028
00029
00030 #define prefix_ inline
00031
00032
00033
00034
00035
00036 template <class Parser>
00037 prefix_ Parser senf::PacketParserBase::parse(data_iterator i)
00038 const
00039 {
00040 return Parser(i,state());
00041 }
00042
00043 template <class Parser, class Arg>
00044 prefix_ Parser senf::PacketParserBase::parse(Arg const & arg, data_iterator i)
00045 const
00046 {
00047 return Parser(arg, i, state());
00048 }
00049
00050 template <class Parser>
00051 prefix_ Parser senf::PacketParserBase::parse(size_type n)
00052 const
00053 {
00054 return Parser(boost::next(i(),n),state());
00055 }
00056
00057 template <class Parser, class Arg>
00058 prefix_ Parser senf::PacketParserBase::parse(Arg const & arg, size_type n)
00059 const
00060 {
00061 return Parser(arg, boost::next(i(),n), state());
00062 }
00063
00064
00065
00066
00067 template <class Parser>
00068 prefix_ senf::PacketParserBase::size_type senf::bytes(Parser p)
00069 {
00070 return detail::packetParserSize(p,0);
00071 }
00072
00073 #ifndef DOXYGEN
00074 template <class Parser, class Value>
00075 prefix_ typename boost::enable_if_c <
00076 boost::is_base_of<senf::PacketParserBase, Parser>::value
00077 && ! boost::is_base_of<senf::PacketParserBase, Value>::value,
00078 Parser >::type senf::operator<<(Parser target, Value const & value)
00079 {
00080 target.value(value);
00081 return target;
00082 }
00083 #else
00084 template <class Parser, class Value>
00085 prefix_ Parser senf::operator<<(Parser target, Value const & value)
00086 {}
00087 #endif
00088
00089 #ifndef DOXYGEN
00090 template <class Parser, class Value>
00091 prefix_ typename boost::enable_if_c <
00092 boost::is_base_of<senf::PacketParserBase, Parser>::value
00093 && ! boost::is_base_of<senf::PacketParserBase, Value>::value,
00094 Parser >::type senf::operator<<(Parser target, boost::optional<Value> const & value)
00095 {
00096 if (value)
00097 target.value(*value);
00098 return target;
00099 }
00100 #else
00101 template <class Parser, class Value>
00102 prefix_ Parser senf::operator<<(Parser target, Value const & value)
00103 {}
00104 #endif
00105
00106
00107 template <class Parser>
00108 prefix_ senf::PacketParserBase::size_type
00109 senf::detail::packetParserSize(Parser p, int, senf::mpl::take_uint<Parser::init_bytes> *)
00110 {
00111 return p.bytes();
00112 }
00113
00114
00115
00116
00117
00118 template <class Parser, typename ValueType, senf::PacketParserBase::size_type FixedBytes>
00119 prefix_ senf::ValueParserBase<Parser, ValueType, FixedBytes>::ValueParserBase(data_iterator i, state_type s)
00120 : PacketParserBase(i, s, FixedBytes)
00121 { }
00122
00123 template <class Parser, typename ValueType, senf::PacketParserBase::size_type FixedBytes>
00124 prefix_ senf::ValueParserBase<Parser, ValueType, FixedBytes>::operator value_type ()
00125 const
00126 {
00127 return static_cast<Parser const *>(this)->value();
00128 }
00129
00130 template <class Parser, typename ValueType, senf::PacketParserBase::size_type FixedBytes>
00131 prefix_ senf::PacketParserBase::byte &
00132 senf::ValueParserBase<Parser, ValueType, FixedBytes>::operator[](size_type index)
00133 {
00134 return *boost::next(i(), index);
00135 }
00136
00137 template <class Parser, typename ValueType, senf::PacketParserBase::size_type FixedBytes>
00138 prefix_ Parser const & senf::ValueParserBase<Parser, ValueType, FixedBytes>::operator= (value_type const & other)
00139 {
00140 static_cast<Parser*>(this)->value(other);
00141 return *static_cast<Parser const *>(this);
00142 }
00143
00144
00145 #undef prefix_
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156