private List<int[]> findPositions(final String value) { // PRIM_TYPE
    IndexIterator iter = getIterator(true);
    List<int[]> posns = new ArrayList<int[]>();
    int[] pos = iter.getPos();

    {
      while (iter.hasNext()) {
        if (data[iter.index] == value) {
          posns.add(pos.clone());
        }
      }
    }
    return posns;
  }
  @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;
  }
  @Override
  public CompoundIntegerDataset setSlice(final Object o, final SliceIterator siter) {
    if (o instanceof IDataset) {
      final IDataset ds = (IDataset) o;
      final int[] oshape = ds.getShape();

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

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

        if (ds instanceof AbstractCompoundDataset) {
          if (isize != ads.getElementsPerItem()) {
            throw new IllegalArgumentException("Input dataset is not compatible with slice");
          }

          while (siter.hasNext() && oiter.hasNext()) {
            for (int i = 0; i < isize; i++)
              data[siter.index + i] =
                  (int) ads.getElementLongAbs(oiter.index + i); // GET_ELEMENT_WITH_CAST
          }
        } else {
          while (siter.hasNext() && oiter.hasNext()) {
            data[siter.index] = (int) ads.getElementLongAbs(oiter.index); // GET_ELEMENT_WITH_CAST
            for (int i = 1; i < isize; i++) data[siter.index + i] = 0;
          }
        }
      } else {
        final IndexIterator oiter = new PositionIterator(oshape);
        final int[] pos = oiter.getPos();

        if (ds.getElementsPerItem() == 1) {
          while (siter.hasNext() && oiter.hasNext()) {
            data[siter.index] = ds.getInt(pos); // PRIM_TYPE
            for (int i = 1; i < isize; i++) data[siter.index + i] = 0;
          }
        } else {
          while (siter.hasNext() && oiter.hasNext()) {
            final int[] val = toIntegerArray(ds.getObject(pos), isize); // PRIM_TYPE // CLASS_TYPE
            for (int i = 0; i < isize; i++) data[siter.index + i] = val[i];
          }
        }
      }
    } else {
      try {
        final int[] vr = toIntegerArray(o, isize); // PRIM_TYPE // CLASS_TYPE

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