Merge pull request #21 from mtavenrath/getString

Add getString(VkEnum)/getString(VKFlags) support
This commit is contained in:
Markus Tavenrath 2016-02-18 13:57:36 +01:00
commit ce702938a8
3 changed files with 1657 additions and 0 deletions

View File

@ -109,6 +109,12 @@ vk::ImageCreateInfo ci(
</code> </code>
</pre> </pre>
# String conversions
At development time it can be quite handy to have a utility function that can convert an enum or flags to a string for debugging purposes. To achieve this,
we have implemented <code>getString(type)</code> functions for all enums and flags. Calling <code>getString(vk::SharingMode::eExclusive)</code> will return 'Exclusive' and calling
<code>getString(vk::QueueFlagBits::eGraphics | vk::QueueFlagBits::eCompute)</code> will return the concatenated string 'Graphics | Compute'.
# Alternative Initialization of Structs # Alternative Initialization of Structs
Another nice feature of those constructors is that sType is being initialized internally and thus is always correct. Another nice feature of those constructors is that sType is being initialized internally and thus is always correct.

View File

@ -1655,6 +1655,55 @@ void writeTypeEnum( std::ofstream & ofs, DependencyData const& dependencyData, E
<< std::endl; << std::endl;
} }
void writeEnumToString(std::ofstream & ofs, DependencyData const& dependencyData, EnumData const& enumData)
{
ofs << " static const char * getString(" << dependencyData.name << " value)" << std::endl
<< " {" << std::endl
<< " switch (value)" << std::endl
<< " {" << std::endl;
for (auto itMember = enumData.members.begin(); itMember != enumData.members.end(); ++itMember)
{
ofs << " case " << dependencyData.name << "::" << itMember->name << ": return \"" << itMember->name.substr(1) << "\";" << std::endl;
}
ofs << " default: return \"unknown\";" << std::endl
<< " }" << std::endl
<< " }" << std::endl
<< std::endl;
}
void writeFlagsTostring(std::ofstream & ofs, DependencyData const& dependencyData, EnumData const &enumData)
{
std::string enumPrefix = "vk::" + *dependencyData.dependencies.begin() + "::";
ofs << " static std::string getString(" << dependencyData.name << " value)" << std::endl
<< " {" << std::endl
<< " if (!value) return std::string();" << std::endl
<< " std::string result;" << std::endl;
for (auto itMember = enumData.members.begin(); itMember != enumData.members.end(); ++itMember)
{
ofs << " if (value & " << enumPrefix + itMember->name << ") result += \"" << itMember->name.substr(1) << " | \";" << std::endl;
}
ofs << " return result.substr(0, result.size() - 3);" << std::endl
<< " }" << std::endl;
}
void writeEnumsToString(std::ofstream & ofs, std::vector<DependencyData> const& dependencyData, std::map<std::string, EnumData> const& enums)
{
for (auto it = dependencyData.begin(); it != dependencyData.end(); ++it)
{
switch (it->category)
{
case DependencyData::Category::ENUM:
assert(enums.find(it->name) != enums.end());
writeEnumToString(ofs, *it, enums.find(it->name)->second);
break;
case DependencyData::Category::FLAGS:
writeFlagsTostring(ofs, *it, enums.find(*it->dependencies.begin())->second);
break;
}
}
}
void writeTypeFlags( std::ofstream & ofs, DependencyData const& dependencyData ) void writeTypeFlags( std::ofstream & ofs, DependencyData const& dependencyData )
{ {
assert( dependencyData.dependencies.size() == 1 ); assert( dependencyData.dependencies.size() == 1 );
@ -1936,5 +1985,10 @@ int main( int argc, char **argv )
} }
} }
for (size_t i = 0; i < sortedDependencies.size(); i++)
{
writeEnumsToString(ofs, sortedDependencies[i], enums);
}
ofs << "}" << std::endl; ofs << "}" << std::endl;
} }

File diff suppressed because it is too large Load Diff