// Copyright 2019 The SwiftShader Authors. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef VK_DEBUG_VALUE_HPP_ #define VK_DEBUG_VALUE_HPP_ #include "TypeOf.hpp" #include "System/Debug.hpp" #include #include namespace vk { namespace dbg { class Variables; class VariableContainer; // FormatFlags holds settings used to serialize a Value to a string. struct FormatFlags { // The default FormatFlags used to serialize a Value to a string. static const FormatFlags Default; std::string listPrefix; // Prefix to lists. std::string listSuffix; // Suffix to lists. std::string listDelimiter; // List item delimiter. std::string listIndent; // List item indententation prefix. const FormatFlags *subListFmt; // Format used for list sub items. }; // Value holds a value that can be read. class Value { public: virtual ~Value() = default; // type() returns the typename for the value. virtual std::string type() = 0; // get() returns a string representation of the value using the specified // FormatFlags. virtual std::string get(const FormatFlags & = FormatFlags::Default) = 0; // children() returns the optional child members of this value. virtual std::shared_ptr children() { return nullptr; } }; // Constant is constant value of type T. template class Constant : public Value { public: Constant(const T &val) : val(val) {} std::string type() override { return TypeOf::name; } std::string get(const FormatFlags &fmt = FormatFlags::Default) override { return std::to_string(val); } private: T const val; }; // Reference is reference to a value in memory. template class Reference : public Value { public: Reference(const T &ref) : ref(ref) {} std::string type() override { return TypeOf::name; } std::string get(const FormatFlags &fmt = FormatFlags::Default) override { return std::to_string(ref); } private: T const &ref; }; // Struct is an implementation of Value that delegates calls to children() on to // the constructor provided Variables. class Struct : public Value { public: Struct(const std::string &type, const std::shared_ptr &members) : ty(type) , members(members) { ASSERT(members); } std::string type() override { return ty; } std::string get(const FormatFlags &fmt = FormatFlags::Default) override; std::shared_ptr children() override { return members; } // create() constructs and returns a new Struct with the given type name and // calls fields to populate the child members. // fields must be a function that has the signature: // void(std::shared_pointer&) template static std::shared_ptr create(const std::string &name, F &&fields) { auto vc = std::make_shared(); fields(vc); return std::make_shared(name, vc); } private: std::string const ty; std::shared_ptr const members; }; // make_constant() returns a shared_ptr to a Constant with the given value. template inline std::shared_ptr> make_constant(const T &value) { return std::make_shared>(value); } // make_reference() returns a shared_ptr to a Reference with the given value. template inline std::shared_ptr> make_reference(const T &value) { return std::make_shared>(value); } } // namespace dbg } // namespace vk #endif // VK_DEBUG_VALUE_HPP_