| #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 <deStringUtil.hpp> |
| |
| #include <map> |
| #include <string> |
| |
| 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<std::string, std::string>& params) const; |
| |
| template <typename... args_t> |
| 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 <size_t ARG_NUM, typename unpacked_t> |
| inline void unpackArgs(unpacked_t&) {} |
| |
| template <size_t ARG_NUM, typename unpacked_t, typename arg_t, typename... args_t> |
| 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<ARG_NUM + 1>(unpacked, ::std::forward<args_t>(args)...); |
| } |
| } // detail |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief Implementation of specialize() using a variable argument list |
| *//*--------------------------------------------------------------------*/ |
| template <typename... args_t> |
| std::string StringTemplate::format(args_t&&... args) const |
| { |
| std::map<std::string, std::string> unpacked = {}; |
| detail::unpackArgs<0>(unpacked, ::std::forward<args_t>(args)...); |
| return specialize(unpacked); |
| } |
| |
| } // tcu |
| |
| #endif // _TCUSTRINGTEMPLATE_HPP |