1# Copyright 2017 The Chromium Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5"""A template for generating hash decoding code."""
6
7import codegen
8
9HEADER = codegen.Template(
10basename="ukm_decode.h",
11file_template="""
12// Generated from gen_builders.py.  DO NOT EDIT!
13// source: ukm.xml
14
15#ifndef {file.guard_path}
16#define {file.guard_path}
17
18#include <cstdint>
19#include <map>
20
21namespace ukm {{
22namespace builders {{
23
24typedef std::map<uint64_t, const char*> MetricDecodeMap;
25struct EntryDecoder {{
26  const char* name;
27  const MetricDecodeMap metric_map;
28}};
29typedef std::map<uint64_t, EntryDecoder> DecodeMap;
30DecodeMap CreateDecodeMap();
31
32}}  // namespace builders
33}}  // namespace ukm
34
35#endif  // {file.guard_path}
36""",
37event_template="",
38metric_template="")
39
40IMPL = codegen.Template(
41basename="ukm_decode.cc",
42file_template="""
43// Generated from gen_builders.py.  DO NOT EDIT!
44// source: ukm.xml
45
46#include "{file.dir_path}/ukm_decode.h"
47#include "{file.dir_path}/ukm_builders.h"
48
49namespace ukm {{
50namespace builders {{
51
52std::map<uint64_t, EntryDecoder> CreateDecodeMap() {{
53  return {{
54    {event_code}
55  }};
56}}
57
58}}  // namespace builders
59}}  // namespace ukm
60""",
61event_template="""
62    {{
63      UINT64_C({event.hash}),
64      {{
65        {event.name}::kEntryName,
66        {{
67          {metric_code}
68        }}
69      }}
70    }},
71""",
72metric_template="""
73    {{{event.name}::k{metric.name}NameHash, {event.name}::k{metric.name}Name}},
74""")
75
76
77def WriteFiles(outdir, relpath, data):
78  HEADER.WriteFile(outdir, relpath, data)
79  IMPL.WriteFile(outdir, relpath, data)
80