# This file was automatically generated by SWIG (http://www.swig.org).
# Version 3.0.8
#
# Do not make changes to this file unless you know what you are doing--modify
# the SWIG interface file instead.





from sys import version_info
if version_info >= (2, 6, 0):
    def swig_import_helper():
        from os.path import dirname
        import imp
        fp = None
        try:
            fp, pathname, description = imp.find_module('_slapi', [dirname(__file__)])
        except ImportError:
            import _slapi
            return _slapi
        if fp is not None:
            try:
                _mod = imp.load_module('_slapi', fp, pathname, description)
            finally:
                fp.close()
            return _mod
    _slapi = swig_import_helper()
    del swig_import_helper
else:
    import _slapi
del version_info
try:
    _swig_property = property
except NameError:
    pass  # Python < 2.2 doesn't have 'property'.


def _swig_setattr_nondynamic(self, class_type, name, value, static=1):
    if (name == "thisown"):
        return self.this.own(value)
    if (name == "this"):
        if type(value).__name__ == 'SwigPyObject':
            self.__dict__[name] = value
            return
    method = class_type.__swig_setmethods__.get(name, None)
    if method:
        return method(self, value)
    if (not static):
        if _newclass:
            object.__setattr__(self, name, value)
        else:
            self.__dict__[name] = value
    else:
        raise AttributeError("You cannot add attributes to %s" % self)


def _swig_setattr(self, class_type, name, value):
    return _swig_setattr_nondynamic(self, class_type, name, value, 0)


def _swig_getattr_nondynamic(self, class_type, name, static=1):
    if (name == "thisown"):
        return self.this.own()
    method = class_type.__swig_getmethods__.get(name, None)
    if method:
        return method(self)
    if (not static):
        return object.__getattr__(self, name)
    else:
        raise AttributeError(name)

def _swig_getattr(self, class_type, name):
    return _swig_getattr_nondynamic(self, class_type, name, 0)


def _swig_repr(self):
    try:
        strthis = "proxy of " + self.this.__repr__()
    except Exception:
        strthis = ""
    return "<%s.%s; %s >" % (self.__class__.__module__, self.__class__.__name__, strthis,)

try:
    _object = object
    _newclass = 1
except AttributeError:
    class _object:
        pass
    _newclass = 0


class SwigPyIterator(_object):
    __swig_setmethods__ = {}
    __setattr__ = lambda self, name, value: _swig_setattr(self, SwigPyIterator, name, value)
    __swig_getmethods__ = {}
    __getattr__ = lambda self, name: _swig_getattr(self, SwigPyIterator, name)

    def __init__(self, *args, **kwargs):
        raise AttributeError("No constructor defined - class is abstract")
    __repr__ = _swig_repr
    __swig_destroy__ = _slapi.delete_SwigPyIterator
    __del__ = lambda self: None

    def value(self):
        return _slapi.SwigPyIterator_value(self)

    def incr(self, n=1):
        return _slapi.SwigPyIterator_incr(self, n)

    def decr(self, n=1):
        return _slapi.SwigPyIterator_decr(self, n)

    def distance(self, x):
        return _slapi.SwigPyIterator_distance(self, x)

    def equal(self, x):
        return _slapi.SwigPyIterator_equal(self, x)

    def copy(self):
        return _slapi.SwigPyIterator_copy(self)

    def next(self):
        return _slapi.SwigPyIterator_next(self)

    def __next__(self):
        return _slapi.SwigPyIterator___next__(self)

    def previous(self):
        return _slapi.SwigPyIterator_previous(self)

    def advance(self, n):
        return _slapi.SwigPyIterator_advance(self, n)

    def __eq__(self, x):
        return _slapi.SwigPyIterator___eq__(self, x)

    def __ne__(self, x):
        return _slapi.SwigPyIterator___ne__(self, x)

    def __iadd__(self, n):
        return _slapi.SwigPyIterator___iadd__(self, n)

    def __isub__(self, n):
        return _slapi.SwigPyIterator___isub__(self, n)

    def __add__(self, n):
        return _slapi.SwigPyIterator___add__(self, n)

    def __sub__(self, *args):
        return _slapi.SwigPyIterator___sub__(self, *args)
    def __iter__(self):
        return self
SwigPyIterator_swigregister = _slapi.SwigPyIterator_swigregister
SwigPyIterator_swigregister(SwigPyIterator)

