Skip to content

Commit

Permalink
Radix-Balanced Finger Tree Vectors
Browse files Browse the repository at this point in the history
This is complete rewrite of the old scala.collection.immutable.Vector.
The design differs from the old one in one important aspect: Instead
of a single movable finger (the "display" pointers) it has a fixed
finger at each end. These fingers are part of the proper data
structure, not a transient optimization. There are no other ways to
get to the data in the fingers (it is not part of the main data
array), no focus point, and no stabilization. As a side-effect, the
data structure is completely immutable and no extra memory fences are
required. A second major difference lies in the implementation.
Whereas the old Vector uses a single class for collections of all
supported sizes, the new one is split into Vector0 to Vector6 for the
different dimensions of the main data array.
  • Loading branch information
szeiger committed Dec 13, 2019
1 parent de3e806 commit b1dabca
Show file tree
Hide file tree
Showing 7 changed files with 4,322 additions and 1,106 deletions.
158 changes: 158 additions & 0 deletions build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,164 @@ val mimaFilterSettings = Seq {
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.reflect.runtime.SynchronizedTypes.defineNormalized"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.reflect.runtime.JavaUniverse.defineNormalized"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.reflect.io.ZipArchive.RootEntry"),

////////////////////////////////////////////////////////////////////////////// Vector backward compatiblity

// Vector and VectorBuilder do not extend VectorPointer anymore; all features are package-private
ProblemFilters.exclude[MissingTypesProblem]("scala.collection.immutable.VectorBuilder"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.Vector.depth"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.Vector.depth_="),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.Vector.display0"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.Vector.display0_="),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.Vector.display1"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.Vector.display1_="),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.Vector.display2"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.Vector.display2_="),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.Vector.display3"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.Vector.display3_="),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.Vector.display4"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.Vector.display4_="),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.Vector.display5"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.Vector.display5_="),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.Vector.gotoFreshPosWritable0"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.Vector.gotoFreshPosWritable1"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.Vector.gotoNextBlockStart"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.Vector.gotoNextBlockStartWritable"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.Vector.gotoNewBlockStart"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.Vector.gotoPosWritable0"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.Vector.preClean"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.Vector.copyRange"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.Vector.gotoPos"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.Vector.stabilize"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorBuilder.depth"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorBuilder.depth_="),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorBuilder.display0"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorBuilder.display0_="),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorBuilder.display1"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorBuilder.display1_="),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorBuilder.display2"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorBuilder.display2_="),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorBuilder.display3"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorBuilder.display3_="),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorBuilder.display4"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorBuilder.display4_="),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorBuilder.display5"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorBuilder.display5_="),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorBuilder.gotoFreshPosWritable0"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorBuilder.gotoFreshPosWritable1"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorBuilder.gotoNextBlockStart"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorBuilder.gotoNextBlockStartWritable"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorBuilder.gotoNewBlockStart"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorBuilder.gotoPosWritable0"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorBuilder.preClean"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorBuilder.copyRange"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorBuilder.gotoPos"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorBuilder.stabilize"),

ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorIterator.gotoFreshPosWritable1"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorIterator.display1_="),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorIterator.remainingVector"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorIterator.depth_="),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorIterator.display1"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorIterator.display5_="),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorIterator.gotoPosWritable0"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorIterator.display4"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorIterator.display2_="),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorIterator.gotoNextBlockStart"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorIterator.preClean"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorIterator.gotoFreshPosWritable0"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorIterator.copyRange"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorIterator.remainingElementCount"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorIterator.display0"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorIterator.display3_="),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorIterator.display3"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorIterator.gotoNextBlockStartWritable"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorIterator.gotoPos"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorIterator.display0_="),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorIterator.display4_="),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorIterator.display5"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorIterator.depth"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorIterator.stabilize"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorIterator.initFrom"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorIterator.initFrom"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorIterator.gotoNewBlockStart"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorIterator.display2"),
ProblemFilters.exclude[MissingClassProblem]("scala.collection.immutable.VectorPointer"),
ProblemFilters.exclude[MissingTypesProblem]("scala.collection.immutable.VectorIterator"),

// Some other package-private methods have been removed, changed or added
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorBuilder.remainingVector"),
ProblemFilters.exclude[IncompatibleMethTypeProblem]("scala.collection.immutable.VectorBuilder.initFrom"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorBuilder.initFrom"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.Vector.dirty"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.Vector.dirty_="),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.Vector.initIterator"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.Vector.updateAt"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.Vector.initFrom"),
ProblemFilters.exclude[ReversedMissingMethodProblem]("scala.collection.immutable.Vector.vectorSlice"),
ProblemFilters.exclude[ReversedMissingMethodProblem]("scala.collection.immutable.Vector.vectorSliceCount"),
ProblemFilters.exclude[ReversedMissingMethodProblem]("scala.collection.immutable.Vector.vectorSlicePrefixLength"),
ProblemFilters.exclude[ReversedMissingMethodProblem]("scala.collection.immutable.Vector.slice0"),
ProblemFilters.exclude[IncompatibleResultTypeProblem]("scala.collection.immutable.VectorIterator.remainingVector"),

