"""Variables, arguments and argument transfer modes etc."""


# Values to represent argument transfer modes
InMode    = 1 # input-only argument
OutMode   = 2 # output-only argument
InOutMode = 3 # input-output argument
ModeMask  = 3 # bits to keep for mode


# Special cases for mode/flags argument
# XXX This is still a mess!
SelfMode   =  4+InMode  # this is 'self' -- don't declare it
ReturnMode =  8+OutMode # this is the function return value
ErrorMode  = 16+OutMode # this is an error status -- turn it into an exception
RefMode    = 32
ConstMode  = 64

class Variable:

    """A Variable holds a type, a name, a transfer mode and flags.

    Most of its methods call the correponding type method with the
    variable name.
    """

    def __init__(self, type, name = None, flags = InMode):
        """Call with a type, a name and flags.

        If name is None, it muse be set later.
        flags defaults to InMode.
        """
        self.type = type
        self.name = name
        self.flags = flags
        self.mode = flags & ModeMask

    def declare(self):
        """Declare the variable if necessary.

        If it is "self", it is not declared.
        """
        if self.flags == ReturnMode+RefMode:
            self.type.declare(self.name, reference=True)
        elif self.flags != SelfMode:
            self.type.declare(self.name)

    def getArgDeclarations(self, fullmodes=False):
        refmode = (self.flags & RefMode)
        constmode = False
        outmode = False
        if fullmodes:
            constmode = (self.flags & ConstMode)
            outmode = (self.flags & OutMode)
        return self.type.getArgDeclarations(self.name,
                reference=refmode, constmode=constmode, outmode=outmode)

    def getAuxDeclarations(self):
        return self.type.getAuxDeclarations(self.name)

    def getargsFormat(self):
        """Call the type's getargsFormatmethod."""
        return self.type.getargsFormat()

    def getargsArgs(self):
        """Call the type's getargsArgsmethod."""
        return self.type.getargsArgs(self.name)

    def getargsCheck(self):
        return self.type.getargsCheck(self.name)

    def getargsPreCheck(self):
        return self.type.getargsPreCheck(self.name)

    def passArgument(self):
        """Return the string required to pass the variable as argument.

        For "in" arguments, return the variable name.
        For "out" and "in out" arguments,
        return its name prefixed with "&".
        """
        if self.mode == InMode:
            return self.type.passInput(self.name)
        if self.mode & RefMode:
            return self.type.passReference(self.name)
        if self.mode in (OutMode, InOutMode):
            return self.type.passOutput(self.name)
        # XXX Shouldn't get here
        return "/*mode?*/" + self.type.passInput(self.name)

    def errorCheck(self):
        """Check for an error if necessary.

        This only generates code if the variable's mode is ErrorMode.
        """
        if self.flags == ErrorMode:
            self.type.errorCheck(self.name)

    def mkvalueFormat (self):
        """Call the type's mkvalueFormat method."""
        return self.type.mkvalueFormat()

    def mkvalueArgs(self):
        """Call the type's mkvalueArgs method."""
        return self.type.mkvalueArgs(self.name)

    def mkvaluePreCheck(self):
        return self.type.mkvaluePreCheck(self.name)

    def cleanup(self):
        """Call the type's cleanup method."""
        return self.type.cleanup(self.name)