class UIntVector(_object):
    __swig_setmethods__ = {}
    __setattr__ = lambda self, name, value: _swig_setattr(self, UIntVector, name, value)
    __swig_getmethods__ = {}
    __getattr__ = lambda self, name: _swig_getattr(self, UIntVector, name)
    __repr__ = _swig_repr

    def iterator(self):
        return _slapi.UIntVector_iterator(self)
    def __iter__(self):
        return self.iterator()

    def __nonzero__(self):
        return _slapi.UIntVector___nonzero__(self)

    def __bool__(self):
        return _slapi.UIntVector___bool__(self)

    def __len__(self):
        return _slapi.UIntVector___len__(self)

    def __getslice__(self, i, j):
        return _slapi.UIntVector___getslice__(self, i, j)

    def __setslice__(self, *args):
        return _slapi.UIntVector___setslice__(self, *args)

    def __delslice__(self, i, j):
        return _slapi.UIntVector___delslice__(self, i, j)

    def __delitem__(self, *args):
        return _slapi.UIntVector___delitem__(self, *args)

    def __getitem__(self, *args):
        return _slapi.UIntVector___getitem__(self, *args)

    def __setitem__(self, *args):
        return _slapi.UIntVector___setitem__(self, *args)

    def pop(self):
        return _slapi.UIntVector_pop(self)

    def append(self, x):
        return _slapi.UIntVector_append(self, x)

    def empty(self):
        return _slapi.UIntVector_empty(self)

    def size(self):
        return _slapi.UIntVector_size(self)

    def swap(self, v):
        return _slapi.UIntVector_swap(self, v)

    def begin(self):
        return _slapi.UIntVector_begin(self)

    def end(self):
        return _slapi.UIntVector_end(self)

    def rbegin(self):
        return _slapi.UIntVector_rbegin(self)

    def rend(self):
        return _slapi.UIntVector_rend(self)

    def clear(self):
        return _slapi.UIntVector_clear(self)

    def get_allocator(self):
        return _slapi.UIntVector_get_allocator(self)

    def pop_back(self):
        return _slapi.UIntVector_pop_back(self)

    def erase(self, *args):
        return _slapi.UIntVector_erase(self, *args)

    def __init__(self, *args):
        this = _slapi.new_UIntVector(*args)
        try:
            self.this.append(this)
        except Exception:
            self.this = this

    def push_back(self, x):
        return _slapi.UIntVector_push_back(self, x)

    def front(self):
        return _slapi.UIntVector_front(self)

    def back(self):
        return _slapi.UIntVector_back(self)

    def assign(self, n, x):
        return _slapi.UIntVector_assign(self, n, x)

    def resize(self, *args):
        return _slapi.UIntVector_resize(self, *args)

    def insert(self, *args):
        return _slapi.UIntVector_insert(self, *args)

    def reserve(self, n):
        return _slapi.UIntVector_reserve(self, n)

    def capacity(self):
        return _slapi.UIntVector_capacity(self)
    __swig_destroy__ = _slapi.delete_UIntVector
    __del__ = lambda self: None
UIntVector_swigregister = _slapi.UIntVector_swigregister
UIntVector_swigregister(UIntVector)


def SLsetWaiver(messageId, fileName=None, line=0, objectName=None):
    return _slapi.SLsetWaiver(messageId, fileName, line, objectName)
SLsetWaiver = _slapi.SLsetWaiver

def SLoverrideSeverity(messageId, severity):
    return _slapi.SLoverrideSeverity(messageId, severity)
SLoverrideSeverity = _slapi.SLoverrideSeverity

def SLregisterNewErrorType(messageId, text, secondLine):
    return _slapi.SLregisterNewErrorType(messageId, text, secondLine)
SLregisterNewErrorType = _slapi.SLregisterNewErrorType

def SLaddError(container, messageId, fileName, line, col, objectName):
    return _slapi.SLaddError(container, messageId, fileName, line, col, objectName)
SLaddError = _slapi.SLaddError

def SLaddErrorContext(prog, context, messageId, objectName, printColumn=False):
    return _slapi.SLaddErrorContext(prog, context, messageId, objectName, printColumn)
SLaddErrorContext = _slapi.SLaddErrorContext

def SLaddMLErrorContext(prog, context1, context2, messageId, objectName1, objectName2, printColumn=False):
    return _slapi.SLaddMLErrorContext(prog, context1, context2, messageId, objectName1, objectName2, printColumn)
SLaddMLErrorContext = _slapi.SLaddMLErrorContext

def SLaddMLError(container, messageId, fileName1, line1, col1, objectName1, fileName2, line2, col2, objectName2):
    return _slapi.SLaddMLError(container, messageId, fileName1, line1, col1, objectName1, fileName2, line2, col2, objectName2)
SLaddMLError = _slapi.SLaddMLError

def SLgetColumn(prog, context):
    return _slapi.SLgetColumn(prog, context)
SLgetColumn = _slapi.SLgetColumn

def SLgetText(prog, context):
    return _slapi.SLgetText(prog, context)
SLgetText = _slapi.SLgetText

def SLgetTokens(prog, context):
    return _slapi.SLgetTokens(prog, context)
SLgetTokens = _slapi.SLgetTokens

