/******************************************************************************* * Copyright 2019 UChicago Argonne, LLC. * (c.f. AUTHORS, LICENSE) * * This file is part of the Argo containers project. * For more info, see https://xgitlab.cels.anl.gov/argo/containers * * SPDX-License-Identifier: BSD-3-Clause *******************************************************************************/ #include "int_list_parser.hpp" #include "utils.hpp" #include #include Int_list_parser::Int_list_parser(): _has_stride(false) { } void Int_list_parser::expand_range(const string& input, vector& out) { vector tokens; int stride = 1; split(input, '-', tokens); THROW_ON_BAD_INPUT_IF(!is_int(tokens[0]), "Ill-formed input; non-integer encountered while expanding a range"); int start = atoi(tokens[0].c_str()); string str_end = tokens[1]; tokens.clear(); split(str_end, 's', tokens); THROW_ON_BAD_INPUT_IF(!is_int(tokens[0]), "Ill-formed input; non-integer encountered while expanding a range"); int end = atoi(tokens[0].c_str()); if(tokens.size() == 2) { _has_stride = true; stride = atoi(tokens[1].c_str()); } for(int i=start; i<=end; i+=stride) out.push_back(i); } void Int_list_parser::convert_to_comprehensive(const string& input, vector& out, bool append) { if(!append) out.clear(); _has_stride = false; vector tokens; split(input, ',', tokens); out.clear(); for(int i=0; i< (int)tokens.size(); i++) { if(str_contains(tokens[i], "-")) expand_range(tokens[i], out); else { THROW_ON_BAD_INPUT_IF(!is_int(tokens[i]), "Ill-formed input; non-integer encountered while expanding a range"); out.push_back(atoi(tokens[i].c_str())); } } std::sort(out.begin(), out.end()); }