290                         const llvm::Type* 
const targetType,
 
  291                         const std::string& twine = 
"")
 
  294#define BIND_ARITHMETIC_CAST_OP(Function, Twine) \ 
  295    std::bind(&Function, \ 
  296        std::placeholders::_1, \ 
  297        std::placeholders::_2, \ 
  298        std::placeholders::_3, \ 
  301    if (targetType->isDoubleTy()) {
 
  310    else if (targetType->isFloatTy()) {
 
  319    else if (targetType->isHalfTy()) {
 
  328    else if (targetType->isIntegerTy(64)) {
 
  337    else if (targetType->isIntegerTy(32)) {
 
  346    else if (targetType->isIntegerTy(16)) {
 
  355    else if (targetType->isIntegerTy(8)) {
 
  364    else if (targetType->isIntegerTy(1)) {
 
  374#undef BIND_ARITHMETIC_CAST_OP 
 
  508          llvm::Type* targetElementType,
 
  509          llvm::IRBuilder<>& builder)
 
  511    OPENVDB_ASSERT(targetElementType && (targetElementType->isIntegerTy() ||
 
  512        targetElementType->isFloatingPointTy()) &&
 
  513        "Target element type is not a scalar type");
 
  514    OPENVDB_ASSERT(ptrToArray && ptrToArray->getType()->isPointerTy() &&
 
  515        "Input to arrayCast is not a pointer type.");
 
  517    llvm::Type* arrayType = ptrToArray->getType()->getContainedType(0);
 
  518    OPENVDB_ASSERT(arrayType && llvm::isa<llvm::ArrayType>(arrayType));
 
  521    llvm::Type* sourceElementType = arrayType->getArrayElementType();
 
  522    OPENVDB_ASSERT(sourceElementType && (sourceElementType->isIntegerTy() ||
 
  523        sourceElementType->isFloatingPointTy()) &&
 
  524        "Source element type is not a scalar type");
 
  526    if (sourceElementType == targetElementType) 
return ptrToArray;
 
  530    const size_t elementSize = arrayType->getArrayNumElements();
 
  531    llvm::Value* targetArray =
 
  533            llvm::ArrayType::get(targetElementType, elementSize));
 
  535    for (
size_t i = 0; i < elementSize; ++i) {
 
  538        source = 
ir_load(builder, source);
 
  539        source = llvmCastFunction(builder, source, targetElementType);
 
  540        builder.CreateStore(source, target);