Browse Source

video_core/shader/ast: Make Indent() return a string_view

The returned string is simply a substring of our constexpr tabs
string_view, so we can just use a string_view here as well, since the
original string_view is guaranteed to always exist.

Now the function is fully non-allocating.
nce_cpp
Lioncash 6 years ago
parent
commit
c5c0af5aa7
  1. 38
      src/video_core/shader/ast.cpp

38
src/video_core/shader/ast.cpp

@ -3,6 +3,7 @@
// Refer to the license.txt file included. // Refer to the license.txt file included.
#include <string> #include <string>
#include <string_view>
#include <fmt/format.h> #include <fmt/format.h>
@ -263,7 +264,9 @@ public:
} }
void operator()(const ASTIfElse& ast) { void operator()(const ASTIfElse& ast) {
inner += Indent() + "else {\n";
inner += Indent();
inner += "else {\n";
scope++; scope++;
ASTNode current = ast.nodes.GetFirst(); ASTNode current = ast.nodes.GetFirst();
while (current) { while (current) {
@ -271,15 +274,18 @@ public:
current = current->GetNext(); current = current->GetNext();
} }
scope--; scope--;
inner += Indent() + "}\n";
inner += Indent();
inner += "}\n";
} }
void operator()(const ASTBlockEncoded& ast) { void operator()(const ASTBlockEncoded& ast) {
inner += fmt::format("{}Block({}, {});\n", Indent(), ast.start, ast.end); inner += fmt::format("{}Block({}, {});\n", Indent(), ast.start, ast.end);
} }
void operator()(const ASTBlockDecoded& ast) {
inner += Indent() + "Block;\n";
void operator()([[maybe_unused]] const ASTBlockDecoded& ast) {
inner += Indent();
inner += "Block;\n";
} }
void operator()(const ASTVarSet& ast) { void operator()(const ASTVarSet& ast) {
@ -335,22 +341,26 @@ public:
} }
private: private:
std::string& Indent() {
if (memo_scope == scope) {
return tabs_memo;
std::string_view Indent() {
if (space_segment_scope == scope) {
return space_segment;
} }
tabs_memo = tabs.substr(0, scope * 2);
memo_scope = scope;
return tabs_memo;
// Ensure that we don't exceed our view.
ASSERT(scope * 2 < spaces.size());
space_segment = spaces.substr(0, scope * 2);
space_segment_scope = scope;
return space_segment;
} }
std::string inner{}; std::string inner{};
u32 scope{};
std::string_view space_segment;
std::string tabs_memo{};
u32 memo_scope{};
u32 scope{};
u32 space_segment_scope{};
static constexpr std::string_view tabs{" "};
static constexpr std::string_view spaces{" "};
}; };
std::string ASTManager::Print() { std::string ASTManager::Print() {

Loading…
Cancel
Save