예제 #1
0
 public XnRegion runAtInt(int anIdx) {
   return myDsp.ofAll((myTable.runAtInt((myDsp.inverseOfInt(anIdx)))));
   /*
   udanax-top.st:47581:OffsetImmuTable methodsFor: 'runs'!
   {XnRegion} runAtInt: anIdx {IntegerVar}
   	^myDsp ofAll: (myTable runAtInt: (myDsp inverseOfInt: anIdx))!
   */
 }
예제 #2
0
 /**
  * 'MuTable::introduceAll is to 'MuTable::introduce' as 'MuTable::storeAll' is to
  * 'MuTable::store'. See MuTable::storeAll. In addition to the functionality provided by
  * MuTable::storeAll, I BLAST *if* all the associations I'm being asked to store override existing
  * associations of mine. If I BLAST for this reason, then I guarantee that I haven't changed
  * myself at all.
  */
 public void introduceAll(ScruTable table, Dsp dsp, XnRegion region) {
   /* Since this function checks the relavent regions, it can call the potentially
   more efficient store: */
   if (!(table.coordinateSpace().isEqual(coordinateSpace()))) {
     throw new AboraRuntimeException(AboraRuntimeException.WRONG_COORD_SPACE);
   }
   if (dsp == null) {
     if (domain().intersects(table.domain())) {
       throw new AboraRuntimeException(AboraRuntimeException.ALREADY_IN_TABLE);
     }
   } else {
     if (region == null) {
       if (domain().intersects((dsp.ofAll(table.domain())))) {
         throw new AboraRuntimeException(AboraRuntimeException.ALREADY_IN_TABLE);
       }
     } else {
       if (domain().intersects((dsp.ofAll((table.domain().intersect(region)))))) {
         throw new AboraRuntimeException(AboraRuntimeException.ALREADY_IN_TABLE);
       }
     }
   }
   storeAll(table, dsp, region);
   /*
   udanax-top.st:47858:MuTable methodsFor: 'bulk operations'!
   {void} introduceAll: table {ScruTable}
   	with: dsp {Dsp default: NULL}
   	with: region {XnRegion default: NULL}
   	"'MuTable::introduceAll is to 'MuTable::introduce' as 'MuTable::storeAll' is to
   	'MuTable::store'.  See MuTable::storeAll.  In addition to the functionality
   	provided by MuTable::storeAll, I BLAST *if* all the associations I'm being
   	asked to store override existing associations of mine.  If I BLAST for this
   	reason, then I guarantee that I haven't changed myself at all."
   	"Since this function checks the relavent regions, it can call the potentially
   	more efficient store:"
   	(table coordinateSpace isEqual: self coordinateSpace) ifFalse:
   		[ Heaper BLAST: #WrongCoordSpace ].
   	dsp == NULL
   		ifTrue:
   			[(self domain intersects: table domain) ifTrue:
   				[ Heaper BLAST: #AlreadyInTable ]]
   		ifFalse:
   			[region == NULL
   				ifTrue:
   					[(self domain intersects: (dsp ofAll: table domain)) ifTrue:
   						[ Heaper BLAST: #AlreadyInTable ]]
   				ifFalse:
   					[(self domain intersects: (dsp ofAll: (table domain intersect: region))) ifTrue:
   						[ Heaper BLAST: #AlreadyInTable ]]].
   	self storeAll: table with: dsp with: region!
   */
 }
예제 #3
0
 public ScruTable transformedBy(Dsp dsp) {
   if (myDsp.inverse().isEqual(dsp)) {
     return myTable;
   } else {
     return new OffsetScruTable(myTable, (dsp.compose(myDsp)));
   }
   /*
   udanax-top.st:47567:OffsetImmuTable methodsFor: 'accessing'!
   {ScruTable} transformedBy: dsp {Dsp}
   	(myDsp inverse isEqual: dsp)
   		ifTrue: [^myTable]
   		ifFalse: [^OffsetScruTable create: myTable with: (dsp compose: myDsp)]!
   */
 }