def SLgetParentContext(prog, context):
    return _slapi.SLgetParentContext(prog, context)
SLgetParentContext = _slapi.SLgetParentContext

def SLgetChildrenContext(prog, context):
    return _slapi.SLgetChildrenContext(prog, context)
SLgetChildrenContext = _slapi.SLgetChildrenContext

def SLgetRootNode(fC):
    return _slapi.SLgetRootNode(fC)
SLgetRootNode = _slapi.SLgetRootNode

def SLgetFile(*args):
    return _slapi.SLgetFile(*args)
SLgetFile = _slapi.SLgetFile

def SLgetSibling(fC, index):
    return _slapi.SLgetSibling(fC, index)
SLgetSibling = _slapi.SLgetSibling

def SLgetLine(*args):
    return _slapi.SLgetLine(*args)
SLgetLine = _slapi.SLgetLine

def SLgetName(fC, index):
    return _slapi.SLgetName(fC, index)
SLgetName = _slapi.SLgetName

def SLgetType(fC, index):
    return _slapi.SLgetType(fC, index)
SLgetType = _slapi.SLgetType

def SLgetChild(*args):
    return _slapi.SLgetChild(*args)
SLgetChild = _slapi.SLgetChild

def SLgetParent(*args):
    return _slapi.SLgetParent(*args)
SLgetParent = _slapi.SLgetParent

def SLgetAll(*args):
    return _slapi.SLgetAll(*args)
SLgetAll = _slapi.SLgetAll

def SLcollect(fC, parent, type):
    return _slapi.SLcollect(fC, parent, type)
SLcollect = _slapi.SLcollect

def SLcollectAll(*args):
    return _slapi.SLcollectAll(*args)
SLcollectAll = _slapi.SLcollectAll

def SLgetnModuleDefinition(design):
    return _slapi.SLgetnModuleDefinition(design)
SLgetnModuleDefinition = _slapi.SLgetnModuleDefinition

def SLgetnProgramDefinition(design):
    return _slapi.SLgetnProgramDefinition(design)
SLgetnProgramDefinition = _slapi.SLgetnProgramDefinition

def SLgetnPackageDefinition(design):
    return _slapi.SLgetnPackageDefinition(design)
SLgetnPackageDefinition = _slapi.SLgetnPackageDefinition

def SLgetnClassDefinition(design):
    return _slapi.SLgetnClassDefinition(design)
SLgetnClassDefinition = _slapi.SLgetnClassDefinition

def SLgetnTopModuleInstance(design):
    return _slapi.SLgetnTopModuleInstance(design)
SLgetnTopModuleInstance = _slapi.SLgetnTopModuleInstance

def SLgetModuleDefinition(design, index):
    return _slapi.SLgetModuleDefinition(design, index)
SLgetModuleDefinition = _slapi.SLgetModuleDefinition

def SLgetProgramDefinition(design, index):
    return _slapi.SLgetProgramDefinition(design, index)
SLgetProgramDefinition = _slapi.SLgetProgramDefinition

def SLgetPackageDefinition(design, index):
    return _slapi.SLgetPackageDefinition(design, index)
SLgetPackageDefinition = _slapi.SLgetPackageDefinition

def SLgetClassDefinition(design, index):
    return _slapi.SLgetClassDefinition(design, index)
SLgetClassDefinition = _slapi.SLgetClassDefinition

def SLgetTopModuleInstance(design, index):
    return _slapi.SLgetTopModuleInstance(design, index)
SLgetTopModuleInstance = _slapi.SLgetTopModuleInstance

def SLgetModuleName(module):
    return _slapi.SLgetModuleName(module)
SLgetModuleName = _slapi.SLgetModuleName

def SLgetModuleFile(module):
    return _slapi.SLgetModuleFile(module)
SLgetModuleFile = _slapi.SLgetModuleFile

def SLgetModuleType(module):
    return _slapi.SLgetModuleType(module)
SLgetModuleType = _slapi.SLgetModuleType

def SLgetModuleLine(module):
    return _slapi.SLgetModuleLine(module)
SLgetModuleLine = _slapi.SLgetModuleLine

def SLgetModuleFileContent(module):
    return _slapi.SLgetModuleFileContent(module)
SLgetModuleFileContent = _slapi.SLgetModuleFileContent

def SLgetModuleRootNode(module):
    return _slapi.SLgetModuleRootNode(module)
SLgetModuleRootNode = _slapi.SLgetModuleRootNode

def SLgetClassName(arg1):
    return _slapi.SLgetClassName(arg1)
SLgetClassName = _slapi.SLgetClassName

def SLgetClassFile(arg1):
    return _slapi.SLgetClassFile(arg1)
SLgetClassFile = _slapi.SLgetClassFile

def SLgetClassType(arg1):
    return _slapi.SLgetClassType(arg1)
