parameters: (clean_lines, linenum, typenames)
return_statement: return line.find('&&') < 0
docstring: Check if RValue reference is allowed on a particular line.
  
    Args:
      clean_lines: A CleansedLines instance containing the file.
      linenum: The number of the line to check.
      typenames: set of type names from template-argument-list.
    Returns:
      True if line is within the region where RValue references are allowed.
docstring_summary: Check if RValue reference is allowed on a particular line.
docstring_tokens: Check if RValue reference is allowed on a particular line .
function: def IsRValueAllowed(clean_lines, linenum, typenames):
    """Check if RValue reference is allowed on a particular line.
  
    Args:
      clean_lines: A CleansedLines instance containing the file.
      linenum: The number of the line to check.
      typenames: set of type names from template-argument-list.
    Returns:
      True if line is within the region where RValue references are allowed.
    """
    # Allow region marked by PUSH/POP macros
    for i in xrange(linenum, 0, -1):
      line = clean_lines.elided[i]
      if Match(r'GOOGLE_ALLOW_RVALUE_REFERENCES_(?:PUSH|POP)', line):
        if not line.endswith('PUSH'):
          return False
        for j in xrange(linenum, clean_lines.NumLines(), 1):
          line = clean_lines.elided[j]
          if Match(r'GOOGLE_ALLOW_RVALUE_REFERENCES_(?:PUSH|POP)', line):
            return line.endswith('POP')
  
    # Allow operator=
    line = clean_lines.elided[linenum]
    if Search(r'\boperator\s*=\s*\(', line):
      return IsDeletedOrDefault(clean_lines, linenum)
  
    # Allow constructors
    match = Match(r'\s*(?:[\w<>]+::)*([\w<>]+)\s*::\s*([\w<>]+)\s*\(', line)
    if match and match.group(1) == match.group(2):
      return IsDeletedOrDefault(clean_lines, linenum)
    if Search(r'\b(?:explicit|inline)\s+[\w<>]+\s*\(', line):
      return IsDeletedOrDefault(clean_lines, linenum)
  
    if Match(r'\s*[\w<>]+\s*\(', line):
      previous_line = 'ReturnType'
      if linenum > 0:
        previous_line = clean_lines.elided[linenum - 1]
      if Match(r'^\s*$', previous_line) or Search(r'[{}:;]\s*$', previous_line):
        return IsDeletedOrDefault(clean_lines, linenum)
  
    # Reject types not mentioned in template-argument-list
    while line:
      match = Match(r'^.*?(\w+)\s*&&(.*)$', line)
      if not match:
        break
      if match.group(1) not in typenames:
        return False
      line = match.group(2)
  
    # All RValue types that were in template-argument-list should have
    # been removed by now.  Those were allowed, assuming that they will
    # be forwarded.
    #
    # If there are no remaining RValue types left (i.e. types that were
    # not found in template-argument-list), flag those as not allowed.
    return line.find('&&') < 0
function_tokens: def IsRValueAllowed ( clean_lines , linenum , typenames ) : # Allow region marked by PUSH/POP macros for i in xrange ( linenum , 0 , - 1 ) : line = clean_lines . elided [ i ] if Match ( r'GOOGLE_ALLOW_RVALUE_REFERENCES_(?:PUSH|POP)' , line ) : if not line . endswith ( 'PUSH' ) : return False for j in xrange ( linenum , clean_lines . NumLines ( ) , 1 ) : line = clean_lines . elided [ j ] if Match ( r'GOOGLE_ALLOW_RVALUE_REFERENCES_(?:PUSH|POP)' , line ) : return line . endswith ( 'POP' ) # Allow operator= line = clean_lines . elided [ linenum ] if Search ( r'\boperator\s*=\s*\(' , line ) : return IsDeletedOrDefault ( clean_lines , linenum ) # Allow constructors match = Match ( r'\s*(?:[\w<>]+::)*([\w<>]+)\s*::\s*([\w<>]+)\s*\(' , line ) if match and match . group ( 1 ) == match . group ( 2 ) : return IsDeletedOrDefault ( clean_lines , linenum ) if Search ( r'\b(?:explicit|inline)\s+[\w<>]+\s*\(' , line ) : return IsDeletedOrDefault ( clean_lines , linenum ) if Match ( r'\s*[\w<>]+\s*\(' , line ) : previous_line = 'ReturnType' if linenum > 0 : previous_line = clean_lines . elided [ linenum - 1 ] if Match ( r'^\s*$' , previous_line ) or Search ( r'[{}:;]\s*$' , previous_line ) : return IsDeletedOrDefault ( clean_lines , linenum ) # Reject types not mentioned in template-argument-list while line : match = Match ( r'^.*?(\w+)\s*&&(.*)$' , line ) if not match : break if match . group ( 1 ) not in typenames : return False line = match . group ( 2 ) # All RValue types that were in template-argument-list should have # been removed by now.  Those were allowed, assuming that they will # be forwarded. # # If there are no remaining RValue types left (i.e. types that were # not found in template-argument-list), flag those as not allowed. return line . find ( '&&' ) < 0