예제 #4
0
  /**
   * I 'store' into myself (see MuTable::store) all the associations from 'table'. If 'region' is
   * provided, then I only store those associations from 'table' whose key is inside 'region'. If
   * 'dsp' is provided, then I transform the keys (from the remaining associations) by dsp before
   * storing into myself.
   */
  public void storeAll(ScruTable table, Dsp dsp, XnRegion region) {
    TableStepper stepper;
    if (!(table.coordinateSpace().isEqual(coordinateSpace()))) {
      throw new AboraRuntimeException(AboraRuntimeException.WRONG_COORD_SPACE);
    }
    if (dsp == null) {
      Stepper stomper = (stepper = table.stepper());
      for (; stomper.hasValue(); stomper.step()) {
        Heaper e = (Heaper) stomper.fetch();
        if (e == null) {
          continue;
        }
        store(stepper.position(), e);
      }
      stomper.destroy();
    } else {
      ScruTable localTable;
      if (region != null) {
        localTable = table.subTable(region);
      } else {
        localTable = table;
      }
      Stepper stomper2 = (stepper = localTable.stepper());
      for (; stomper2.hasValue(); stomper2.step()) {
        Heaper x = (Heaper) stomper2.fetch();
        if (x == null) {
          continue;
        }
        store((dsp.of(stepper.position())), x);
      }
      stomper2.destroy();
    }
    /*
    udanax-top.st:47924:MuTable methodsFor: 'bulk operations'!
    {void} storeAll: table {ScruTable}
    	with: dsp {Dsp default: NULL}
    	with: region {XnRegion default: NULL}
    	"I 'store' into myself (see MuTable::store) all the associations from 'table'.
    	If 'region' is provided, then I only store those associations from 'table' whose
    	key is inside 'region'.  If 'dsp' is provided, then I transform the keys (from
    	the remaining associations) by dsp before storing into myself."

    	| stepper {TableStepper} |
    	(table coordinateSpace isEqual: self coordinateSpace) ifFalse:
    		[ Heaper BLAST: #WrongCoordSpace ].
    	dsp == NULL
    		ifTrue:
    			[(stepper _ table stepper) forEach:
    				[ :e {Heaper} |
    				self at: stepper position store: e]]
    		ifFalse:
    			[| localTable {ScruTable} |
    			region ~~ NULL ifTrue: [ localTable _ table subTable: region ]
    							ifFalse: [ localTable _ table ].
    			(stepper _ localTable stepper) forEach:
    				[ :x {Heaper} |
    				self at: (dsp of: stepper position) store: x]]!
    */
  }
예제 #5
0
 public boolean includesIntKey(int aKey) {
   return myTable.includesIntKey((myDsp.inverseOfInt(aKey)));
   /*
   udanax-top.st:47589:OffsetImmuTable methodsFor: 'testing'!
   {BooleanVar} includesIntKey: aKey {IntegerVar}
   	^myTable includesIntKey: (myDsp inverseOfInt: aKey)!
   */
 }
예제 #6
0
 public int actualHashForEqual() {
   return HashHelper.hashForEqual(this.getClass()) + myTable.hashForEqual() + myDsp.hashForEqual();
   /*
   udanax-top.st:47586:OffsetImmuTable methodsFor: 'testing'!
   {UInt32} actualHashForEqual
   	^#cat.U.OffsetImmuTable hashForEqual + myTable hashForEqual + myDsp hashForEqual!
   */
 }
예제 #7
0
 public ImmuTable without(Position index) {
   return new OffsetImmuTable((myTable.without((myDsp.inverseOf(index)))), myDsp);
   /*
   udanax-top.st:47657:OffsetImmuTable methodsFor: 'SEF manipulation'!
   {ImmuTable} without: index {Position}
   	^OffsetImmuTable create: (myTable without: (myDsp inverseOf: index)) with: myDsp!
   */
 }
