Goose  Artifact [8aaf506349]

Artifact 8aaf506349c78b268a4d77ab0f4199934c6d945468dc04ec437a5e3ffd607526:

  • File bs/eir/helpers.cpp — part of check-in [0db147f117] at 2024-09-15 20:24:31 on branch cir-ssa-refactor — Add clang format settings, reformat everything (user: achavasse size: 1483)

#include "eir.h"

namespace goose::eir
{
    Term ConcatenateVectorTerms( const Term& vector1, const Term& vector2 )
    {
        const auto& vec1 = *get< pvec >( vector1 );
        const auto& vec2 = *get< pvec >( vector2 );
        auto newVec = Vector::MakeConcat( vec1, vec2 );
        return TERM( make_shared< Vector >( move( newVec ) ) );
    }

    Term TakeVectorTerm( const Term& vectorTerm, size_t n )
    {
        const auto& vec = *get< pvec >( vectorTerm );
        auto newVec = vec.take( n );
        return TERM( make_shared< Vector >( move( newVec ) ) );
    }

    Term DropVectorTerm( const Term& vectorTerm, size_t n )
    {
        const auto& vec = *get< pvec >( vectorTerm );
        auto newVec = vec.drop( n );
        return TERM( make_shared< Vector >( move( newVec ) ) );
    }

    Term DuplicateVectorTerm( const Term& vectorTerm )
    {
        const auto& vec = *get< pvec >( vectorTerm );
        return TERM( make_shared< Vector >( vec ) );
    }

    bool AreVecLengthsCompatible( const VecLength& vl1, const VecLength& vl2 )
    {
        if( vl1.minLength() < vl2.minLength() )
            return vl1.isVariable();

        if( vl2.minLength() < vl1.minLength() )
            return vl2.isVariable();

        return true;
    }

    TermGen ForEachInVectorTerm( const Term& vectorTerm )
    {
        const auto& vec = *get< pvec >( vectorTerm );
        for( auto&& t : vec.terms() )
            co_yield &t;
    }
} // namespace goose::eir