diff options
| -rw-r--r-- | src/Partitioning.h | 20 | ||||
| -rw-r--r-- | test/unit/testPartitioning.cxx | 26 | 
2 files changed, 46 insertions, 0 deletions
diff --git a/src/Partitioning.h b/src/Partitioning.h index 11c64bc83..195daae9b 100644 --- a/src/Partitioning.h +++ b/src/Partitioning.h @@ -122,6 +122,26 @@ public:  		stepPartition++;  	} +	void InsertPartitions(T partition, const T *positions, size_t length) { +		if (stepPartition < partition) { +			ApplyStep(partition); +		} +		body->InsertFromArray(partition, positions, 0, length); +		stepPartition += static_cast<T>(length); +	} + +	void InsertPartitionsWithCast(T partition, const ptrdiff_t *positions, size_t length) { +		// Used for 64-bit builds when T is 32-bits +		if (stepPartition < partition) { +			ApplyStep(partition); +		} +		T *pInsertion = body->InsertEmpty(partition, length); +		for (size_t i = 0; i < length; i++) { +			pInsertion[i] = static_cast<T>(positions[i]); +		} +		stepPartition += static_cast<T>(length); +	} +  	void SetPartitionStartPosition(T partition, T pos) noexcept {  		ApplyStep(partition+1);  		if ((partition < 0) || (partition > body->Length())) { diff --git a/test/unit/testPartitioning.cxx b/test/unit/testPartitioning.cxx index 5a416f799..6abb6da44 100644 --- a/test/unit/testPartitioning.cxx +++ b/test/unit/testPartitioning.cxx @@ -95,6 +95,32 @@ TEST_CASE("Partitioning") {  		REQUIRE(8 == part.PositionFromPartition(2));  	} +	SECTION("InsertMultiple") { +		part.InsertText(0, 10); +		const Sci::Position positions[] { 2, 5, 7 }; +		part.InsertPartitions(1, positions, std::size(positions)); +		REQUIRE(4 == part.Partitions()); +		REQUIRE(0 == part.PositionFromPartition(0)); +		REQUIRE(2 == part.PositionFromPartition(1)); +		REQUIRE(5 == part.PositionFromPartition(2)); +		REQUIRE(7 == part.PositionFromPartition(3)); +		REQUIRE(10 == part.PositionFromPartition(4)); +	} + +	SECTION("InsertMultipleWithCast") { +		part.InsertText(0, 9); +		REQUIRE(1 == part.Partitions()); +		const ptrdiff_t positionsp[]{ 2, 4, 6, 8 }; +		part.InsertPartitionsWithCast(1, positionsp, std::size(positionsp)); +		REQUIRE(5 == part.Partitions()); +		REQUIRE(0 == part.PositionFromPartition(0)); +		REQUIRE(2 == part.PositionFromPartition(1)); +		REQUIRE(4 == part.PositionFromPartition(2)); +		REQUIRE(6 == part.PositionFromPartition(3)); +		REQUIRE(8 == part.PositionFromPartition(4)); +		REQUIRE(9 == part.PositionFromPartition(5)); +	} +  	SECTION("InsertReversed") {  		part.InsertText(0, 3);  		part.InsertPartition(1, 2);  | 
