"""Summary
"""
#
# Wrappers for Types in NVL
#
#

from ctypes import *


class WeldType(object):
    """Summary
    """

    def __str__(self):
        """Summary

        Returns:
            TYPE: Description
        """
        return "type"

    def __hash__(self):
        """Summary

        Returns:
            TYPE: Description
        """

        return hash(str(self))

    def __eq__(self, other):
        """Summary

        Args:
            other (TYPE): Description

        Returns:
            TYPE: Description
        """
        return hash(other) == hash(self)

    def __ne__(self, other):
        """Summary

        Args:
            other (TYPE): Description

        Returns:
            TYPE: Description
        """
        return hash(other) != hash(self)

    @property
    def ctype_class(self):
        """
        Returns a class representing this type's ctype representation.

        Raises:
            NotImplementedError: Description
        """
        raise NotImplementedError


class WeldChar(WeldType):
    """Summary
    """

    def __str__(self):
        """Summary

        Returns:
            TYPE: Description
        """
        return "i8"

    @property
    def ctype_class(self):
        """Summary

        Returns:
            TYPE: Description
        """
        return c_wchar_p


class WeldBit(WeldType):
    """Summary
    """

    def __str__(self):
        """Summary

        Returns:
            TYPE: Description
        """
        return "bool"

    @property
    def ctype_class(self):
        """Summary

        Returns:
            TYPE: Description
        """
        return c_bool


class WeldInt16(WeldType):
    """Summary
    """

    def __str__(self):
        """Summary

        Returns:
            TYPE: Description
        """
        return 'i16'

    @property
    def ctype_class(self):
        """Summary

        Returns:
            TYPE: Description
        """
        return c_int16


class WeldInt(WeldType):
    """Summary
    """

    def __str__(self):
        """Summary

        Returns:
            TYPE: Description
        """
        return "i32"

    @property
    def ctype_class(self):
        """Summary

        Returns:
            TYPE: Description
        """
        return c_int


class WeldLong(WeldType):
    """Summary
    """

    def __str__(self):
        """Summary

        Returns:
            TYPE: Description
        """
        return "i64"

    @property
    def ctype_class(self):
        """Summary

        Returns:
            TYPE: Description
        """
        return c_long


class WeldFloat(WeldType):
    """Summary
    """

    def __str__(self):
        """Summary

        Returns:
            TYPE: Description
        """
        return "f32"

    @property
    def ctype_class(self):
        return c_float


class WeldDouble(WeldType):
    """Summary
    """

    def __str__(self):
        """Summary

        Returns:
            TYPE: Description
        """
        return "f64"

    @property