/* 状態sに対応する階層グラフ構造Xを, Xに対して一意なIDとなるバイナリストリングへエンコードする. * エンコードしたバイナリストリングをsに割り当てる. * sに対応する階層グラフ構造Xへのメモリ参照が消えるため, 呼び出し側でメモリ管理を行う. * sが既にバイナリストリングを保持している場合は, そのバイナリストリングは破棄する. * (ただし, sが既に一意なIDとなるバイナリストリングへエンコード済みの場合は何もしない.) * 既に割当済みのバイナリストリングを破棄するため, * sをハッシュ表に登録した後の操作はMT-unsafeとなる. 要注意. */ void state_calc_mem_encode(State *s) { if (!is_encoded(s)) { LmnBinStr mid; if (state_mem(s)) { mid = lmn_mem_encode(state_mem(s)); } else if (state_binstr(s)) { LmnMembrane *m; m = lmn_binstr_decode(state_binstr(s)); mid = lmn_mem_encode(m); state_free_binstr(s); lmn_mem_free_rec(m); } else { lmn_fatal("unexpected."); } state_set_binstr(s, mid); s->hash = binstr_hash(state_binstr(s)); set_encoded(s); } }
/* 膜memを用いて状態sのハッシュ値を計算する. * canonicalをTRUEで入力した場合, バイナリストリングの設定まで行う */ void state_calc_hash(State *s, LmnMembrane *mem, BOOL canonical) { if (canonical) { state_set_binstr(s, lmn_mem_encode(mem)); s->hash = binstr_hash(state_binstr(s)); set_encoded(s); } else { s->hash = mhash(mem); } }
/* 状態srcと等価な状態を新たに構築して返す. * srcに階層グラフ構造が割り当てられている場合, その階層グラフ構造までを, * else: srcにバイナリストリングが割り当てられている場合, そのバイナリストリングを, * 複製(即ち, deep copy)する. * また, これに伴うencode関連の状態フラグもコピーするが, 状態空間構築のためのフラグはコピーしない. * なお, 引数memがNULLではない場合は, これをsrcに対応する階層グラフ構造として扱う. */ State *state_copy(State *src, LmnMembrane *mem) { #ifdef PROFILE if (lmn_env.profile_level >= 3 && mem) { profile_start_timer(PROFILE_TIME__STATE_COPY); } #endif State *dst = state_make_minimal(); if (!is_binstr_user(src) && !mem) { mem = state_mem(src); } if (mem) { state_set_mem(dst, lmn_mem_copy_ex(mem)); #ifdef PROFILE if (lmn_env.profile_level >= 3) { profile_add_space(PROFILE_SPACE__STATE_MEMBRANE, lmn_mem_space(mem)); } #endif } else if (state_binstr(src)) { state_set_binstr(dst, lmn_binstr_copy(state_binstr(src))); if (is_encoded(src)) { set_encoded(dst); } #ifdef PROFILE if (lmn_env.profile_level >= 3) { profile_add_space(PROFILE_SPACE__STATE_OBJECT, sizeof(struct State)); } #endif } dst->hash = src->hash; #ifdef PROFILE if (lmn_env.profile_level >= 3) { profile_add_space(PROFILE_SPACE__STATE_MEMBRANE, lmn_mem_space(mem)); profile_finish_timer(PROFILE_TIME__STATE_COPY); } #endif return dst; }
payment_address::payment_address(const std::string& encoded_address) : payment_address() { set_encoded(encoded_address); }