def get( noVariables ):
    variables = []
    for ix in range( 0, noVariables ):
        if len( variableDeque ) > 0:
            variables.append( variableDeque.popleft() )
        else:
            variables.append( Block.createMatlabVariable( "ix" ) )
    return variables
def performOperation( varMap, template, threshold = 4 ):

    if template[-1] != "\n":
        template += "\n"
    
    # THE STRING VALUE RETURNED (FOR THE mfile2SFC COMPILER)
    retval = ''
    
    namedArrayListMap = {}  # MAPS TEMPLATE TOKENS TO LIST OF NAMED ARRAYS
    namedArrayOffsets = {}  # THE OFFSET INTO EACH NAMED ARRAY LIST
    
    prototypeArrayList = None
    missingType = []
    
    # GET NamedArrayList FOR EVERY STRUCTURE MEMBER OF THE VARIABLES IN varMap
    for ( key, value ) in varMap.items():
        namedArrayList = getNamedArrayList( value )
        namedArrayListMap[ key ] = namedArrayList
        if namedArrayList:
            if not prototypeArrayList:
                prototypeArrayList = namedArrayList
        else:
            missingType.append( key )
        namedArrayOffsets[ key ] = 0

	# IF ONE OR MORE VARIABLES IN varMap HAVE NO TYPE (I.E. AN EMPTY namedArrayList)
	# THEY ARE GIVEN THE FLATTENED TYPE OF THE FIRST VARIABLE THAT HAS A TYPE
    if missingType:
        if not prototypeArrayList:
            return ""
        totalElements = 0
        basicType = None
        for namedArray in prototypeArrayList:
            totalElements += namedArray.getNoElements()
            if not basicType:
                basicType = namedArray.getArray().getElementType()
        newType = Array( totalElements, basicType )
        for key in missingType:
            value = varMap[ key ]
            if type( value ) in ( list, tuple ):
                for item in value:
                    item.type = newType
            else:
                value.type = newType
            namedArrayListMap[ key ] = getNamedArrayList( value )
            

	# THE FOLLOWING CODE MAPS A SINGLE INPUT TO MULTIPLE OUTPUTS
    maxItems = 0
    totalItemsMap = {}
    singletonNamedArrayKeys = []
    for ( key, namedArrayList ) in namedArrayListMap.items():
        itemCount = 0
        for namedArray in namedArrayList:
            itemCount += namedArray.getNoElements()
        if itemCount > maxItems:
            maxItems = itemCount
        if itemCount == 1:
            singletonNamedArrayKeys.append( key )
    
    if maxItems > 1:
        for key in singletonNamedArrayKeys:
            namedArrayListMap[ key ] = [ namedArrayListMap[ key ][0] ]*maxItems
            

    arrayCoordinator = ArrayCoordinator()
    
    initializations = ''
    for ( key, value ) in namedArrayListMap.items():
        initializations += arrayCoordinator.addNamedArray( key, value[ 0 ] )
        
    loopVar = Block.createMatlabVariable( "ix" );
    
    notDone = True
    while notDone:
        items = arrayCoordinator.getSpan()
        if items < threshold:
            for ix in range( 0, items ):
                nameMap = dict()
                for key in namedArrayListMap.keys():
                    nameMap[ key ] = arrayCoordinator.genElem( key )
                arrayCoordinator.update( 1 )
                templateInstance = Template( template, [nameMap] )
                retval += templateInstance.respond()
        else:
            retval += initializations
            nameMap = dict()
            for key in namedArrayListMap.keys():
                nameMap[ key ] = arrayCoordinator.genDeref( key )
            arrayCoordinator.update( items )

            retval += loopVar + " = 0\n"
            retval += "while " + loopVar + " < " + str( items ) + "\n"
            templateInstance = Template( template, [nameMap] )
            retval += "    " + templateInstance.respond()
            retval += arrayCoordinator.genIncrements( '    ' )
            retval += "    " + loopVar + " = " + loopVar + " + 1\n"
            retval += "end\n"
            
        initializations = ''
        termArrays = arrayCoordinator.getTermArrays()        
        for key in termArrays:
            namedArrayList = namedArrayListMap[ key ]
            namedArrayOffsets[ key ] += 1
            offset = namedArrayOffsets[ key ]
            if offset >= len( namedArrayList ):
                notDone = False
                break
            initializations += arrayCoordinator.addNamedArray( key, namedArrayList[ offset ] )

    return retval