| 146 | } |
| 147 | |
| 148 | ConstantValue eval(EvalContext& context, const Args& args, SourceRange, |
| 149 | const CallExpression::SystemCallInfo& callInfo) const final { |
| 150 | auto lval = args[0]->evalLValue(context); |
| 151 | if (!lval) |
| 152 | return nullptr; |
| 153 | |
| 154 | auto target = lval.resolve(); |
| 155 | if (!target) |
| 156 | return nullptr; |
| 157 | |
| 158 | auto [iterExpr, iterVar] = callInfo.getIteratorInfo(); |
| 159 | if (iterExpr) { |
| 160 | SLANG_ASSERT(iterVar); |
| 161 | auto guard = context.disableCaching(); |
| 162 | auto iterVal = context.createLocal(iterVar); |
| 163 | |
| 164 | auto sortTarget = [&, ie = iterExpr](auto& target) { |
| 165 | auto pred = [&, ie = ie](ConstantValue& a, ConstantValue& b) { |
| 166 | *iterVal = a; |
| 167 | ConstantValue cva = ie->eval(context); |
| 168 | |
| 169 | *iterVal = b; |
| 170 | ConstantValue cvb = ie->eval(context); |
| 171 | |
| 172 | return cva < cvb; |
| 173 | }; |
| 174 | |
| 175 | if (reversed) |
| 176 | std::ranges::sort(target.rbegin(), target.rend(), pred); |
| 177 | else |
| 178 | std::ranges::sort(target, pred); |
| 179 | }; |
| 180 | |
| 181 | if (target->isQueue()) { |
| 182 | sortTarget(*target->queue()); |
| 183 | } |
| 184 | else { |
| 185 | auto& vec = std::get<ConstantValue::Elements>(target->getVariant()); |
| 186 | sortTarget(vec); |
| 187 | } |
| 188 | } |
| 189 | else { |
| 190 | auto sortTarget = [&](auto& target) { |
| 191 | if (reversed) |
| 192 | std::ranges::sort(target.rbegin(), target.rend(), std::less<>{}); |
| 193 | else |
| 194 | std::ranges::sort(target, std::less<>{}); |
| 195 | }; |
| 196 | |
| 197 | if (target->isQueue()) { |
| 198 | sortTarget(*target->queue()); |
| 199 | } |
| 200 | else { |
| 201 | auto& vec = std::get<ConstantValue::Elements>(target->getVariant()); |
| 202 | sortTarget(vec); |
| 203 | } |
| 204 | } |
| 205 |
nothing calls this directly
no test coverage detected