587b054d38f6a1d66229fbca47dc10a5598c9947
[senf.git] / senf / Packets / VariantParser.ct
1 // $Id$
2 //
3 // Copyright (C) 2007
4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 //
6 // The contents of this file are subject to the Fraunhofer FOKUS Public License
7 // Version 1.0 (the "License"); you may not use this file except in compliance
8 // with the License. You may obtain a copy of the License at 
9 // http://senf.berlios.de/license.html
10 //
11 // The Fraunhofer FOKUS Public License Version 1.0 is based on, 
12 // but modifies the Mozilla Public License Version 1.1.
13 // See the full license text for the amendments.
14 //
15 // Software distributed under the License is distributed on an "AS IS" basis, 
16 // WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 
17 // for the specific language governing rights and limitations under the License.
18 //
19 // The Original Code is Fraunhofer FOKUS code.
20 //
21 // The Initial Developer of the Original Code is Fraunhofer-Gesellschaft e.V. 
22 // (registered association), Hansastraße 27 c, 80686 Munich, Germany.
23 // All Rights Reserved.
24 //
25 // Contributor(s):
26 //   Stefan Bund <g0dil@berlios.de>
27
28 /** \file
29     \brief VariantParser non-inline template implementation  */
30
31 #include "VariantParser.ih"
32
33 // Custom includes
34 #include <algorithm>
35
36 #define prefix_
37 //-/////////////////////////////////////////////////////////////////////////////////////////////////
38
39 template <class AuxPolicy, class Parsers>
40 template <unsigned N>
41 prefix_ void senf::VariantParser<AuxPolicy,Parsers>::init()
42 {
43     size_type oldSize( bytes() );
44     typedef typename boost::mpl::at<parsers, boost::mpl::int_<N> >::type NewParser;
45
46     if (oldSize < senf::init_bytes<NewParser>::value) {
47         data_iterator j (i());
48         std::advance(j, oldSize);
49         std::fill(i(), j, 0u);
50         safe_data_iterator safe_i (*this);
51         typename AuxPolicy::WrapperPolicy safeAux (static_cast<AuxPolicy&>(*this));
52         data().insert(j, senf::init_bytes<NewParser>::value - oldSize, 0u);
53         safeAux.aux(N, safe_i, state());
54         NewParser( safeAux.adjust(safe_i, state()), state() ).init();
55     } else {
56         data_iterator j (i());
57         std::advance(j, senf::init_bytes<NewParser>::value);
58         data().erase(j, boost::next(i(), oldSize));
59         std::fill(i(), j, 0u);
60         AuxPolicy::aux(N, i(), state());
61         NewParser(AuxPolicy::adjust(i(), state()), state()).init();
62     }
63 }
64
65 //-/////////////////////////////////////////////////////////////////////////////////////////////////
66 #undef prefix_
67
68 \f
69 // Local Variables:
70 // mode: c++
71 // fill-column: 100
72 // comment-column: 40
73 // c-file-style: "senf"
74 // indent-tabs-mode: nil
75 // ispell-local-dictionary: "american"
76 // compile-command: "scons -u test"
77 // End: