Пример #1
0
/* 状態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);
  }
}
Пример #2
0
/* 膜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);
  }
}
Пример #3
0
/* 状態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;
}
Пример #4
0
		payment_address::payment_address(const std::string& encoded_address)
			: payment_address()
		{
			set_encoded(encoded_address);
		}