MCPcopy Create free account
hub / github.com/IBAMR/IBAMR / ParseCmdCodeBulk

Method ParseCmdCodeBulk

ibtk/contrib/muparser/src/muParserBase.cpp:1109–1281  ·  view source on GitHub ↗

--------------------------------------------------------------------------- \brief Evaluate the RPN. \param nOffset The offset added to variable addresses (for bulk mode) \param nThreadID OpenMP Thread id of the calling thread */

Source from the content-addressed store, hash-verified

1107 \param nThreadID OpenMP Thread id of the calling thread
1108 */
1109 value_type ParserBase::ParseCmdCodeBulk(int nOffset, int nThreadID) const
1110 {
1111 assert(nThreadID <= s_MaxNumOpenMPThreads);
1112
1113 // Note: The check for nOffset==0 and nThreadID here is not necessary but
1114 // brings a minor performance gain when not in bulk mode.
1115 value_type *stack = ((nOffset == 0) && (nThreadID == 0)) ? &m_vStackBuffer[0] : &m_vStackBuffer[nThreadID * (m_vStackBuffer.size() / s_MaxNumOpenMPThreads)];
1116 value_type buf;
1117 int sidx(0);
1118 for (const SToken* pTok = m_vRPN.GetBase(); pTok->Cmd != cmEND; ++pTok)
1119 {
1120 switch (pTok->Cmd)
1121 {
1122 // built in binary operators
1123 case cmLE: --sidx; stack[sidx] = stack[sidx] <= stack[sidx + 1]; continue;
1124 case cmGE: --sidx; stack[sidx] = stack[sidx] >= stack[sidx + 1]; continue;
1125 case cmNEQ: --sidx; stack[sidx] = stack[sidx] != stack[sidx + 1]; continue;
1126 case cmEQ: --sidx; stack[sidx] = stack[sidx] == stack[sidx + 1]; continue;
1127 case cmLT: --sidx; stack[sidx] = stack[sidx] < stack[sidx + 1]; continue;
1128 case cmGT: --sidx; stack[sidx] = stack[sidx] > stack[sidx + 1]; continue;
1129 case cmADD: --sidx; stack[sidx] += stack[1 + sidx]; continue;
1130 case cmSUB: --sidx; stack[sidx] -= stack[1 + sidx]; continue;
1131 case cmMUL: --sidx; stack[sidx] *= stack[1 + sidx]; continue;
1132 case cmDIV: --sidx;
1133 stack[sidx] /= stack[1 + sidx];
1134 continue;
1135
1136 case cmPOW:
1137 --sidx; stack[sidx] = MathImpl<value_type>::Pow(stack[sidx], stack[1 + sidx]);
1138 continue;
1139
1140 case cmLAND: --sidx; stack[sidx] = stack[sidx] && stack[sidx + 1]; continue;
1141 case cmLOR: --sidx; stack[sidx] = stack[sidx] || stack[sidx + 1]; continue;
1142
1143 case cmASSIGN:
1144 // Bugfix for Bulkmode:
1145 // for details see:
1146 // https://groups.google.com/forum/embed/?place=forum/muparser-dev&showsearch=true&showpopout=true&showtabs=false&parenturl=http://muparser.beltoforion.de/mup_forum.html&afterlogin&pli=1#!topic/muparser-dev/szgatgoHTws
1147 --sidx;
1148 stack[sidx] = *(pTok->Oprt.ptr + nOffset) = stack[sidx + 1];
1149 continue;
1150 // original code:
1151 //--sidx; Stack[sidx] = *pTok->Oprt.ptr = Stack[sidx+1]; continue;
1152
1153 case cmIF:
1154 if (stack[sidx--] == 0)
1155 {
1156 MUP_ASSERT(sidx >= 0);
1157 pTok += pTok->Oprt.offset;
1158 }
1159 continue;
1160
1161 case cmELSE:
1162 pTok += pTok->Oprt.offset;
1163 continue;
1164
1165 case cmENDIF:
1166 continue;

Callers

nothing calls this directly

Calls 4

assertClass · 0.85
call_multfunMethod · 0.80
sizeMethod · 0.45
GetPosMethod · 0.45

Tested by

no test coverage detected