예제 #8
0
 public ScruTable subTable(XnRegion encl) {
   return new OffsetScruTable((myTable.subTable((myDsp.inverseOfAll(encl)))), myDsp);
   /*
   udanax-top.st:47563:OffsetImmuTable methodsFor: 'accessing'!
   {ScruTable} subTable: encl {XnRegion}
   	^OffsetScruTable create: (myTable subTable: (myDsp inverseOfAll: encl)) with: myDsp.!
   */
 }
예제 #9
0
 public Heaper intFetch(int idx) {
   return myTable.intFetch((myDsp.inverseOfInt(idx)));
   /*
   udanax-top.st:47560:OffsetImmuTable methodsFor: 'accessing'!
   {Heaper} intFetch: idx {IntegerVar}
   	^myTable intFetch: (myDsp inverseOfInt: idx)!
   */
 }
예제 #10
0
 public Heaper fetch(Position anIndex) {
   return myTable.intFetch((myDsp.inverseOfInt(((IntegerPos) anIndex).asIntegerVar())));
   /*
   udanax-top.st:47556:OffsetImmuTable methodsFor: 'accessing'!
   {Heaper} fetch: anIndex {Position}
   	^myTable intFetch: (myDsp inverseOfInt: (anIndex cast: IntegerPos) asIntegerVar)!
   */
 }
예제 #11
0
 public XnRegion domain() {
   return myDsp.ofAll(myTable.domain());
   /*
   udanax-top.st:47552:OffsetImmuTable methodsFor: 'accessing'!
   {XnRegion} domain
   	^myDsp ofAll: myTable domain!
   */
 }
예제 #12
0
  public boolean includesKey(Position aKey) {
    return myTable.includesKey((myDsp.inverseOf(aKey)));
    /*
    udanax-top.st:47592:OffsetImmuTable methodsFor: 'testing'!
    {BooleanVar} includesKey: aKey {Position}

    	^ myTable includesKey: (myDsp inverseOf: aKey)!
    */
  }
예제 #13
0
 public void introduceAll(ScruTable table, Dsp dsp) {
   TableStepper stepper;
   if (!(table.coordinateSpace().isEqual(coordinateSpace()))) {
     throw new AboraRuntimeException(AboraRuntimeException.WRONG_COORD_SPACE);
   }
   if (domain().intersects((dsp.ofAll(table.domain())))) {
     throw new AboraRuntimeException(AboraRuntimeException.ALREADY_IN_TABLE);
   }
   if (dsp == null) {
     Stepper stomper = (stepper = table.stepper());
     for (; stomper.hasValue(); stomper.step()) {
       Heaper d = (Heaper) stomper.fetch();
       if (d == null) {
         continue;
       }
       introduce(stepper.position(), d);
     }
     stomper.destroy();
   } else {
     Stepper stomper2 = (stepper = table.stepper());
     for (; stomper2.hasValue(); stomper2.step()) {
       Heaper e = (Heaper) stomper2.fetch();
       if (e == null) {
         continue;
       }
       introduce((dsp.of(stepper.position())), e);
     }
     stomper2.destroy();
   }
   /*
   udanax-top.st:48046:MuTable methodsFor: 'smalltalk: defaults'!
   {void} introduceAll: table {ScruTable} with: dsp {Dsp default: NULL}
   	| stepper {TableStepper} |
   	(table coordinateSpace isEqual: self coordinateSpace)
   		ifFalse: [Heaper BLAST: #WrongCoordSpace].
   	(self domain intersects: (dsp ofAll: table domain))
   		ifTrue: [Heaper BLAST: #AlreadyInTable].
   	dsp == NULL
   		ifTrue: [(stepper _ table stepper) forEach: [:d {Heaper} |
   				self at: stepper position introduce: d]]
   		ifFalse: [(stepper _ table stepper) forEach: [:e {Heaper} |
   				self at: (dsp of: stepper position) introduce: e]]!
   */
 }
예제 #14
0
 public XnRegion runAt(Position key) {
   if (includesKey((myDsp.inverseOf(key)))) {
     return key.asRegion();
   } else {
     return myTable.coordinateSpace().emptyRegion();
   }
   /*
   udanax-top.st:47575:OffsetImmuTable methodsFor: 'runs'!
   {XnRegion} runAt: key {Position}
   	(self includesKey: (myDsp inverseOf: key))
   		ifTrue: [^ key asRegion]
   		ifFalse: [^ myTable coordinateSpace emptyRegion]!
   */
 }
