* Essen Object Management Library #0002 -(by [[K]], 2017.02.20) ** レイヤ構造 -Essen:言語レイヤ --EOMLの範囲外 -ObjSys(OS) : オブジェクトの管理をするレイヤ --階層構造など -ValSys(VS) : 値の管理をするレイヤ --可変長なデータを扱いやすくする&メモリ管理&重複管理 ** 基本型 -通常データ: --intとかdoubleとか文字列型とか、まあなんでも。 --サイズが規定できればよい。型のタイプも記述する。 --可変長でもあってもいい。 -メタデータ: --通常データと似た扱いを受けるが、多少の追加サポートがある。 --(dir) (memberTable) (namelessDir) ** ValSys typedef struct Val_ { unsigned int linkCount; // プライベートの時は常に1 unsigned int hash; unsigned int flags; unsigned int siz, siz1; // siz1まではとりあえずメモリを確保してある unsigned int mini[4]; struct Val_ *typ; struct Val_ *link[2]; // 内部管理用であって、ObjSysやEssenはこれを使えない void *p; } Val; -flags: --VS_F_PUB : パブリック --VS_F_MAL : pはmallocで確保した領域を指している(=解放時にはfreeしてほしい) --VS_F_VHS : hashの値はvalidである --VS_F_EXT : pは外部のメモリ域を指している(ValSysは寿命を管理しない) --VS_F_RDO : リードオンリー属性 -データの状態にはpriとpubがある。プライベートとパブリック。 --プライベートの時は、データを共有しないので値を直接書き換えてよい。最初にアロケートした時はプライベートになる。 --パブリックの時は書き換えてはいけない。書き換えたければプライベートに戻してから書きかえる。書き換え後にパブリックに戻してよい。 --プライベートだったデータをパブリックに切り替えるとき、Valのアドレスが変化する可能性がある。またパブリックだったデータをプライベートに切り替えるときも、Valのアドレスが変化する可能性がある。しかしそれ以外の操作でアドレスが変化することはない。 ** ObjSys typedef struct Obj_ { Val *val; Val *parent; unsigned int flags; unsigned int sign; // シグネチャ これがあるから消されて再利用されたときに気付くことができる 常に非零 unsigned int linkCount; // 自分の子がこのObjを指している回数(子以外でもここを参照しているものがあれば数える) unsigend int psign; // parentのsign } Obj; -flags: --OS_F_DTY : データは改変された(これは必要だろうか?) -Valはプライべートにするかパブリックにするかでアドレスが変わるので、それを解消するために用意されるレイヤがObjSys。Objのアドレスはその変数をdelするまでずっと変わらずに存在する。 --変数名を変更しても、変数のパスを変更しても(変数を別のフォルダに移動させても)、Objのアドレスは一切変わらない。 -ルート以外のObjは一つの親を必ず持つ。 -リンクカウントが0になってもObjを消さないほうが高速だろうと思われる。 --Objのメモリを節約する観点では、こまめに消したほうがいいのだが、Objを消す最大の目的はパブリックにさせるためなので、Objのメモリを節約することは考えなくていいと思う。 ** dir (dir) { [p(Val:typ)] [n] [p(Obj), sign] [p(Obj), sign] [p(Obj), sign] ... } -それぞれのsignが0のときは、ObjではなくValへのポインタになる。 -nはsignが0ではない個数。 --nが0になったら、パブリックにできる --パブリックにしたら、親に対して「signを0にできますよ」と伝える。 -フラグがtyp側にあるといいかもしれない。 --メンバ名ソート済みフラグ、メンバ名ソート推奨フラグ、メンバ名のユニークを強制するフラグ ** メモ -[1] 高速にdirをコピーしたい --dirのポインタをすべてVal化してコピーすればよさそう(再帰的に) --プライベートが含まれている部分についてはObjのままにして頑張って比較する -[2] できるだけ高速にdirを比較したい --Val化しているものに関しては、それより下が完全に同じなので中まで比較する必要がない。