std::unique_ptr createColumnPrinter()

in c++/src/ColumnPrinter.cc [227:298]


  std::unique_ptr<ColumnPrinter> createColumnPrinter(std::string& buffer, const Type* type,
                                                     ColumnPrinter::Param param) {
    std::unique_ptr<ColumnPrinter> result;
    if (type == nullptr) {
      result = std::make_unique<VoidColumnPrinter>(buffer, param);
    } else {
      switch (static_cast<int64_t>(type->getKind())) {
        case BOOLEAN:
          result = std::make_unique<BooleanColumnPrinter>(buffer, param);
          break;

        case BYTE:
        case SHORT:
        case INT:
        case LONG:
          result = std::make_unique<LongColumnPrinter>(buffer, param);
          break;

        case FLOAT:
        case DOUBLE:
          result = std::make_unique<DoubleColumnPrinter>(buffer, *type, param);
          break;

        case STRING:
        case VARCHAR:
        case CHAR:
          result = std::make_unique<StringColumnPrinter>(buffer, param);
          break;

        case BINARY:
          result = std::make_unique<BinaryColumnPrinter>(buffer, param);
          break;

        case TIMESTAMP:
        case TIMESTAMP_INSTANT:
          result = std::make_unique<TimestampColumnPrinter>(buffer, param);
          break;

        case LIST:
          result = std::make_unique<ListColumnPrinter>(buffer, *type, param);
          break;

        case MAP:
          result = std::make_unique<MapColumnPrinter>(buffer, *type, param);
          break;

        case STRUCT:
          result = std::make_unique<StructColumnPrinter>(buffer, *type, param);
          break;

        case DECIMAL:
          if (type->getPrecision() == 0 || type->getPrecision() > 18) {
            result = std::make_unique<Decimal128ColumnPrinter>(buffer, param);
          } else {
            result = std::make_unique<Decimal64ColumnPrinter>(buffer, param);
          }
          break;

        case DATE:
          result = std::make_unique<DateColumnPrinter>(buffer, param);
          break;

        case UNION:
          result = std::make_unique<UnionColumnPrinter>(buffer, *type, param);
          break;

        default:
          throw std::logic_error("unknown batch type");
      }
    }
    return result;
  }