@Override
  public StringDatasetBase setSlice(final Object obj, final IndexIterator siter) {

    if (obj instanceof IDataset) {
      final IDataset ds = (IDataset) obj;
      final int[] oshape = ds.getShape();

      if (!areShapesCompatible(siter.getShape(), oshape)) {
        throw new IllegalArgumentException(
            String.format(
                "Input dataset is not compatible with slice: %s cf %s",
                Arrays.toString(oshape), Arrays.toString(siter.getShape())));
      }

      if (ds instanceof Dataset) {
        final Dataset ads = (Dataset) ds;
        final IndexIterator oiter = ads.getIterator();

        while (siter.hasNext() && oiter.hasNext())
          data[siter.index] = ads.getStringAbs(oiter.index); // GET_ELEMENT_WITH_CAST
      } else {
        final IndexIterator oiter = new PositionIterator(oshape);
        final int[] pos = oiter.getPos();

        while (siter.hasNext() && oiter.hasNext())
          data[siter.index] = ds.getString(pos); // PRIM_TYPE
      }
    } else {
      try {
        String v = obj.toString(); // PRIM_TYPE // FROM_OBJECT

        while (siter.hasNext()) data[siter.index] = v;
      } catch (IllegalArgumentException e) {
        throw new IllegalArgumentException("Object for setting slice is not a dataset or number");
      }
    }
    setDirty();
    return this;
  }