blob: 040f29c004ceebb70188739d969dc83cd043da06 [file] [log] [blame]
Austin Enga9e39e12021-06-01 18:49:12 +00001//* Copyright 2021 The Dawn Authors
2//*
3//* Licensed under the Apache License, Version 2.0 (the "License");
4//* you may not use this file except in compliance with the License.
5//* You may obtain a copy of the License at
6//*
7//* http://www.apache.org/licenses/LICENSE-2.0
8//*
9//* Unless required by applicable law or agreed to in writing, software
10//* distributed under the License is distributed on an "AS IS" BASIS,
11//* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12//* See the License for the specific language governing permissions and
13//* limitations under the License.
14
fujunweic7d4f2c2021-12-07 00:46:35 +000015{% set API = metadata.api.upper() %}
16{% set api = API.lower() %}
17#ifndef {{API}}_CPP_PRINT_H_
18#define {{API}}_CPP_PRINT_H_
Austin Enga9e39e12021-06-01 18:49:12 +000019
fujunweic7d4f2c2021-12-07 00:46:35 +000020#include "dawn/{{api}}_cpp.h"
Austin Enga9e39e12021-06-01 18:49:12 +000021
22#include <iomanip>
23#include <ios>
24#include <ostream>
25#include <type_traits>
26
fujunweic7d4f2c2021-12-07 00:46:35 +000027namespace {{metadata.namespace}} {
Austin Enga9e39e12021-06-01 18:49:12 +000028
29 {% for type in by_category["enum"] %}
30 template <typename CharT, typename Traits>
31 std::basic_ostream<CharT, Traits>& operator<<(std::basic_ostream<CharT, Traits>& o, {{as_cppType(type.name)}} value) {
32 switch (value) {
33 {% for value in type.values %}
34 case {{as_cppType(type.name)}}::{{as_cppEnum(value.name)}}:
35 o << "{{as_cppType(type.name)}}::{{as_cppEnum(value.name)}}";
36 break;
37 {% endfor %}
38 default:
39 o << "{{as_cppType(type.name)}}::" << std::showbase << std::hex << std::setfill('0') << std::setw(4) << static_cast<typename std::underlying_type<{{as_cppType(type.name)}}>::type>(value);
40 }
41 return o;
42 }
43 {% endfor %}
44
45 {% for type in by_category["bitmask"] %}
46 template <typename CharT, typename Traits>
47 std::basic_ostream<CharT, Traits>& operator<<(std::basic_ostream<CharT, Traits>& o, {{as_cppType(type.name)}} value) {
48 o << "{{as_cppType(type.name)}}::";
49 if (!static_cast<bool>(value)) {
50 {% for value in type.values if value.value == 0 %}
51 // 0 is often explicitly declared as None.
52 o << "{{as_cppEnum(value.name)}}";
53 {% else %}
54 o << std::showbase << std::hex << std::setfill('0') << std::setw(4) << 0;
55 {% endfor %}
56 return o;
57 }
58
59 bool moreThanOneBit = !HasZeroOrOneBits(value);
60 if (moreThanOneBit) {
61 o << "(";
62 }
63
64 bool first = true;
65 {% for value in type.values if value.value != 0 %}
66 if (value & {{as_cppType(type.name)}}::{{as_cppEnum(value.name)}}) {
67 if (!first) {
68 o << "|";
69 }
70 first = false;
71 o << "{{as_cppEnum(value.name)}}";
72 value &= ~{{as_cppType(type.name)}}::{{as_cppEnum(value.name)}};
73 }
74 {% endfor %}
75
76 if (static_cast<bool>(value)) {
77 if (!first) {
78 o << "|";
79 }
80 o << std::showbase << std::hex << std::setfill('0') << std::setw(4) << static_cast<typename std::underlying_type<{{as_cppType(type.name)}}>::type>(value);
81 }
82
83 if (moreThanOneBit) {
84 o << ")";
85 }
86 return o;
87 }
88 {% endfor %}
89
fujunweic7d4f2c2021-12-07 00:46:35 +000090} // namespace {{metadata.namespace}}
Austin Enga9e39e12021-06-01 18:49:12 +000091
fujunweic7d4f2c2021-12-07 00:46:35 +000092#endif // {{API}}_CPP_PRINT_H_