#ifndef _TCUSTRINGTEMPLATE_HPP #define _TCUSTRINGTEMPLATE_HPP /*------------------------------------------------------------------------- * drawElements Quality Program Tester Core * ---------------------------------------- * * Copyright 2014 The Android Open Source Project * Copyright (c) 2020 The Khronos Group Inc. * Copyright (c) 2020 Advanced Micro Devices, Inc. * * 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. * *//*! * \file * \brief String template class. *//*--------------------------------------------------------------------*/ #include #include #include namespace tcu { class StringTemplate { public: StringTemplate (void); StringTemplate (const std::string& str); StringTemplate (StringTemplate&& other); ~StringTemplate (void); void setString (const std::string& str); std::string specialize (const std::map& params) const; template std::string format (args_t&&... args) const; private: StringTemplate (const StringTemplate&); // not allowed! StringTemplate& operator= (const StringTemplate&); // not allowed! std::string m_template; } DE_WARN_UNUSED_TYPE; /*--------------------------------------------------------------------*//*! * Utility to unpack consecutive arguments into a parameter map *//*--------------------------------------------------------------------*/ namespace detail { static constexpr const char* TOKENS[] = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "55", "56", "57", "58", "59", "60", "61", "62", "63"}; template inline void unpackArgs(unpacked_t&) {} template inline void unpackArgs(unpacked_t& unpacked, arg_t&& cur, args_t&&... args) { static_assert(ARG_NUM < DE_LENGTH_OF_ARRAY(TOKENS), "ARG_NUM must be less than DE_LENGTH_OF_ARRAY(TOKENS)"); unpacked[TOKENS[ARG_NUM]] = de::toString(cur); unpackArgs(unpacked, ::std::forward(args)...); } } // detail /*--------------------------------------------------------------------*//*! * \brief Implementation of specialize() using a variable argument list *//*--------------------------------------------------------------------*/ template std::string StringTemplate::format(args_t&&... args) const { std::map unpacked = {}; detail::unpackArgs<0>(unpacked, ::std::forward(args)...); return specialize(unpacked); } } // tcu #endif // _TCUSTRINGTEMPLATE_HPP