예제 #15
0
 public void storeAll(ScruTable table, Dsp dsp) {
   TableStepper stepper;
   if (!(table.coordinateSpace().isEqual(coordinateSpace()))) {
     throw new AboraRuntimeException(AboraRuntimeException.WRONG_COORD_SPACE);
   }
   if (dsp == null) {
     Stepper stomper = (stepper = table.stepper());
     for (; stomper.hasValue(); stomper.step()) {
       Heaper e = (Heaper) stomper.fetch();
       if (e == null) {
         continue;
       }
       store((dsp.of(stepper.position())), e);
     }
     stomper.destroy();
   } else {
     Stepper stomper2 = (stepper = table.stepper());
     for (; stomper2.hasValue(); stomper2.step()) {
       Heaper x = (Heaper) stomper2.fetch();
       if (x == null) {
         continue;
       }
       store(stepper.position(), x);
     }
     stomper2.destroy();
   }
   /*
   udanax-top.st:48077:MuTable methodsFor: 'smalltalk: defaults'!
   {void} storeAll: table {ScruTable} with: dsp {Dsp default: NULL}
   	| stepper {TableStepper} |
   	(table coordinateSpace isEqual: self coordinateSpace)
   		ifFalse: [Heaper BLAST: #WrongCoordSpace].
   	dsp == NULL
   		ifTrue: [(stepper _ table stepper) forEach: [:e {Heaper} |
   				self at: (dsp of: stepper position) store: e]]
   		ifFalse: [(stepper _ table stepper) forEach: [:x {Heaper} |
   				self at: stepper position store: x]]!
   */
 }
예제 #16
0
 public MuTable asMuTable() {
   MuTable newTab;
   TableStepper s;
   newTab = (myTable.emptySize(myTable.count())).asMuTable();
   Stepper stomper = (s = myTable.stepper());
   for (; stomper.hasValue(); stomper.step()) {
     Heaper e = (Heaper) stomper.fetch();
     if (e == null) {
       continue;
     }
     newTab.store((myDsp.of(s.position())), e);
   }
   stomper.destroy();
   return newTab;
   /*
   udanax-top.st:47617:OffsetImmuTable methodsFor: 'conversion'!
   {MuTable} asMuTable
   	| newTab {MuTable} s {TableStepper} |
   	newTab _ (myTable emptySize: myTable count) asMuTable.
   	(s _ myTable stepper) forEach: [ :e {Heaper} |
   		newTab at: (myDsp of: s position) store: e].
   	^ newTab!
   */
 }
예제 #17
0
 public ImmuTable combineWith(ImmuTable other) {
   MuTable newTable;
   TableStepper others;
   newTable = (MuTable) myTable.copy().asMuTable();
   others = other.stepper();
   while (others.hasValue()) {
     newTable.store((myDsp.inverseOf(others.position())), others.fetch());
     others.step();
   }
   others.destroy();
   return new OffsetImmuTable(newTable.asImmuTable(), myDsp);
   /*
   udanax-top.st:47646:OffsetImmuTable methodsFor: 'SEF manipulation'!
   {ImmuTable} combineWith: other {ImmuTable}
   	| newTable {MuTable} others {TableStepper} |
   	newTable _ myTable copy asMuTable.
   	others _ other stepper.
   	[others hasValue] whileTrue:
   		[newTable at: (myDsp inverseOf: others position) store: others fetch.
   		others step].
   	others destroy.
   	^OffsetImmuTable create: newTable asImmuTable with: myDsp!
   */
 }
