1 /*-------------------------------------------------------------------------
2 * drawElements Quality Program Tester Core
3 * ----------------------------------------
5 * Copyright 2014 The Android Open Source Project
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
21 * \brief String template class.
22 *//*--------------------------------------------------------------------*/
24 #include "tcuStringTemplate.hpp"
25 #include "tcuDefs.hpp"
31 using std::ostringstream;
36 StringTemplate::StringTemplate (void)
40 StringTemplate::StringTemplate (const std::string& str)
45 StringTemplate::~StringTemplate (void)
49 void StringTemplate::setString (const std::string& str)
54 string StringTemplate::specialize (const map<string, string>& params) const
61 size_t paramNdx = m_template.find("${", curNdx);
62 if (paramNdx != string::npos)
64 // Append in-between stuff.
65 res << m_template.substr(curNdx, paramNdx - curNdx);
68 size_t paramEndNdx = m_template.find("}", paramNdx);
69 if (paramEndNdx == string::npos)
70 TCU_THROW(InternalError, "No '}' found in template parameter");
72 // Parse parameter contents.
73 string paramStr = m_template.substr(paramNdx+2, paramEndNdx-2-paramNdx);
74 bool paramSingleLine = false;
75 bool paramOptional = false;
77 size_t colonNdx = paramStr.find(":");
78 if (colonNdx != string::npos)
80 paramName = paramStr.substr(0, colonNdx);
81 string flagsStr = paramStr.substr(colonNdx+1);
82 if (flagsStr == "single-line")
84 paramSingleLine = true;
86 else if (flagsStr == "opt")
92 TCU_THROW(InternalError, (string("Unrecognized flag") + paramStr).c_str());
98 // Fill in parameter value.
99 if (params.find(paramName) != params.end())
101 const string& val = (*params.find(paramName)).second;
105 for (size_t ndx = tmp.find("\n"); ndx != string::npos; ndx = tmp.find("\n"))
106 tmp = tmp.replace(ndx, 1, " ");
112 else if (!paramOptional)
113 TCU_THROW(InternalError, (string("Value for parameter '") + paramName + "' not found in map").c_str());
115 // Skip over template.
116 curNdx = paramEndNdx + 1;
120 if (curNdx < m_template.length())
121 res << &m_template[curNdx];