// Copyright Advanced Micro Devices, Inc., or its affiliates. // SPDX-License-Identifier: MIT #pragma once #include #ifdef ROCROLLER_USE_LLVM #include #include #endif #ifdef ROCROLLER_USE_YAML_CPP #include #endif namespace rocRoller { namespace Serialization { template std::string toYAML(T obj) { std::string rv; #ifdef ROCROLLER_USE_LLVM llvm::raw_string_ostream sout(rv); // Don't hard-wrap until we get to 5000 lines. llvm::yaml::Output yout(sout, nullptr, 5000); yout << obj; #elif ROCROLLER_USE_YAML_CPP YAML::Emitter emitter; Serialization::EmitterOutput yout(&emitter); yout.outputDoc(obj); rv = emitter.c_str(); #endif return rv; } template T fromYAML(std::string const& yaml) { T rv; #ifdef ROCROLLER_USE_LLVM llvm::yaml::Input yin(yaml); yin >> rv; #elif ROCROLLER_USE_YAML_CPP auto node = YAML::Load(yaml); Serialization::NodeInput nodeInput(&node, nullptr); nodeInput.input(node, rv); #endif return rv; } template void writeYAML(std::ostream& stream, T obj) { #ifdef ROCROLLER_USE_LLVM llvm::raw_os_ostream ostr(stream); llvm::yaml::Output yout(ostr); yout << obj; #elif ROCROLLER_USE_YAML_CPP YAML::Emitter emitter(stream); Serialization::EmitterOutput yout(&emitter); yout.outputDoc(obj); #endif } template T readYAMLFile(std::string const& filename) { T rv; #ifdef ROCROLLER_USE_LLVM auto reader = llvm::MemoryBuffer::getFile(filename); if(!reader || !*reader) { Throw("Can not read YAML file!", ShowValue(filename)); } llvm::yaml::Input yin(**reader); yin >> rv; #elif ROCROLLER_USE_YAML_CPP auto node = YAML::LoadFile(filename); Serialization::NodeInput nodeInput(&node, nullptr); nodeInput.input(node, rv); #endif return rv; } } }