* 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化しているものに関しては、それより下が完全に同じなので中まで比較する必要がない。

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS