content: {-# LANGUAGE
    ForeignFunctionInterface,
    MultiParamTypeClasses,
    FunctionalDependencies,
    UndecidableInstances
    #-}
  -- | This module defines typeclasses to represent the relationships of an object-oriented inheritance hierarchy
  module LLVM.Internal.FFI.PtrHierarchy where
  
  import LLVM.Prelude
  
  import Foreign.Ptr
  
  -- | a class to represent safe casting of pointers to objects of descendant-classes to ancestor-classes.
  class DescendentOf a b where
      upCast :: Ptr b -> Ptr a
      upCast = castPtr
  
  -- | trivial casts
  instance {-# OVERLAPPING #-} DescendentOf a a where
      upCast = id
  
  -- | a class to represent direct parent-child relationships
  class ChildOf b c | c -> b
  
  -- | ancestor-descentant relationships are build out of parent-child relationships
  instance (DescendentOf a b, ChildOf b c) => DescendentOf a c
  
  -- | <http://llvm.org/doxygen/classllvm_1_1Value.html>
  data Value
  
  -- | <http://llvm.org/doxygen/classllvm_1_1Constant.html>
  data Constant
  
  instance ChildOf User Constant
  
  -- | <http://llvm.org/doxygen/classllvm_1_1GlobalValue.html>
  data GlobalValue
  
  instance ChildOf Constant GlobalValue
  
  -- | <http://llvm.org/doxygen/classllvm_1_1GlobalObject.html>
  data GlobalObject
  
  instance ChildOf GlobalValue GlobalObject
  
  -- | <http://llvm.org/doxygen/classllvm_1_1GlobalVariable.html>
  data GlobalVariable
  
  instance ChildOf GlobalObject GlobalVariable
  
  -- | <http://llvm.org/doxygen/classllvm_1_1GlobalAlias.html>
  data GlobalAlias
  
  instance ChildOf GlobalValue GlobalAlias
  
  -- | <http://llvm.org/doxygen/classllvm_1_1Function.html>
  data Function
  
  instance ChildOf GlobalObject Function
  
  -- | <http://llvm.org/doxygen/classllvm_1_1BasicBlock.html>
  data BasicBlock
  
  instance ChildOf Value BasicBlock
  
  -- | <http://llvm.org/doxygen/classllvm_1_1Argument.html>
  data Parameter
  
  instance ChildOf Value Parameter
  
  -- | <http://llvm.org/doxygen/classllvm_1_1Instruction.html>
  data Instruction
  
  instance ChildOf User Instruction
  
  -- | <http://llvm.org/doxygen/classllvm_1_1UnaryOperator.html>
  data UnaryOperator
  
  -- This is not strictly true in the sense of the definition of the typeclass
  -- ChildOf, since Instruction -> UnaryInstruction -> UnaryOperator is the
  -- derivation. However, we never need to reference UnaryInstruction methods
  -- so we can elide it. It is valid to cast a UnaryOperator* to an Instruction*.
  instance ChildOf Instruction UnaryOperator
  
  -- | <http://llvm.org/doxygen/classllvm_1_1BinaryOperator.html>
  data BinaryOperator
  
  instance ChildOf Instruction BinaryOperator
  
  -- | <http://llvm.org/doxygen/classllvm_1_1User.html>
  data User
  
  instance ChildOf Value User
  
  -- | <http://llvm.org/doxygen/classllvm_1_1MDNode.html>
  data MDNode
  
  instance ChildOf Metadata MDNode
  
  data MDTuple
  
  instance ChildOf MDNode MDTuple
  
  -- | <http://llvm.org/doxygen/classllvm_1_1MDString.html>
  data MDString
  
  instance ChildOf Metadata MDString
  
  -- | http://llvm.org/doxygen/classllvm_1_1ValueAsMetadata.html
  data MDValue
  
  instance ChildOf Metadata MDValue
  
  -- | https://llvm.org/doxygen/classllvm_1_1DIExpression.html
  data DIExpression
  
  instance ChildOf MDNode DIExpression
  
  -- | https://llvm.org/doxygen/classllvm_1_1DIGlobalVariableExpression.html
  data DIGlobalVariableExpression
  
  instance ChildOf MDNode DIGlobalVariableExpression
  
  -- | https://llvm.org/doxygen/classllvm_1_1DILocation.html
  data DILocation
  
  instance ChildOf MDNode DILocation
  
  -- | https://llvm.org/doxygen/classllvm_1_1DINode.html
  data DINode
  
  instance ChildOf MDNode DINode
  
  -- | https://llvm.org/doxygen/classllvm_1_1DIImportedEntity.html
  data DIImportedEntity
  
  instance ChildOf DINode DIImportedEntity
  
  -- | https://llvm.org/doxygen/classllvm_1_1DIObjCProperty.html
  data DIObjCProperty
  
  instance ChildOf DINode DIObjCProperty
  
  -- | https://llvm.org/doxygen/classllvm_1_1DISubrange.html
  data DISubrange
  
  instance ChildOf DINode DISubrange
  
  -- | https://llvm.org/doxygen/classllvm_1_1DIEnumerator.html
  data DIEnumerator
  
  instance ChildOf DINode DIEnumerator
  
  -- | https://llvm.org/doxygen/classllvm_1_1DIVariable.html
  data DIVariable
  
  instance ChildOf DINode DIVariable
  
  -- | https://llvm.org/doxygen/classllvm_1_1DILocalVariable.html
  data DILocalVariable
  
  instance ChildOf DIVariable DILocalVariable
  
  -- | https://llvm.org/doxygen/classllvm_1_1DIGlobalVariable.html
  data DIGlobalVariable
  
  instance ChildOf DIVariable DIGlobalVariable
  
  -- | https://llvm.org/doxygen/classllvm_1_1DITemplateParameter.html
  data DITemplateParameter
  
  instance ChildOf DINode DITemplateParameter
  
  -- | https://llvm.org/doxygen/classllvm_1_1DITemplateTypeParameter.html
  data DITemplateTypeParameter
  
  instance ChildOf DITemplateParameter DITemplateTypeParameter
  
  -- | https://llvm.org/doxygen/classllvm_1_1DITemplateValueParameter.html
  data DITemplateValueParameter
  
  instance ChildOf DITemplateParameter DITemplateValueParameter
  
  -- | https://llvm.org/doxygen/classllvm_1_1DIScope.html
  data DIScope
  
  instance ChildOf DINode DIScope
  
  -- | https://llvm.org/doxygen/classllvm_1_1DIModule.html
  data DIModule
  
  instance ChildOf DIScope DIModule
  
  -- | https://llvm.org/doxygen/classllvm_1_1DINamespace.html
  data DINamespace
  
  instance ChildOf DIScope DINamespace
  
  -- | https://llvm.org/doxygen/classllvm_1_1DIFile.html
  data DIFile
  
  instance ChildOf DIScope DIFile
  
  -- | https://llvm.org/doxygen/classllvm_1_1DICompileUnit.html
  data DICompileUnit
  
  instance ChildOf DIScope DICompileUnit
  
  -- | https://llvm.org/doxygen/classllvm_1_1DIType.html
  data DIType
  
  instance ChildOf DIScope DIType
  
  -- | https://llvm.org/doxygen/classllvm_1_1DIBasicType.html
  data DIBasicType
  
  instance ChildOf DIType DIBasicType
  
  -- | https://llvm.org/doxygen/classllvm_1_1DIDerivedType.html
  data DIDerivedType
  
  instance ChildOf DIType DIDerivedType
  
  -- | https://llvm.org/doxygen/classllvm_1_1DISubroutineType.html
  data DISubroutineType
  
  instance ChildOf DIType DISubroutineType
  
  -- | https://llvm.org/doxygen/classllvm_1_1DICompositeType.html
  data DICompositeType
  
  instance ChildOf DIType DICompositeType
  
  -- | https://llvm.org/doxygen/classllvm_1_1DILocalScope.html
  data DILocalScope
  
  instance ChildOf DIScope DILocalScope
  
  -- | <https://llvm.org/doxygen/classllvm_1_1DILexicalBlockBase.html>
  data DILexicalBlockBase
  
  instance ChildOf DILocalScope DILexicalBlockBase
  
  -- | <https://llvm.org/doxygen/classllvm_1_1DILexicalBlock.html>
  data DILexicalBlock
  
  instance ChildOf DILexicalBlockBase DILexicalBlock
  
  -- | <https://llvm.org/doxygen/classllvm_1_1DILexicalBlockFile.html>
  data DILexicalBlockFile
  
  instance ChildOf DILexicalBlockBase DILexicalBlockFile
  
  -- | <https://llvm.org/doxygen/classllvm_1_1DISubprogram.html>
  data DISubprogram
  
  instance ChildOf DILocalScope DISubprogram
  
  -- <https://llvm.org/doxygen/classllvm_1_1DIMacroNode.html>
  data DIMacroNode
  
  instance ChildOf MDNode DIMacroNode
  
  -- <https://llvm.org/doxygen/classllvm_1_1DIMacro.html>
  data DIMacro
  
  instance ChildOf DIMacroNode DIMacro
  
  -- <https://llvm.org/doxygen/classllvm_1_1DIMacroFile.html>
  data DIMacroFile
  
  instance ChildOf DIMacroNode DIMacroFile
  
  -- | <http://llvm.org/doxygen/classllvm_1_1NamedMDNode.html>
  data NamedMetadata
  
  -- | <http://llvm.org/doxygen/classllvm_1_1InlineAsm.html>
  data InlineAsm
  
  instance ChildOf Value InlineAsm
  
  -- | <http://llvm.org/doxygen/classllvm_1_1Type.html>
  data Type
  
  -- | <http://llvm.org/doxygen/classllvm_1_1Metadata.html>
  data Metadata
  
  -- | <http://www.llvm.org/docs/doxygen/html/classllvm_1_1MetadataAsValue.html>
  data MetadataAsVal
  
  instance ChildOf Value MetadataAsVal
  
  -- | <http://llvm.org/docs/doxygen/html/classllvm_1_1raw__ostream.html>
  data RawOStream
  
  -- | <http://llvm.org/docs/doxygen/html/classllvm_1_1raw__pwrite__stream.html>
  data RawPWriteStream
  
  instance ChildOf RawOStream RawPWriteStream
  
  -- | <https://llvm.org/doxygen/classllvm_1_1StringRef.html>
  data StringRef
  