モジュール変数でツリー

#module m_tree children, content

# modfunc set_tree_content str _content
    content = _content
    return

# defcfunc getaptr@m_tree var p1, local hspctx, local vptr
    mref hspctx, 68
    dupptr vptr, hspctx.207, 8, 4
    return vptr.1

# modinit str _content
    set_tree_content thismod, _content
    dimtype children, 5, 1
    return getaptr( thismod )

# deffunc _new_tree array tree, str _content
# define global new_tree( %1, %2 = "" ) _new_tree %1,%2
    newmod tree, m_tree, _content
    return stat

# defcfunc get_tree_content modvar m_tree@
    return content

# defcfunc get_tree_num_children modvar m_tree@
    return length( children )

# modfunc get_tree_child int index, var result
    if( index < 0 || index >= length( children ) ) : return 1
    if( varuse( children.index ) == 0 ) : return 1
    result = children.index
    return 0

# modfunc add_tree_child var child
    new_tree children
    children.stat = child
    return

# modfunc _show_tree str indent
# define global show_tree( %1, %2 = "" ) _show_tree %1, %2
    mes indent + content
    foreach children
        if( varuse( children.cnt ) ) {
            show_tree children.cnt, indent + "  "
        }
    loop
    return

# modfunc _tree_deep_clone var src, local src_child
    set_tree_content thismod, get_tree_content( src )

    repeat get_tree_num_children( src )
        get_tree_child src, cnt, src_child
        if stat : continue
        new_tree children, get_tree_content( src_child )

        _tree_deep_clone children.stat, src_child
    loop
    return

# deffunc tree_deep_clone array dest, var src
    new_tree dest
    _tree_deep_clone dest.stat, src
    return

#global

    new_tree tree, "root"

        new_tree tree_1, "1"
        add_tree_child tree, tree_1

        new_tree tree_2, "2"
        add_tree_child tree, tree_2

            new_tree tree_2_1, "2-1"
            add_tree_child tree_2, tree_2_1

                new_tree tree_2_1_1, "2-1-1"
                add_tree_child tree_2_1, tree_2_1_1

            new_tree tree_2_2, "2-2"
            add_tree_child tree_2, tree_2_2

    show_tree tree

#if 1
    tree2 = tree
#else
    tree_deep_clone tree2, tree
#endif

    set_tree_content tree_2_1, "2-1 *"

    mes "--------------------"
    show_tree tree2

参考

eller さんがこのモジュールを利用したツリービューを作成するモジュールを作られています。

応用例:

インフォメーション

公開日時
2007年12月29日 午前7時57分32秒
最終更新日時
2008年4月28日 午前9時47分46秒
カテゴリ
HSP