/** * @api * @return bool * @throws \Exception */ public function setValueSet() { $argc = func_num_args(); $argv = func_get_args(); if ($argc === 1 && is_string($argv[0])) { // try to parse a string with structure "{$elem1, $elem2}" $arg = $argv[0]; if (isset(ScalarS::$compiledValueSets[$arg])) { $valueSet = ScalarS::$compiledValueSets[$arg]; } else { if ($arg[0] !== "{") { throw new \Exception("Value set definition must start with '{'"); } $matchedBracket = false; $valueSet = array(""); // parse the string argument for ($i = 1; $i < strlen($arg); $i++) { if ($matchedBracket) { throw new \Exception("Unexpected character '" . $arg[$i] . "' after '}'"); } else { if ($arg[$i] === '}' && $arg[$i - 1] !== '\\') { $matchedBracket = true; } else { if ($arg[$i] === ',' && $arg[$i - 1] !== '\\') { $valueSet[] = ""; } else { if ($arg[$i] === '\\') { if ($i + 1 < strlen($arg) && $arg[$i + 1] !== ',' && $arg[$i + 1] !== '}') { $valueSet[count($valueSet) - 1] .= "\\"; } } else { $valueSet[count($valueSet) - 1] .= $arg[$i]; } } } } } if (!$matchedBracket) { throw new \Exception("Expected character '}' at the end of value set string"); } NumericS::$compiledValueSets[$arg] = $valueSet; } if (!$this->toTypeFromString($valueSet)) { return false; } else { $this->valueSet = $valueSet; return true; } } else { if (Structure::ArrayS($this->getType() . "[]")->check($argv)) { foreach ($argv as $value) { if (!$this->checkType($value)) { return false; } } $this->valueSet = $argv; return true; } else { return false; } } }