예제 #18
0
  /**
   * 'MuTable::replaceAll is to 'MuTable::replace' as 'MuTable::storeAll' is to 'MuTable::store'.
   * See MuTable::storeAll. In addition to the functionality provided by MuTable::storeAll, I BLAST
   * *unless* all the associations I'm being asked to store override existing associations of mine.
   * If I BLAST for this reason, then I guarantee that I haven't changed myself at all.
   */
  public void replaceAll(ScruTable table, Dsp dsp, XnRegion region) {
    /* Since this function checks the relavent regions, it can call the potentially
    more efficient store: */
    TableStepper stepper;
    if (!(table.coordinateSpace().isEqual(coordinateSpace()))) {
      throw new AboraRuntimeException(AboraRuntimeException.WRONG_COORD_SPACE);
    }
    if (dsp == null) {
      if (!(table.domain().isSubsetOf(domain()))) {
        throw new AboraRuntimeException(AboraRuntimeException.ALREADY_IN_TABLE);
      }
      Stepper stomper = (stepper = table.stepper());
      for (; stomper.hasValue(); stomper.step()) {
        Heaper e = (Heaper) stomper.fetch();
        if (e == null) {
          continue;
        }
        store(stepper.position(), e);
      }
      stomper.destroy();
    } else {
      if (region == null) {
        if (!((dsp.ofAll(table.domain())).isSubsetOf(domain()))) {
          throw new AboraRuntimeException(AboraRuntimeException.ALREADY_IN_TABLE);
        }
        Stepper stomper2 = (stepper = table.stepper());
        for (; stomper2.hasValue(); stomper2.step()) {
          Heaper x = (Heaper) stomper2.fetch();
          if (x == null) {
            continue;
          }
          store((dsp.of(stepper.position())), x);
        }
        stomper2.destroy();
      } else {
        if (!((dsp.ofAll((table.domain().intersect(region)))).isSubsetOf(domain()))) {
          throw new AboraRuntimeException(AboraRuntimeException.ALREADY_IN_TABLE);
        }
        Stepper stomper3 = (stepper = (table.subTable(region)).stepper());
        for (; stomper3.hasValue(); stomper3.step()) {
          Heaper y = (Heaper) stomper3.fetch();
          if (y == null) {
            continue;
          }
          store((dsp.of(stepper.position())), y);
        }
        stomper3.destroy();
      }
    }
    /*
    udanax-top.st:47886:MuTable methodsFor: 'bulk operations'!
    {void} replaceAll: table {ScruTable}
    	with: dsp {Dsp default: NULL}
    	with: region {XnRegion default: NULL}
    	"'MuTable::replaceAll is to 'MuTable::replace' as 'MuTable::storeAll' is to
    	'MuTable::store'.  See MuTable::storeAll.  In addition to the functionality
    	provided by MuTable::storeAll, I BLAST *unless* all the associations I'm being
    	asked to store override existing associations of mine.  If I BLAST for this
    	reason, then I guarantee that I haven't changed myself at all."
    	"Since this function checks the relavent regions, it can call the potentially
    	more efficient store:"

    	| stepper {TableStepper} |
    	(table coordinateSpace isEqual: self coordinateSpace) ifFalse:
    		[ Heaper BLAST: #WrongCoordSpace ].
    	dsp == NULL
    		ifTrue:
    			[(table domain isSubsetOf: self domain) ifFalse:
    				[ Heaper BLAST: #AlreadyInTable ].
    			(stepper _ table stepper) forEach:
    				[ :e {Heaper} |
    				self at: stepper position store: e]]
    		ifFalse:
    			[region == NULL
    				ifTrue:
    					[((dsp ofAll: table domain) isSubsetOf: self domain) ifFalse:
    						[ Heaper BLAST: #AlreadyInTable ].
    					(stepper _ table stepper) forEach:
    						[ :x {Heaper} |
    						self at: (dsp of: stepper position) store: x]]
    				ifFalse:
    					[((dsp ofAll: (table domain intersect: region)) isSubsetOf: self domain) ifFalse:
    						[ Heaper BLAST: #AlreadyInTable ].
    					(stepper _ (table subTable: region) stepper) forEach:
    						[ :y {Heaper} |
    						self at: (dsp of: stepper position) store: y]]]!
    */
  }