std::vector<void*> StructTypeInterface::get(void* storage) { std::vector<void*> result; unsigned count = memberTypes().size(); for (unsigned i=0; i<count; ++i) result.push_back(get(storage, i)); return result; }
AnyReferenceVector StructTypeInterface::values(void* storage) { std::vector<TypeInterface*> types = memberTypes(); std::vector<void*> values = get(storage); AnyReferenceVector result; for (unsigned i=0; i<types.size(); ++i) result.push_back(AnyReference(types[i], values[i])); return result; }
// Get the LLVM type for an IR type. llvm::Type* CgTypes::Convert(const IRType* ty) const { IRTypeKind kind = ty->GetKind(); switch (kind) { case kIRVoidTy: case kIRBoolTy: case kIRFloatTy: case kIRPointTy: case kIRVectorTy: case kIRNormalTy: case kIRColorTy: case kIRMatrixTy: case kIRStringTy: case kIRShaderTy: return mBasicTypes[kind]; case kIRArrayTy: { // TODO: codegen support resizable arrays. const IRArrayType* arrayTy = UtStaticCast<const IRArrayType*>(ty); assert(arrayTy->GetLength() >= 0 && "No codegen support for resizable arrays"); llvm::Type* elemTy = Convert(arrayTy->GetElementType()); return llvm::ArrayType::get(elemTy, arrayTy->GetLength()); } case kIRStructTy: { const IRStructType* structTy = UtStaticCast<const IRStructType*>(ty); unsigned int numMembers = structTy->GetNumMembers(); std::vector<llvm::Type*> memberTypes(numMembers); for (unsigned int i = 0; i < numMembers; ++i) memberTypes[i] = Convert(structTy->GetMemberType(i)); return llvm::StructType::get(*GetContext(), llvm::ArrayRef<llvm::Type*>(memberTypes)); } case kIRNumTypeKinds: assert(false && "Invalid IR type"); } assert(false && "Unimplemented kind of IR type"); return llvm::Type::getFloatTy(*GetContext()); }