Socket: Add short docs to internal classes
[senf.git] / Packets / ParseArray.hh
1 // $Id$
2 //
3 // Copyright (C) 2006
4 // Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
5 // Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
6 //     Stefan Bund <stefan.bund@fokus.fraunhofer.de>
7 //
8 // This program is free software; you can redistribute it and/or modify
9 // it under the terms of the GNU General Public License as published by
10 // the Free Software Foundation; either version 2 of the License, or
11 // (at your option) any later version.
12 //
13 // This program is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 // GNU General Public License for more details.
17 //
18 // You should have received a copy of the GNU General Public License
19 // along with this program; if not, write to the
20 // Free Software Foundation, Inc.,
21 // 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22
23 #ifndef HH_ParseArray_
24 #define HH_ParseArray_ 1
25
26 /** \defgroup parsecollection Collection parsers
27
28     Collection parsers are parsers which build collections from other parsers. Examples are a vector
29     of 16bit unsigned integers or a list of lists of 32bit numbers and so on.
30
31     Collection parsers provide a (reduced) STL sequence like interface. It depends on the type of
32     collection parser, what kind of sequence is modelled (e.g. random access sequence, forward
33     sequence etc). Most collections will also provide a kind of container wrapper to allow extensive
34     manipulations of the collection contents. A container wrapper is initialized with the collection
35     parser and then provides a more complete sequence interface.
36
37     \important Parser lifetime has to be tightly checked when working with collection parsers since
38     \e every change of the collections size will invalidate \e all parsers and iterators referencing
39     the \e complete packet chain. Collection wrappers do \e not invalidate if the change is \e after
40     the collection.
41
42     \ingroup packetparser
43 */
44
45 // Custom includes
46 #include "PacketParser.hh"
47
48 //#include "ParseArray.mpp"
49 ///////////////////////////////hh.p////////////////////////////////////////
50
51 namespace senf {
52
53     namespace detail { template <class> class Parse_Array_iterator; }
54
55     /** \brief Fixed size collection of fixed size elements
56
57         Parse_Array will parse a sequence of <em>fixed size</em> parsers. The number of array
58         elements is given by the \e elements template parameter and is fixed at compile time. 
59         
60         Each element will be parsed by \a ElementParser, which can be any <em>fixed size</em>
61         parser. The array models an STL random-access sequence with the restriction that elements
62         cannot be added or removed since the size is fixed.
63
64         \ingroup parsecollection
65      */
66     template <unsigned elements, class ElementParser>
67     struct Parse_Array : public PacketParserBase
68     {
69         Parse_Array(data_iterator i, state_type s);
70
71         static size_type const fixed_bytes = elements*ElementParser::fixed_bytes;
72
73         void init() const;
74
75         ///////////////////////////////////////////////////////////////////////////
76         // Container interface
77
78         typedef ElementParser value_type;
79         typedef detail::Parse_Array_iterator<value_type> iterator;
80         typedef iterator const_iterator;
81
82         static size_type size();
83
84         iterator begin() const;
85         iterator end() const;
86
87         value_type operator[](difference_type i) const;
88     };
89
90 }
91
92 ///////////////////////////////hh.e////////////////////////////////////////
93 #endif
94 #if !defined(SENF_PACKETS_DECL_ONLY) && !defined(HH_ParseArray_i_)
95 #define HH_ParseArray_i_
96 //#include "ParseArray.cci"
97 //#include "ParseArray.ct"
98 #include "ParseArray.cti"
99 #endif
100
101 \f
102 // Local Variables:
103 // mode: c++
104 // fill-column: 100
105 // c-file-style: "senf"
106 // indent-tabs-mode: nil
107 // ispell-local-dictionary: "american"
108 // compile-command: "scons -u test"
109 // comment-column: 40
110 // End: