# This file was automatically generated by SWIG (http://www.swig.org).
# Version 3.0.12
#
# 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 as _swig_python_version_info
if _swig_python_version_info >= (2, 7, 0):
    def swig_import_helper():
        import importlib
        pkg = __name__.rpartition('.')[0]
        mname = '.'.join((pkg, '_slapi')).lstrip('.')
        try:
            return importlib.import_module(mname)
        except ImportError:
            return importlib.import_module('_slapi')
    _slapi = swig_import_helper()
    del swig_import_helper
elif _swig_python_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
        try:
            _mod = imp.load_module('_slapi', fp, pathname, description)
        finally:
            if fp is not None:
                fp.close()
        return _mod
    _slapi = swig_import_helper()
    del swig_import_helper
else:
    import _slapi
del _swig_python_version_info

try:
    _swig_property = property
except NameError:
    pass  # Python < 2.2 doesn't have 'property'.

try:
    import builtins as __builtin__
except ImportError:
    import __builtin__

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(self, class_type, name):
    if (name == "thisown"):
        return self.this.own()
    method = class_type.__swig_getmethods__.get(name, None)
    if method:
        return method(self)
    raise AttributeError("'%s' object has no attribute '%s'" % (class_type.__name__, name))


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

try:
    _object = object
    _newclass = 1
except __builtin__.Exception:
    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 __builtin__.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.


