1 /*
2  * Copyright 2019 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #pragma once
18 
19 #include <iostream>
20 
21 #include "declarations.h"
22 #include "fields/packet_field.h"
23 #include "parse_location.h"
24 
25 class StructParserGenerator {
26  public:
27   explicit StructParserGenerator(const Declarations& declarations);
28 
29   void Generate(std::ostream& s) const;
30 
31  private:
32   class TreeNode {
33    public:
TreeNode(const StructDef * s)34     explicit TreeNode(const StructDef* s)
35         : struct_def_(s), packet_field_(s->GetNewField(s->name_ + "_parse", ParseLocation())) {}
36     const StructDef* struct_def_;
37     const PacketField* packet_field_;
38     std::list<const TreeNode*> children_;
39   };
40   std::list<TreeNode> variable_struct_fields_;
41   bool is_little_endian;
42 
43   void explore_children(const TreeNode& node, std::ostream& s) const;
44 };
45