std::unique_ptr TypeImpl::parseCategory()

in c++/src/TypeImpl.cc [721:786]


  std::unique_ptr<Type> TypeImpl::parseCategory(std::string category, const std::string& input,
                                                size_t start, size_t end) {
    if (category == "boolean") {
      validatePrimitiveType(category, input, start);
      return std::make_unique<TypeImpl>(BOOLEAN);
    } else if (category == "tinyint") {
      validatePrimitiveType(category, input, start);
      return std::make_unique<TypeImpl>(BYTE);
    } else if (category == "smallint") {
      validatePrimitiveType(category, input, start);
      return std::make_unique<TypeImpl>(SHORT);
    } else if (category == "int") {
      validatePrimitiveType(category, input, start);
      return std::make_unique<TypeImpl>(INT);
    } else if (category == "bigint") {
      validatePrimitiveType(category, input, start);
      return std::make_unique<TypeImpl>(LONG);
    } else if (category == "float") {
      validatePrimitiveType(category, input, start);
      return std::make_unique<TypeImpl>(FLOAT);
    } else if (category == "double") {
      validatePrimitiveType(category, input, start);
      return std::make_unique<TypeImpl>(DOUBLE);
    } else if (category == "string") {
      validatePrimitiveType(category, input, start);
      return std::make_unique<TypeImpl>(STRING);
    } else if (category == "binary") {
      validatePrimitiveType(category, input, start);
      return std::make_unique<TypeImpl>(BINARY);
    } else if (category == "timestamp") {
      validatePrimitiveType(category, input, start);
      return std::make_unique<TypeImpl>(TIMESTAMP);
    } else if (category == "timestamp with local time zone") {
      validatePrimitiveType(category, input, start);
      return std::make_unique<TypeImpl>(TIMESTAMP_INSTANT);
    } else if (category == "array") {
      return parseArrayType(input, start, end);
    } else if (category == "map") {
      return parseMapType(input, start, end);
    } else if (category == "struct") {
      return parseStructType(input, start, end);
    } else if (category == "uniontype") {
      return parseUnionType(input, start, end);
    } else if (category == "decimal") {
      return parseDecimalType(input, start, end);
    } else if (category == "date") {
      validatePrimitiveType(category, input, start);
      return std::make_unique<TypeImpl>(DATE);
    } else if (category == "varchar") {
      if (input[start] != '(') {
        throw std::logic_error("Missing ( after varchar.");
      }
      uint64_t maxLength =
          static_cast<uint64_t>(atoi(input.substr(start + 1, end - start + 1).c_str()));
      return std::make_unique<TypeImpl>(VARCHAR, maxLength);
    } else if (category == "char") {
      if (input[start] != '(') {
        throw std::logic_error("Missing ( after char.");
      }
      uint64_t maxLength =
          static_cast<uint64_t>(atoi(input.substr(start + 1, end - start + 1).c_str()));
      return std::make_unique<TypeImpl>(CHAR, maxLength);
    } else {
      throw std::logic_error("Unknown type " + category);
    }
  }