/**
   * Get a table from PV
   *
   * <p>Ideally, the PV holds a {@link VTable}, and the returned data is then the table's data.
   *
   * <p>If the PV is a scalar, a table with a single cell is returned.
   *
   * <p>If the PV is an array, a table with one column is returned.
   *
   * @param value Value of a PV
   * @return List of rows, where each row contains either String or Number cells
   */
  @SuppressWarnings("rawtypes")
  public static List<List<Object>> getTable(final VType value) {
    final List<List<Object>> data = new ArrayList<>();
    if (value instanceof VTable) {
      final VTable table = (VTable) value;
      final int rows = table.getRowCount();
      final int cols = table.getColumnCount();
      // Extract 2D string matrix for data
      for (int r = 0; r < rows; ++r) {
        final List<Object> row = new ArrayList<>(cols);
        for (int c = 0; c < cols; ++c) {
          final Object col_data = table.getColumnData(c);
          if (col_data instanceof List) row.add(Objects.toString(((List) col_data).get(r)));
          else if (col_data instanceof ListDouble) row.add(((ListDouble) col_data).getDouble(r));
          else if (col_data instanceof ListNumber) row.add(((ListNumber) col_data).getLong(r));
          else row.add(Objects.toString(col_data));
        }
        data.add(row);
      }
    } else if (value instanceof VNumberArray) {
      final ListNumber numbers = ((VNumberArray) value).getData();
      final int num = numbers.size();
      for (int i = 0; i < num; ++i) data.add(Arrays.asList(numbers.getDouble(i)));
    } else if (value instanceof VNumber) data.add(Arrays.asList(((VNumber) value).getValue()));
    else data.add(Arrays.asList(Objects.toString(value)));

    return data;
  }
  /**
   * Try to get a 'double' type array from a value.
   *
   * @param value Value of a PV
   * @return Current value as double[]. Will return single-element array for scalar value, including
   *     <code>{ Double.NaN }</code> in case the value type does not decode into a number.
   */
  public static double[] getDoubleArray(final VType value) {
    if (value instanceof VNumberArray) {
      final ListNumber list = ((VNumberArray) value).getData();
      final Object wrapped = CollectionNumbers.wrappedArray(list);
      if (wrapped instanceof double[]) return (double[]) wrapped;

      final double[] result = new double[list.size()];
      for (int i = 0; i < result.length; i++) result[i] = list.getDouble(i);
      return result;
    }
    return new double[] {getDouble(value)};
  }