00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00026 #include "VariantParser.ih"
00027
00028
00029 #include <algorithm>
00030
00031 #define prefix_
00032
00033
00034 template <class AuxPolicy, class Parsers>
00035 template <unsigned N>
00036 prefix_ void senf::VariantParser<AuxPolicy,Parsers>::init()
00037 {
00038 size_type oldSize( bytes() );
00039 typedef typename boost::mpl::at<parsers, boost::mpl::int_<N> >::type NewParser;
00040
00041 if (oldSize < senf::init_bytes<NewParser>::value) {
00042 data_iterator j (i());
00043 std::advance(j, oldSize);
00044 std::fill(i(), j, 0u);
00045 safe_data_iterator safe_i (*this);
00046 typename AuxPolicy::WrapperPolicy safeAux (static_cast<AuxPolicy&>(*this));
00047 data().insert(j, senf::init_bytes<NewParser>::value - oldSize, 0u);
00048 safeAux.aux(N, safe_i, state());
00049 NewParser( safeAux.adjust(safe_i, state()), state() ).init();
00050 } else {
00051 data_iterator j (i());
00052 std::advance(j, senf::init_bytes<NewParser>::value);
00053 data().erase(j, boost::next(i(), oldSize));
00054 std::fill(i(), j, 0u);
00055 AuxPolicy::aux(N, i(), state());
00056 NewParser(AuxPolicy::adjust(i(), state()), state()).init();
00057 }
00058 }
00059
00060
00061 #undef prefix_
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072