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_
00031
00032
00033 #ifndef DOXYGEN
00034 template <class Parser>
00035 prefix_ typename boost::enable_if<
00036 boost::is_base_of<senf::PacketParserBase, Parser>,
00037 Parser >::type senf::operator<<(Parser target, Parser source)
00038 {
00039 PacketParserBase::size_type target_sz (bytes(target));
00040 PacketParserBase::size_type source_sz (bytes(source));
00041 SafePacketParserWrapper<Parser> safe_target (target);
00042 if (target_sz > source_sz)
00043 target.data().erase(boost::next(target.i(),source_sz),boost::next(target.i(),target_sz));
00044 else if (target_sz < source_sz)
00045 target.data().insert(boost::next(target.i(),target_sz),source_sz-target_sz,0u);
00046 Parser new_target (*safe_target);
00047 std::copy( source.i(), boost::next(source.i(),source_sz),
00048 PacketParserBase::data_iterator(new_target.i()) );
00049 return new_target;
00050 }
00051 #else
00052 template <class Parser>
00053 prefix_ Parser senf::operator<<(Parser target, Parser source)
00054 {}
00055 #endif
00056
00057
00058
00059 template <class Parser>
00060 prefix_ senf::PacketParserBase::size_type senf::detail::packetParserSize(Parser p, ...)
00061 {
00062 return Parser::fixed_bytes;
00063 }
00064
00065
00066 #undef prefix_
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077