// MIT License // // Copyright (c) 2022-2025 Advanced Micro Devices, Inc. All Rights Reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #pragma once #include #include #include #include #include #include #include #include #if !defined(ROCPROFSYS_FOLD_EXPRESSION) # define ROCPROFSYS_FOLD_EXPRESSION(...) ((__VA_ARGS__), ...) #endif namespace rocprofsys { inline namespace common { namespace { template struct is_string_impl : std::false_type {}; template <> struct is_string_impl : std::true_type {}; template <> struct is_string_impl : std::true_type {}; template <> struct is_string_impl : std::true_type {}; template <> struct is_string_impl : std::true_type {}; template struct is_string : is_string_impl>> {}; template auto as_string(ArgT&& _v, std::enable_if_t::value, int> = 0) { if constexpr(std::is_pointer>::value) { return (_v == nullptr) ? std::string{ "\"\"" } : (std::string{ "\"" } + _v + std::string{ "\"" }); } else { return std::string{ "\"" } + _v + std::string{ "\"" }; } } template auto as_string(ArgT&& _v, std::enable_if_t::value, long> = 0) { return _v; } template auto join(DelimT&& _delim, Args&&... _args) { using delim_type = std::remove_cv_t>; std::stringstream _ss{}; _ss << std::boolalpha; if constexpr(std::is_same::value) { const char _delim_c[2] = { _delim, '\0' }; ROCPROFSYS_FOLD_EXPRESSION(_ss << _delim_c << _args); auto _ret = _ss.str(); return (_ret.length() > 1) ? _ret.substr(1) : std::string{}; } else { ROCPROFSYS_FOLD_EXPRESSION(_ss << _delim << _args); auto _ret = _ss.str(); auto&& _len = std::string{ _delim }.length(); return (_ret.length() > _len) ? _ret.substr(_len) : std::string{}; } } struct QuoteStrings {}; template auto join(QuoteStrings&&, DelimT&& _delim, Args&&... _args) { using delim_type = std::remove_cv_t>; std::stringstream _ss{}; _ss << std::boolalpha; if constexpr(std::is_same::value) { const char _delim_c[2] = { _delim, '\0' }; ROCPROFSYS_FOLD_EXPRESSION(_ss << _delim_c << as_string(_args)); auto _ret = _ss.str(); return (_ret.length() > 1) ? _ret.substr(1) : std::string{}; } else { ROCPROFSYS_FOLD_EXPRESSION(_ss << _delim << as_string(_args)); auto _ret = _ss.str(); auto&& _len = std::string{ _delim }.length(); return (_ret.length() > _len) ? _ret.substr(_len) : std::string{}; } } template auto join(std::array&& _delim, Args&&... _args) { return join("", std::get<0>(_delim), join(std::get<1>(_delim), std::forward(_args)...), std::get<2>(_delim)); } template auto join(QuoteStrings&&, std::array&& _delim, Args&&... _args) { return join(QuoteStrings{}, "", std::get<0>(_delim), join(std::get<1>(_delim), std::forward(_args)...), std::get<2>(_delim)); } template auto join(std::tuple&& _delim, Args&&... _args) { return join("", std::get<0>(_delim), join(std::get<1>(_delim), std::forward(_args)...), std::get<2>(_delim)); } template auto join(QuoteStrings&&, std::tuple&& _delim, Args&&... _args) { return join(QuoteStrings{}, "", std::get<0>(_delim), join(std::get<1>(_delim), std::forward(_args)...), std::get<2>(_delim)); } } // namespace } // namespace common } // namespace rocprofsys