SLgetClassType = _slapi.SLgetClassType

def SLgetClassLine(arg1):
    return _slapi.SLgetClassLine(arg1)
SLgetClassLine = _slapi.SLgetClassLine

def SLgetClassFileContent(arg1):
    return _slapi.SLgetClassFileContent(arg1)
SLgetClassFileContent = _slapi.SLgetClassFileContent

def SLgetClassRootNode(arg1):
    return _slapi.SLgetClassRootNode(arg1)
SLgetClassRootNode = _slapi.SLgetClassRootNode

def SLgetPackageName(arg1):
    return _slapi.SLgetPackageName(arg1)
SLgetPackageName = _slapi.SLgetPackageName

def SLgetPackageFile(arg1):
    return _slapi.SLgetPackageFile(arg1)
SLgetPackageFile = _slapi.SLgetPackageFile

def SLgetPackageType(arg1):
    return _slapi.SLgetPackageType(arg1)
SLgetPackageType = _slapi.SLgetPackageType

def SLgetPackageLine(arg1):
    return _slapi.SLgetPackageLine(arg1)
SLgetPackageLine = _slapi.SLgetPackageLine

def SLgetPackageFileContent(arg1):
    return _slapi.SLgetPackageFileContent(arg1)
SLgetPackageFileContent = _slapi.SLgetPackageFileContent

def SLgetPackageRootNode(arg1):
    return _slapi.SLgetPackageRootNode(arg1)
SLgetPackageRootNode = _slapi.SLgetPackageRootNode

def SLgetProgramName(arg1):
    return _slapi.SLgetProgramName(arg1)
SLgetProgramName = _slapi.SLgetProgramName

def SLgetProgramFile(arg1):
    return _slapi.SLgetProgramFile(arg1)
SLgetProgramFile = _slapi.SLgetProgramFile

def SLgetProgramType(arg1):
    return _slapi.SLgetProgramType(arg1)
SLgetProgramType = _slapi.SLgetProgramType

def SLgetProgramLine(arg1):
    return _slapi.SLgetProgramLine(arg1)
SLgetProgramLine = _slapi.SLgetProgramLine

def SLgetProgramFileContent(arg1):
    return _slapi.SLgetProgramFileContent(arg1)
SLgetProgramFileContent = _slapi.SLgetProgramFileContent

def SLgetProgramRootNode(arg1):
    return _slapi.SLgetProgramRootNode(arg1)
SLgetProgramRootNode = _slapi.SLgetProgramRootNode

def SLgetInstanceType(instance):
    return _slapi.SLgetInstanceType(instance)
SLgetInstanceType = _slapi.SLgetInstanceType

def SLgetInstanceModuleType(instance):
    return _slapi.SLgetInstanceModuleType(instance)
SLgetInstanceModuleType = _slapi.SLgetInstanceModuleType

def SLgetInstanceName(instance):
    return _slapi.SLgetInstanceName(instance)
SLgetInstanceName = _slapi.SLgetInstanceName

def SLgetInstanceFullPathName(instance):
    return _slapi.SLgetInstanceFullPathName(instance)
SLgetInstanceFullPathName = _slapi.SLgetInstanceFullPathName

def SLgetInstanceModuleName(instance):
    return _slapi.SLgetInstanceModuleName(instance)
SLgetInstanceModuleName = _slapi.SLgetInstanceModuleName

def SLgetInstanceDefinition(instance):
    return _slapi.SLgetInstanceDefinition(instance)
SLgetInstanceDefinition = _slapi.SLgetInstanceDefinition

def SLgetInstanceFileName(instance):
    return _slapi.SLgetInstanceFileName(instance)
SLgetInstanceFileName = _slapi.SLgetInstanceFileName

def SLgetInstanceFileContent(instance):
    return _slapi.SLgetInstanceFileContent(instance)
SLgetInstanceFileContent = _slapi.SLgetInstanceFileContent

def SLgetInstanceNodeId(instance):
    return _slapi.SLgetInstanceNodeId(instance)
SLgetInstanceNodeId = _slapi.SLgetInstanceNodeId

def SLgetInstanceLine(instance):
    return _slapi.SLgetInstanceLine(instance)
SLgetInstanceLine = _slapi.SLgetInstanceLine

def SLgetnInstanceChildren(instance):
    return _slapi.SLgetnInstanceChildren(instance)
SLgetnInstanceChildren = _slapi.SLgetnInstanceChildren

def SLgetInstanceChildren(instance, i):
    return _slapi.SLgetInstanceChildren(instance, i)
SLgetInstanceChildren = _slapi.SLgetInstanceChildren

def SLgetInstanceParent(instance):
    return _slapi.SLgetInstanceParent(instance)
SLgetInstanceParent = _slapi.SLgetInstanceParent
# This file is compatible with both classic and new-style classes.


