string RSReflectionBase::genInitValue(const clang::APValue &Val, bool asBool) { stringstream tmp; switch (Val.getKind()) { case clang::APValue::Int: { llvm::APInt api = Val.getInt(); if(asBool) { tmp << ((api.getSExtValue() == 0) ? "false" : "true"); } else { // TODO: Handle unsigned possibly for C++ API. tmp << api.getSExtValue(); if (api.getBitWidth() > 32) { tmp << "L"; } } break; } case clang::APValue::Float: { llvm::APFloat apf = Val.getFloat(); llvm::SmallString<30> s; apf.toString(s); tmp << s.c_str(); if (&apf.getSemantics() == &llvm::APFloat::IEEEsingle) { if (s.count('.') == 0) { tmp << ".f"; } else { tmp << "f"; } } break; } case clang::APValue::ComplexInt: case clang::APValue::ComplexFloat: case clang::APValue::LValue: case clang::APValue::Vector: { slangAssert(false && "Primitive type cannot have such kind of initializer"); break; } default: { slangAssert(false && "Unknown kind of initializer"); } } return tmp.str(); }
string RSReflectionBase::genInitValue(const clang::APValue &Val, bool asBool) { stringstream tmp; switch (Val.getKind()) { case clang::APValue::Int: { llvm::APInt api = Val.getInt(); if(asBool) { tmp << ((api.getSExtValue() == 0) ? "false" : "true"); } else { tmp << api.getSExtValue(); if (api.getBitWidth() > 32) { tmp << "L"; } } break; } case clang::APValue::Float: { llvm::APFloat apf = Val.getFloat(); if (&apf.getSemantics() == &llvm::APFloat::IEEEsingle) { tmp << apf.convertToFloat() << "f"; } else { tmp << apf.convertToDouble(); } break; } case clang::APValue::ComplexInt: case clang::APValue::ComplexFloat: case clang::APValue::LValue: case clang::APValue::Vector: { slangAssert(false && "Primitive type cannot have such kind of initializer"); break; } default: { slangAssert(false && "Unknown kind of initializer"); } } return tmp.str(); }