https://github.com/timdetering/Wintellect.PowerCollections
のBigListからIListのメンバーだけ移植しました。もともとの方ではノードの共有をすることがありますが、テキストエディタだとノートを共有する必要性がまったくないので、あえてこの機能は省きました。
EditorDemo ベンチマーク用デモ
TextReaderDemo コマンドベース簡易テキストエディタ。メモリーマップドファイルみたいなことをしているので、開くのは早いですが、上書き保存はできない仕様になってます。
FooProject.Collection BigListなどのクラスライブラリー
FooProject.Generator ソースコード生成用のライブラリー
UnitTest ユニットテスト
UnitTest_net481 .net standard 2.0向けユニットテスト
オンメモリーで動かしたい場合は普通に初期化すれば動きます。
using FooProject.Collection;
BigList<char> buf = new Foo.BigList<char>();
buf.Add('1');
ディスクに書き込みたい場合はISerializeData<FixedList>を実装したクラスを用意したうえで以下のようにすれば動きます。 詳しい実装の仕方はEditorDemo/StringBuffer.csを見ればわかります。
using FooProject.Collection;
using FooProject.Collection.DataStore;
BigList<char> buf = new Foo.BigList<char>();
var serializer = new StringBufferSerializer();
var dataStore = new DiskPinableContentDataStore<FixedList<char>>(serializer);
buf.CustomBuilder.DataStore = dataStore;
buf.Add('1');
行からバイトに変換するテーブルを作りたい場合はEditorDemo/Program.csを見てください。 BigRangeList()を初期化しているところ以降を読めばにテーブルの作り方や操作の仕方が書いてあります。
Ropeっぽいことをしたい場合、ImmutableListTestクラスを参照してください。
遅延読み込みを行いたい場合やメモリーマッピングしたい場合、LasyLoadListTestクラスやTextReaderDemo/Program.csを参照してください。
マーカーやシンタックスハイライト用のデーターを保持したい場合、以下のようなコードを書くことで実現できます。
using FooProject.Collection;
var list = new BigRleArray<char>();
list.AddRange('a',2);
list.AddRange('b',2);
foreach(var item in list.GetRangesAndClamp(1, 2))
{
if(item.Value == 'a')
{
//レンダリングを行う
}
}
詳しい使い方はUnitTest/BigRleArrayTest.csを参照してください。
また、Flags属性とBigRleArrayFlags属性をenumにつけることでビット操作用のクラスが〇〇Colltcionという名前で自動的に生成されます。 例えば、TestMarkerの場合、TestMarkerCollectionという名前になります。
using FooProject.Collection;
using FooProject.Generator;
namespace UnitTest
{
[BigRleArrayFlags]
[Flags]
public enum TestMarker
{
None = 0,
Important = 1,
}
class Foo
{
public void Run()
{
var collection = new TestMarkerCollection();
collection.Add(TestMarker.None, 1000);
collection.Add(TestMarker.Important, 1000);
collection.Set(10, 500, TestMarker.Important);
var r = collection.Get(0);
//取得して何かを行う
collection.Unset(10, 500, TestMarker.Important);
}
}
}
なお、enumはpublicでないと動作せず、インナークラスとして定義することはできません。 詳しい使い方はUnitTest/EnumWithFlagsGeneratorTest.csを参照してください。
LOH入りすることがありません。挿入と削除はListよりも早いです。その代わりノードの取得が少し遅くなることがあります。要素の列挙はListと同じ速度で動きます。
| 操作 | BigList |
|---|---|
| 取得 | O(1) or O(Log N) |
| 追加・挿入・削除 | O(Log N) |
| 列挙 | O(N) |
※BigRangeListやBigRleArrayの計算量はブロックサイズがデフォルトの場合、BigListとほぼ同じです。ブロックサイズがNとあまり変わらない場合、範囲を追加したり、挿入したり、削除する場合は O(Log N) + Mかかります。また、範囲に対応する要素番号を取得する場合はO(1) + O(Log M)もしくはO(Log N) + O(Log M)かかります。
MITライセンスに従ってください。 なお、一部ファイルコピー元のライセンスを守るものとします。 詳しいことはBigList.csなどにコピー元が書いてあるので、コピー元を参照してください。 商用利用に関してはかなり大きな制約があると解釈できるようなことが書いてあります。 また、BigRleArrayなどコードはGrokの支援で作成しています。