// Vector was final, now sealed, and has no accessible constructor
ProblemFilters.exclude[AbstractClassProblem]("scala.collection.immutable.Vector"),
ProblemFilters.exclude[FinalMethodProblem]("scala.collection.immutable.Vector.take"),
ProblemFilters.exclude[FinalMethodProblem]("scala.collection.immutable.Vector.takeRight"),
ProblemFilters.exclude[FinalMethodProblem]("scala.collection.immutable.Vector.length"),
ProblemFilters.exclude[FinalMethodProblem]("scala.collection.immutable.Vector.drop"),
ProblemFilters.exclude[FinalMethodProblem]("scala.collection.immutable.Vector.appendedAll"),
ProblemFilters.exclude[FinalMethodProblem]("scala.collection.immutable.Vector.iterator"),
ProblemFilters.exclude[FinalMethodProblem]("scala.collection.immutable.Vector.slice"),
ProblemFilters.exclude[FinalMethodProblem]("scala.collection.immutable.Vector.dropRight"),
ProblemFilters.exclude[FinalMethodProblem]("scala.collection.immutable.Vector.head"),
ProblemFilters.exclude[FinalMethodProblem]("scala.collection.immutable.Vector.last"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.Vector.this"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.Vector.apply"),

////////////////////////////////////////////////////////////////////////////// Vector forward compatiblity

// Vector was final, now sealed, and has no accessible constructor
ProblemFilters.exclude[FinalClassProblem]("scala.collection.immutable.Vector"),

// Package-private features in the new implementation to ignore
ProblemFilters.exclude[MissingClassProblem]("scala.collection.immutable.Vector0"),
ProblemFilters.exclude[MissingClassProblem]("scala.collection.immutable.Vector0$"),
ProblemFilters.exclude[MissingClassProblem]("scala.collection.immutable.Vector1"),
ProblemFilters.exclude[MissingClassProblem]("scala.collection.immutable.Vector2"),
ProblemFilters.exclude[MissingClassProblem]("scala.collection.immutable.Vector3"),
ProblemFilters.exclude[MissingClassProblem]("scala.collection.immutable.Vector4"),
ProblemFilters.exclude[MissingClassProblem]("scala.collection.immutable.Vector5"),
ProblemFilters.exclude[MissingClassProblem]("scala.collection.immutable.Vector6"),
ProblemFilters.exclude[MissingClassProblem]("scala.collection.immutable.VectorSliceBuilder"),
ProblemFilters.exclude[MissingClassProblem]("scala.collection.immutable.VectorStepperBase"),
ProblemFilters.exclude[MissingClassProblem]("scala.collection.immutable.IntVectorStepper"),
ProblemFilters.exclude[MissingClassProblem]("scala.collection.immutable.LongVectorStepper"),
ProblemFilters.exclude[MissingClassProblem]("scala.collection.immutable.DoubleVectorStepper"),
ProblemFilters.exclude[MissingClassProblem]("scala.collection.immutable.AnyVectorStepper"),
ProblemFilters.exclude[MissingClassProblem]("scala.collection.immutable.VectorInline"),
ProblemFilters.exclude[MissingClassProblem]("scala.collection.immutable.VectorInline$"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorBuilder.getData"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorBuilder.initSparse"),
ProblemFilters.exclude[MissingClassProblem]("scala.collection.immutable.BigVector"),
ProblemFilters.exclude[MissingClassProblem]("scala.collection.immutable.NewVectorIterator"),
ProblemFilters.exclude[MissingClassProblem]("scala.collection.immutable.VectorStatics"),
ProblemFilters.exclude[MissingClassProblem]("scala.collection.immutable.VectorStatics$"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.Vector.appendedAll0"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.Vector.slice0"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.Vector.mapElems"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.Vector.mapElems1"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.Vector.append1IfSpace"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.Vector.tinyAppendLimit"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.Vector.vectorSlice"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.Vector.vectorSliceCount"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.Vector.vectorSlicePrefixLength"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.Vector.ioob"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.Vector.prefix1"),
ProblemFilters.exclude[MissingClassProblem]("scala.collection.immutable.VectorImpl"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.Vector.fillSparse"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorIterator.it"),
ProblemFilters.exclude[DirectMissingMethodProblem]("scala.collection.immutable.VectorIterator.it_=")
),
}

Expand Down
Loading

0 comments on commit b1dabca

Please sign in to comment.