import default

query predicate newExprs(NewExpr expr, string type, string sig, int size, int alignment, string form) {
  exists(Function allocator, Type allocatedType |
    expr.getAllocator() = allocator and
    sig = allocator.getFullSignature() and
    allocatedType = expr.getAllocatedType() and
    type = allocatedType.toString() and
    size = allocatedType.getSize() and
    alignment = allocatedType.getAlignment() and
    if expr.hasAlignedAllocation() then form = "aligned" else form = ""
  )
}

query predicate newArrayExprs(NewArrayExpr expr, string type, string sig, int size, int alignment, string form) {
  exists(Function allocator, Type elementType |
    expr.getAllocator() = allocator and
    sig = allocator.getFullSignature() and
    elementType = expr.getAllocatedElementType() and
    type = elementType.toString() and
    size = elementType.getSize() and
    alignment = elementType.getAlignment() and
    if expr.hasAlignedAllocation() then form = "aligned" else form = ""
  )
}

query predicate newExprDeallocators(NewExpr expr, string type, string sig, int size, int alignment, string form) {
  exists(Function deallocator, Type allocatedType |
    expr.getDeallocator() = deallocator and
    sig = deallocator.getFullSignature() and
    allocatedType = expr.getAllocatedType() and
    type = allocatedType.toString() and
    size = allocatedType.getSize() and
    alignment = allocatedType.getAlignment() and
    exists(string sized, string aligned |
      (if expr.hasAlignedDeallocation() then aligned = "aligned" else aligned = "") and
      (if expr.hasSizedDeallocation() then sized = "sized" else sized = "") and
      form = sized + " " + aligned
    )
  )
}

query predicate newArrayExprDeallocators(NewArrayExpr expr, string type, string sig, int size, int alignment, string form) {
  exists(Function deallocator, Type elementType |
    expr.getDeallocator() = deallocator and
    sig = deallocator.getFullSignature() and
    elementType = expr.getAllocatedElementType() and
    type = elementType.toString() and
    size = elementType.getSize() and
    alignment = elementType.getAlignment() and
    exists(string sized, string aligned |
      (if expr.hasAlignedDeallocation() then aligned = "aligned" else aligned = "") and
      (if expr.hasSizedDeallocation() then sized = "sized" else sized = "") and
      form = sized + " " + aligned
    )
  )
}

query predicate deleteExprs(DeleteExpr expr, string type, string sig, int size, int alignment, string form) {
  exists(Function deallocator, Type deletedType |
    expr.getDeallocator() = deallocator and
    sig = deallocator.getFullSignature() and
    deletedType = expr.getDeletedObjectType() and
    type = deletedType.toString() and
    size = deletedType.getSize() and
    alignment = deletedType.getAlignment() and
    exists(string sized, string aligned |
      (if expr.hasAlignedDeallocation() then aligned = "aligned" else aligned = "") and
      (if expr.hasSizedDeallocation() then sized = "sized" else sized = "") and
      form = sized + " " + aligned
    )
  )
}

query predicate deleteArrayExprs(DeleteArrayExpr expr, string type, string sig, int size, int alignment, string form) {
  exists(Function deallocator, Type elementType |
    expr.getDeallocator() = deallocator and
    sig = deallocator.getFullSignature() and
    elementType = expr.getDeletedElementType() and
    type = elementType.toString() and
    size = elementType.getSize() and
    alignment = elementType.getAlignment() and
    exists(string sized, string aligned |
      (if expr.hasAlignedDeallocation() then aligned = "aligned" else aligned = "") and
      (if expr.hasSizedDeallocation() then sized = "sized" else sized = "") and
      form = sized + " " + aligned
    )
  )
}
