示例#1
0
 /**
  * @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;
         }
     }
 }