1*03ce13f7SAndroid Build Coastguard Worker // Copyright 2019 The SwiftShader Authors. All Rights Reserved.
2*03ce13f7SAndroid Build Coastguard Worker //
3*03ce13f7SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*03ce13f7SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*03ce13f7SAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*03ce13f7SAndroid Build Coastguard Worker //
7*03ce13f7SAndroid Build Coastguard Worker // http://www.apache.org/licenses/LICENSE-2.0
8*03ce13f7SAndroid Build Coastguard Worker //
9*03ce13f7SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*03ce13f7SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*03ce13f7SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*03ce13f7SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*03ce13f7SAndroid Build Coastguard Worker // limitations under the License.
14*03ce13f7SAndroid Build Coastguard Worker
15*03ce13f7SAndroid Build Coastguard Worker #ifndef VK_DEBUG_VALUE_HPP_
16*03ce13f7SAndroid Build Coastguard Worker #define VK_DEBUG_VALUE_HPP_
17*03ce13f7SAndroid Build Coastguard Worker
18*03ce13f7SAndroid Build Coastguard Worker #include "TypeOf.hpp"
19*03ce13f7SAndroid Build Coastguard Worker
20*03ce13f7SAndroid Build Coastguard Worker #include "System/Debug.hpp"
21*03ce13f7SAndroid Build Coastguard Worker
22*03ce13f7SAndroid Build Coastguard Worker #include <memory>
23*03ce13f7SAndroid Build Coastguard Worker #include <string>
24*03ce13f7SAndroid Build Coastguard Worker
25*03ce13f7SAndroid Build Coastguard Worker namespace vk {
26*03ce13f7SAndroid Build Coastguard Worker namespace dbg {
27*03ce13f7SAndroid Build Coastguard Worker
28*03ce13f7SAndroid Build Coastguard Worker class Variables;
29*03ce13f7SAndroid Build Coastguard Worker class VariableContainer;
30*03ce13f7SAndroid Build Coastguard Worker
31*03ce13f7SAndroid Build Coastguard Worker // FormatFlags holds settings used to serialize a Value to a string.
32*03ce13f7SAndroid Build Coastguard Worker struct FormatFlags
33*03ce13f7SAndroid Build Coastguard Worker {
34*03ce13f7SAndroid Build Coastguard Worker // The default FormatFlags used to serialize a Value to a string.
35*03ce13f7SAndroid Build Coastguard Worker static const FormatFlags Default;
36*03ce13f7SAndroid Build Coastguard Worker
37*03ce13f7SAndroid Build Coastguard Worker std::string listPrefix; // Prefix to lists.
38*03ce13f7SAndroid Build Coastguard Worker std::string listSuffix; // Suffix to lists.
39*03ce13f7SAndroid Build Coastguard Worker std::string listDelimiter; // List item delimiter.
40*03ce13f7SAndroid Build Coastguard Worker std::string listIndent; // List item indententation prefix.
41*03ce13f7SAndroid Build Coastguard Worker const FormatFlags *subListFmt; // Format used for list sub items.
42*03ce13f7SAndroid Build Coastguard Worker };
43*03ce13f7SAndroid Build Coastguard Worker
44*03ce13f7SAndroid Build Coastguard Worker // Value holds a value that can be read.
45*03ce13f7SAndroid Build Coastguard Worker class Value
46*03ce13f7SAndroid Build Coastguard Worker {
47*03ce13f7SAndroid Build Coastguard Worker public:
48*03ce13f7SAndroid Build Coastguard Worker virtual ~Value() = default;
49*03ce13f7SAndroid Build Coastguard Worker
50*03ce13f7SAndroid Build Coastguard Worker // type() returns the typename for the value.
51*03ce13f7SAndroid Build Coastguard Worker virtual std::string type() = 0;
52*03ce13f7SAndroid Build Coastguard Worker
53*03ce13f7SAndroid Build Coastguard Worker // get() returns a string representation of the value using the specified
54*03ce13f7SAndroid Build Coastguard Worker // FormatFlags.
55*03ce13f7SAndroid Build Coastguard Worker virtual std::string get(const FormatFlags & = FormatFlags::Default) = 0;
56*03ce13f7SAndroid Build Coastguard Worker
57*03ce13f7SAndroid Build Coastguard Worker // children() returns the optional child members of this value.
children()58*03ce13f7SAndroid Build Coastguard Worker virtual std::shared_ptr<Variables> children() { return nullptr; }
59*03ce13f7SAndroid Build Coastguard Worker };
60*03ce13f7SAndroid Build Coastguard Worker
61*03ce13f7SAndroid Build Coastguard Worker // Constant is constant value of type T.
62*03ce13f7SAndroid Build Coastguard Worker template<typename T>
63*03ce13f7SAndroid Build Coastguard Worker class Constant : public Value
64*03ce13f7SAndroid Build Coastguard Worker {
65*03ce13f7SAndroid Build Coastguard Worker public:
Constant(const T & val)66*03ce13f7SAndroid Build Coastguard Worker Constant(const T &val)
67*03ce13f7SAndroid Build Coastguard Worker : val(val)
68*03ce13f7SAndroid Build Coastguard Worker {}
type()69*03ce13f7SAndroid Build Coastguard Worker std::string type() override { return TypeOf<T>::name; }
get(const FormatFlags & fmt=FormatFlags::Default)70*03ce13f7SAndroid Build Coastguard Worker std::string get(const FormatFlags &fmt = FormatFlags::Default) override { return std::to_string(val); }
71*03ce13f7SAndroid Build Coastguard Worker
72*03ce13f7SAndroid Build Coastguard Worker private:
73*03ce13f7SAndroid Build Coastguard Worker T const val;
74*03ce13f7SAndroid Build Coastguard Worker };
75*03ce13f7SAndroid Build Coastguard Worker
76*03ce13f7SAndroid Build Coastguard Worker // Reference is reference to a value in memory.
77*03ce13f7SAndroid Build Coastguard Worker template<typename T>
78*03ce13f7SAndroid Build Coastguard Worker class Reference : public Value
79*03ce13f7SAndroid Build Coastguard Worker {
80*03ce13f7SAndroid Build Coastguard Worker public:
Reference(const T & ref)81*03ce13f7SAndroid Build Coastguard Worker Reference(const T &ref)
82*03ce13f7SAndroid Build Coastguard Worker : ref(ref)
83*03ce13f7SAndroid Build Coastguard Worker {}
type()84*03ce13f7SAndroid Build Coastguard Worker std::string type() override { return TypeOf<T>::name; }
get(const FormatFlags & fmt=FormatFlags::Default)85*03ce13f7SAndroid Build Coastguard Worker std::string get(const FormatFlags &fmt = FormatFlags::Default) override { return std::to_string(ref); }
86*03ce13f7SAndroid Build Coastguard Worker
87*03ce13f7SAndroid Build Coastguard Worker private:
88*03ce13f7SAndroid Build Coastguard Worker const T &ref;
89*03ce13f7SAndroid Build Coastguard Worker };
90*03ce13f7SAndroid Build Coastguard Worker
91*03ce13f7SAndroid Build Coastguard Worker // Struct is an implementation of Value that delegates calls to children() on to
92*03ce13f7SAndroid Build Coastguard Worker // the constructor provided Variables.
93*03ce13f7SAndroid Build Coastguard Worker class Struct : public Value
94*03ce13f7SAndroid Build Coastguard Worker {
95*03ce13f7SAndroid Build Coastguard Worker public:
Struct(const std::string & type,const std::shared_ptr<Variables> & members)96*03ce13f7SAndroid Build Coastguard Worker Struct(const std::string &type, const std::shared_ptr<Variables> &members)
97*03ce13f7SAndroid Build Coastguard Worker : ty(type)
98*03ce13f7SAndroid Build Coastguard Worker , members(members)
99*03ce13f7SAndroid Build Coastguard Worker {
100*03ce13f7SAndroid Build Coastguard Worker ASSERT(members);
101*03ce13f7SAndroid Build Coastguard Worker }
102*03ce13f7SAndroid Build Coastguard Worker
type()103*03ce13f7SAndroid Build Coastguard Worker std::string type() override { return ty; }
104*03ce13f7SAndroid Build Coastguard Worker std::string get(const FormatFlags &fmt = FormatFlags::Default) override;
children()105*03ce13f7SAndroid Build Coastguard Worker std::shared_ptr<Variables> children() override { return members; }
106*03ce13f7SAndroid Build Coastguard Worker
107*03ce13f7SAndroid Build Coastguard Worker // create() constructs and returns a new Struct with the given type name and
108*03ce13f7SAndroid Build Coastguard Worker // calls fields to populate the child members.
109*03ce13f7SAndroid Build Coastguard Worker // fields must be a function that has the signature:
110*03ce13f7SAndroid Build Coastguard Worker // void(std::shared_pointer<VariableContainer>&)
111*03ce13f7SAndroid Build Coastguard Worker template<typename F>
create(const std::string & name,F && fields)112*03ce13f7SAndroid Build Coastguard Worker static std::shared_ptr<Struct> create(const std::string &name, F &&fields)
113*03ce13f7SAndroid Build Coastguard Worker {
114*03ce13f7SAndroid Build Coastguard Worker auto vc = std::make_shared<VariableContainer>();
115*03ce13f7SAndroid Build Coastguard Worker fields(vc);
116*03ce13f7SAndroid Build Coastguard Worker return std::make_shared<Struct>(name, vc);
117*03ce13f7SAndroid Build Coastguard Worker }
118*03ce13f7SAndroid Build Coastguard Worker
119*03ce13f7SAndroid Build Coastguard Worker private:
120*03ce13f7SAndroid Build Coastguard Worker std::string const ty;
121*03ce13f7SAndroid Build Coastguard Worker std::shared_ptr<Variables> const members;
122*03ce13f7SAndroid Build Coastguard Worker };
123*03ce13f7SAndroid Build Coastguard Worker
124*03ce13f7SAndroid Build Coastguard Worker // make_constant() returns a shared_ptr to a Constant with the given value.
125*03ce13f7SAndroid Build Coastguard Worker template<typename T>
make_constant(const T & value)126*03ce13f7SAndroid Build Coastguard Worker inline std::shared_ptr<Constant<T>> make_constant(const T &value)
127*03ce13f7SAndroid Build Coastguard Worker {
128*03ce13f7SAndroid Build Coastguard Worker return std::make_shared<Constant<T>>(value);
129*03ce13f7SAndroid Build Coastguard Worker }
130*03ce13f7SAndroid Build Coastguard Worker
131*03ce13f7SAndroid Build Coastguard Worker // make_reference() returns a shared_ptr to a Reference with the given value.
132*03ce13f7SAndroid Build Coastguard Worker template<typename T>
make_reference(const T & value)133*03ce13f7SAndroid Build Coastguard Worker inline std::shared_ptr<Reference<T>> make_reference(const T &value)
134*03ce13f7SAndroid Build Coastguard Worker {
135*03ce13f7SAndroid Build Coastguard Worker return std::make_shared<Reference<T>>(value);
136*03ce13f7SAndroid Build Coastguard Worker }
137*03ce13f7SAndroid Build Coastguard Worker
138*03ce13f7SAndroid Build Coastguard Worker } // namespace dbg
139*03ce13f7SAndroid Build Coastguard Worker } // namespace vk
140*03ce13f7SAndroid Build Coastguard Worker
141*03ce13f7SAndroid Build Coastguard Worker #endif // VK_DEBUG_VALUE_HPP_
142