⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sequence.jam

📁 Boost provides free peer-reviewed portable C++ source libraries. We emphasize libraries that work
💻 JAM
字号:
# Copyright 2001, 2002, 2003 Dave Abrahams # Copyright 2006 Rene Rivera # Copyright 2002, 2003 Vladimir Prus # Distributed under the Boost Software License, Version 1.0. # (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) import assert ;import numbers ; import modules ;# Note that algorithms in this module execute largely in the caller's module# namespace, so that local rules can be used as function objects. Also note that# most predicates can be multi-element lists. In that case, all but the first# element are prepended to the first argument which is passed to the rule named# by the first element.# Return the elements e of $(sequence) for which [ $(predicate) e ] has a# non-null value.#rule filter ( predicate + : sequence * ){    local caller = [ CALLER_MODULE ] ;    local result ;    for local e in $(sequence)    {        if [ modules.call-in $(caller) : $(predicate) $(e) ]        {            result += $(e) ;        }    }    return $(result) ;}# Return a new sequence consisting of [ $(function) $(e) ] for each element e of# $(sequence).#rule transform ( function + : sequence * ){    local caller = [ CALLER_MODULE ] ;    local result ;    for local e in $(sequence)    {        result += [ modules.call-in $(caller) : $(function) $(e) ] ;    }    return $(result) ;}rule reverse ( s * ){    local r ;    for local x in $(s)    {        r = $(x) $(r) ;    }    return $(r) ;}rule less ( a b ){    if $(a) < $(b)    {        return true ;    }}# Insertion-sort s using the BinaryPredicate ordered.#rule insertion-sort ( s * : ordered * ){    if ! $(ordered)    {        return [ SORT $(s) ] ;    }    else     {                   local caller = [ CALLER_MODULE ] ;        ordered ?= sequence.less ;        local result = $(s[1]) ;        if $(ordered) = sequence.less        {            local head tail ;            for local x in $(s[2-])            {                head = ;                tail = $(result) ;                while $(tail) && ( $(tail[1]) < $(x) )                {                    head += $(tail[1]) ;                    tail = $(tail[2-]) ;                }                result = $(head) $(x) $(tail) ;            }        }        else        {            for local x in $(s[2-])            {                local head tail ;                tail = $(result) ;                while $(tail) && [ modules.call-in $(caller) : $(ordered) $(tail[1]) $(x) ]                {                    head += $(tail[1]) ;                    tail = $(tail[2-]) ;                }                result = $(head) $(x) $(tail) ;            }        }                return $(result) ;    }    }# Merge two ordered sequences using the BinaryPredicate ordered.#rule merge ( s1 * : s2 * : ordered * ){    ordered ?= sequence.less ;    local result__ ;    local caller = [ CALLER_MODULE ] ;    while $(s1) && $(s2)    {        if [ modules.call-in $(caller) : $(ordered) $(s1[1]) $(s2[1]) ]        {            result__ += $(s1[1]) ;            s1 = $(s1[2-]) ;        }        else if [ modules.call-in $(caller) : $(ordered) $(s2[1]) $(s1[1]) ]        {            result__ += $(s2[1]) ;            s2 = $(s2[2-]) ;        }        else         {                       s2 = $(s2[2-]) ;        }            }    result__ += $(s1) ;    result__ += $(s2) ;    return $(result__) ;}# Join the elements of s into one long string. If joint is supplied, it is used# as a separator.#rule join ( s * : joint ? ){    joint ?= "" ;    return $(s:J=$(joint)) ;}# Find the length of any sequence.#rule length ( s * ){    local result = 0 ;    for local i in $(s)    {        result = [ CALC $(result) + 1 ] ;    }    return $(result) ;}rule unique ( list * : stable ? ){    local result ;    local prev ;    if $(stable)    {        for local f in $(list)        {            if ! $(f) in $(result)            {                result += $(f) ;            }        }    }    else    {        for local i in [ SORT $(list) ]        {            if $(i) != $(prev)            {                result += $(i) ;            }            prev = $(i) ;        }    }    return $(result) ;}# Returns the maximum number in 'elements'. Uses 'ordered' for comparisons or# 'numbers.less' if none is provided.#rule max-element ( elements + : ordered ? ){    ordered ?= numbers.less ;    local max = $(elements[1]) ;    for local e in $(elements[2-])     {        if [ $(ordered) $(max) $(e) ]         {            max = $(e) ;        }    }    return $(max) ;           }# Returns all of 'elements' for which corresponding element in parallel list# 'rank' is equal to the maximum value in 'rank'.#rule select-highest-ranked ( elements * : ranks * ){    if $(elements)    {                local max-rank = [ max-element $(ranks) ] ;        local result ;        while $(elements)         {            if $(ranks[1]) = $(max-rank)            {                result += $(elements[1]) ;            }            elements = $(elements[2-]) ;            ranks = $(ranks[2-]) ;        }        return $(result) ;    }    }NATIVE_RULE sequence : select-highest-ranked ;rule __test__ ( ){    # Use a unique module so we can test the use of local rules.    module sequence.__test__    {        import assert ;        import sequence ;                local rule is-even ( n )        {            if $(n) in 0 2 4 6 8            {                return true ;            }        }        assert.result 4 6 4 2 8 : sequence.filter is-even : 1 4 6 3 4 7 2 3 8 ;        # Test that argument binding works.        local rule is-equal-test ( x y )        {            if $(x) = $(y)            {                return true ;            }        }        assert.result 3 3 3 : sequence.filter is-equal-test 3 : 1 2 3 4 3 5 3 5 7 ;        local rule append-x ( n )        {            return $(n)x ;        }        assert.result 1x 2x 3x : sequence.transform append-x : 1 2 3 ;        local rule repeat2 ( x )        {            return $(x) $(x) ;        }        assert.result 1 1 2 2 3 3 : sequence.transform repeat2 : 1 2 3 ;        local rule test-greater ( a b )        {            if $(a) > $(b)            {                return true ;            }        }        assert.result 1 2 3 4 5 6 7 8 9 : sequence.insertion-sort 9 6 5 3 8 7 1 2 4 ;        assert.result 9 8 7 6 5 4 3 2 1 : sequence.insertion-sort 9 6 5 3 8 7 1 2 4 : test-greater ;        assert.result 1 2 3 4 5 6 :  sequence.merge 1 3 5 : 2 4 6 ;        assert.result 6 5 4 3 2 1 :  sequence.merge 5 3 1 : 6 4 2 : test-greater ;        assert.result 1 2 3 : sequence.merge 1 2 3 : ;        assert.result 1 : sequence.merge 1 : 1 ;        assert.result foo-bar-baz : sequence.join foo bar baz : - ;        assert.result substandard : sequence.join sub stan dard ;        assert.result 3.0.1 : sequence.join 3.0.1 : - ;        assert.result 0 : sequence.length ;        assert.result 3 : sequence.length a b c ;        assert.result 17 : sequence.length 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 ;        assert.result 1 : sequence.length a ;        assert.result 10 : sequence.length a b c d e f g h i j ;        assert.result 11 : sequence.length a b c d e f g h i j k ;        assert.result 12 : sequence.length a b c d e f g h i j k l ;        local p2 = x ;        for local i in 1 2 3 4 5 6 7 8        {            p2 = $(p2) $(p2) ;        }        assert.result 256 : sequence.length $(p2) ;        assert.result 1 2 3 4 5 : sequence.unique 1 2 3 2 4 3 3 5 5 5 ;                        assert.result 5 : sequence.max-element 1 3 5 0 4 ;                assert.result e-3 h-3 : sequence.select-highest-ranked e-1 e-3 h-3 m-2 : 1 3 3 2 ;                assert.result 7 6 5 4 3 2 1 : sequence.reverse 1 2 3 4 5 6 7 ;    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -