OPALX (Object Oriented Parallel Accelerator Library for Exascal) master (dc2a29eed580)
OPALX
Loading...
Searching...
No Matches
ArgumentExtractor.cpp
Go to the documentation of this file.
2
3#include <stdexcept>
4
5namespace mslang {
6 ArgumentExtractor::ArgumentExtractor(const std::string& input) : inputArguments_m(input) {
7 const unsigned int length = input.length();
8 unsigned int pos = 0;
9 unsigned short level = 1;
10 unsigned int start = 0;
11
12 for (; pos < length; ++pos) {
13 if (input[pos] == ')') {
14 --level;
15 if (level == 0) {
16 argumentBoundaries_m.push_back(std::make_pair(start, pos - start));
17 break;
18 }
19 } else if (input[pos] == '(')
20 ++level;
21 else if ((input[pos] == ',' || input[pos] == ';') && level == 1) {
22 argumentBoundaries_m.push_back(std::make_pair(start, pos - start));
23 start = pos + 1;
24 }
25 }
26
27 inputArguments_m = inputArguments_m.substr(0, pos);
28 lengthConsumed_m = pos;
29 }
30
31 std::string ArgumentExtractor::get(unsigned int i) const {
32 if (i >= argumentBoundaries_m.size())
33 throw std::out_of_range(
34 "function only has " + std::to_string(argumentBoundaries_m.size())
35 + " arguments");
36
37 auto boundaries = argumentBoundaries_m[i];
38
39 return inputArguments_m.substr(boundaries.first, boundaries.second);
40 }
41
43
44 unsigned int ArgumentExtractor::getNumArguments() const { return argumentBoundaries_m.size(); }
45
46} // namespace mslang
std::vector< std::pair< unsigned int, unsigned int > > argumentBoundaries_m
ArgumentExtractor(const std::string &input)
unsigned int getNumArguments() const
std::string get(unsigned int i) const
unsigned int getLengthConsumed() const